Inner Class

K

kneitzel

Gast
Ich denke, dass sich dies nicht pauschal beantworten lässt.

Wenn eine Klasse nur innerhalb einer anderen Klasse benutzt werden soll / kann, dann ist es ein guter Programmierstil. Dadurch erreiche ich die Sichtbarkeit, die ich möchte.
Hier wäre ein Beispiel ein abstrakter Datentyp. Der speichert die Daten intern in Knoten oder Nodes. Aber nach außen tritt nie so eine Instanz auf....

Sobald ich etwas habe, das auch nach außen auftritt, dann ist es durchaus strittig. Das Beispiel wäre hier eine Enumeration. Die Enumeration benutzt etwas, das spezifisch für die äußere Klasse ist. Dann wird durch die Platzierung in der äußeren Klasse deutlich, dass diese genau zu dieser gehört, denn man greift dann ja OuterClass.InnerEnum.SOME_VALUE drauf zu. Macht aber wirklich nur Sinn, wenn es nur in dem Zusammenhang genutzt werden kann. Sobald ich von der OuterClass erbe sieht es schon weniger schön aus ...

Und es ist eine Katastrophe, wenn etwas hat, das auch außerhalb und unabhängig von der Klasse etwas verwenden kann ...

Und ganz nebenbei: Bei den anonymen Klassen handelt es sich streng genommen auch um inner classes. Da ist die Verwendung von außen nicht möglich, da ja anonym. Hier wäre vom Design her nur zu überlegen, ob das nicht besser geht. Da kommt man dann ggf., zu Lambda Ausdrücken und so ...
 

mrBrown

Super-Moderator
Mitarbeiter
Java:
class OuterClass {
    
    static class NestedClass {
        //kein Zugriff auf OuterClass.this
    }
    
    class InnerClass {
        //Zugriff auf OuterClass.this
    }
    
}
 

White_Fox

Top Contributor
Ich sags mal so: Wenn die Verwendung von inneren Klassen grundsätzlich schlechter Stil wäre, dann würde es sie wahrscheinlich nicht geben. Zumindest nicht in Java.
Und wie kommst du darauf, daß deren Verwendung schlechter Stil wäre?

Und es gibt durchaus Anwendungsfälle, wo innere Klassen sinnvoll sind. Wenn du innerhalb einer Klasse eine Aufgabe mit Threads lösen willst, und diese Threads ausschließlich in dieser Klasse sinnvoll zu gebrauchen sind, kann es durchaus sinnvoll sein die Threads als innere Klassen zu schreiben.

Denn einerseits ist mit der Threadklasse außerhalb der Klasse, in der sie benutzt wird, nichts anzufangen. Es ist (fast? Ich hüte mich ja gerne vor Absolutismen) nie schlechter Stil, die Sichtbarkeit von was auch immer maximal einzuschränken außer dort, wo Sichtbarkeit notwendig ist.
Im Beispiel der Threadklasse könntest du diese wenigstens package private deklarieren, dann ist sie nur innerhalb des Pakets sichtbar. Aber wozu müssen die anderen Klassen wissen können, daß es diese Klasse gibt?

Und andererseits besteht zwischen der Threadklasse und der Klasse, die sie verwendet, eine recht enge Bindung, nicht selten gehört der Code eigetlich zusammen. Nicht selten wird eine Aufgabe erstmal ohne Multithreading gelöst und wird später erst so optimiert, dann besteht die Threadklasse im Wesentlichen aus Code, der mal von der äußeren Klasse ausgeführt wurde.
Und da würde ich es als zweckmäßig ansehen, den Code beider Klassen in einer Datei zu haben.


Mal etwas ganz Grundsätzliches: Vermeide das Denken in Dogmen, denn das hat mit Denken nichts zu tun. Überlege dir lieber erst, was du erreichen willst und danach, ob dich etwas weiterbringt. Wenn jemand sagt, daß etwas grundsätzlich irgendwie sein müsse, der hat in der Regel grundsätzlich unrecht.
Viele Programmierer legen sehr viel Wert auf gut lesbaren und rasch verständlichen Programmcode. Nicht selten aus der (meist schmerzlichen) Erfahrung heraus, nach einem halben Jahr nicht mehr zu wissen was man damals eigentlich gemacht hat. Anderen ist das wiederum völlig egal.
Nun ist die Frage: Wer von beiden hat Recht?
Bei guten Leuten (oder sagen wir besser: die, die ich für gut halte) läuft so ein Streit recht schnell ins Leere weil einer von beiden sagt: Schön daß das für dich so funktioniert - ich habe aber andere Prioritäten, hier klappt das so nicht.
 
B

BestGoalkeeper

Gast
Naja, er hat nach inner class gefragt, das ist immer die innere Mitgliedsklasse...

IdR brauchst du aber nur die NestedClass...
 
B

BestGoalkeeper

Gast
//kein Zugriff auf OuterClass.this
Das Leben ist nicht immer ganz so einfach, du hast noch vergessen, dass auch der Zugriff auf den generischen Typparameter der äußeren Klasse entfällt

Deswegen sehe ich die Verwendung von NestedClasses auch als äußerst selten an

NestedClasses sind prinzipiell eigenständige Klassen, die man aus Platzgründen (und manchmal aus Gründen der Übersichtlichkeit ) mit in die Klasse stecken möchte und nicht in ein extra File
 
B

BestGoalkeeper

Gast
Ja ist etwas verwirrlich ausgedrückt :D

Häufigkeit: normale Klassen > Nested Classes > Inner Classes
"Können": Inner Classes > normale Klassen => Nested Classes

Also Inner Classes haben den Zugriff auf die umgebene Klasse, daher können sie mehr als normale Klassen, werden aber seltener verwendet als Nested Classes, imho - weil der zusätzliche Zugriff oft nicht benötigt wird
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Java class direved from inner class Allgemeine Java-Themen 6
J Inner class + Leer-Konstruktor Allgemeine Java-Themen 1
N Per Reflection auf (method) local inner class zugreifen? Allgemeine Java-Themen 3
D API - Beispiel + static member in inner (non static) class Allgemeine Java-Themen 2
X Cannot refer to a non-final variable settings inside an inner class defined in a different method Allgemeine Java-Themen 4
G Thread in Methode oder in inner class Allgemeine Java-Themen 3
C Probleme bei inner class Allgemeine Java-Themen 3
M reflection in inner classes Allgemeine Java-Themen 7
G static inner Klassen Allgemeine Java-Themen 7
M Problem mit Variablenzugriff bei annonymous inner classes Allgemeine Java-Themen 2
I reflection get inner static classes Allgemeine Java-Themen 2
B Von Inner Classes auf die "Outer Classes" zugreife Allgemeine Java-Themen 4
D NoClassDefFoundError: Could not initialize class Allgemeine Java-Themen 0
J Class to link Java Allgemeine Java-Themen 4
C Was passt hier nicht bei der Calendar-Class Allgemeine Java-Themen 2
E Class.getResourceAsStream() gibt null zurück Allgemeine Java-Themen 2
Erwin82a Object cannot be converted to Custom Class in Lampda Expression Allgemeine Java-Themen 2
T Java Robot Class - Bot Allgemeine Java-Themen 3
S Class File Editor -> Source not found Allgemeine Java-Themen 4
G javafx "class path" exception Allgemeine Java-Themen 5
K Wildcard und class type Allgemeine Java-Themen 9
M Java model class ? Allgemeine Java-Themen 9
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
S class path resource [config.properties}] cannot be opened because it does not exist Allgemeine Java-Themen 4
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
J Class Decompile als String (Procyon) Allgemeine Java-Themen 2
H Class 'java.io.BuferedReader' is not present in JRE Emulation Libary | GWT Fehler?! Allgemeine Java-Themen 0
I Datentypen String in class sicher verwahren Allgemeine Java-Themen 17
R Dynimc Class Loading Allgemeine Java-Themen 5
Neumi5694 Methoden Generic: Rückgabetyp als Class-Parameter übergeben Allgemeine Java-Themen 3
D Collections.sort funktioniert nicht in exportierten .class Dateien Allgemeine Java-Themen 10
V Eclipse .class Dateien Allgemeine Java-Themen 9
KeexZDeveoper Von .class zu .java Allgemeine Java-Themen 7
N Wo ist Object.class ? Allgemeine Java-Themen 0
K Nicht alle class-Dateien im JRE? Allgemeine Java-Themen 2
M *.class Files ausführen Allgemeine Java-Themen 2
L Klassen Nested Class In Nested Class Allgemeine Java-Themen 3
perlenfischer1984 Dialect class not found exception Allgemeine Java-Themen 15
Tort-E Manifest Main-Class Allgemeine Java-Themen 8
I JSoup Class auslesen Allgemeine Java-Themen 1
K Generic class und Reflection Allgemeine Java-Themen 2
R .class Datei in .jar austauschen Allgemeine Java-Themen 2
R Java .class-File-Konstrunkt mit Programm visualisieren Allgemeine Java-Themen 18
A main-class Not found Allgemeine Java-Themen 3
T Java Class Intrumentation mit Annotations in Laufzeit Allgemeine Java-Themen 1
P JDK installieren Error: Could not find or load main class HelloWorld.java Allgemeine Java-Themen 3
B public class JarFilter extends FileFilter « Falsch? Allgemeine Java-Themen 4
D Object nach Vererbung mit Class Object überprüfen Allgemeine Java-Themen 4
T Hash von *.class-Datein überprüfen Allgemeine Java-Themen 1
F java.lang.ClassNotFoundException: .class Allgemeine Java-Themen 5
T InvalidClassException - Read null attempting to read class descriptor for object Allgemeine Java-Themen 8
Phash Can't find Main Class Allgemeine Java-Themen 4
B Erste Schritte Plugin erkennen und Class Dateien anzeigen lassen Allgemeine Java-Themen 3
B json zu java class Allgemeine Java-Themen 2
antonbracke Aus Jar eine Class laden und damit arbeiten! Allgemeine Java-Themen 5
D Class<CAP#1> statt Class<...> Allgemeine Java-Themen 5
T Class-Objekt mit URLClassloader Allgemeine Java-Themen 7
A Class Datei aus Verzeichnis über URLClassLoader laden Allgemeine Java-Themen 2
L Class Files , Methode .delete() Allgemeine Java-Themen 13
E NetBeans warning: [options] bootstrap class path not set in conjunction with -source 1.6 Allgemeine Java-Themen 4
X Could not find the main class programm will exit (textdokument) Allgemeine Java-Themen 3
S Could not find the main class Allgemeine Java-Themen 7
B Mal wieder "Could not find the main class" Allgemeine Java-Themen 3
B Variable class in java.lang.Object Allgemeine Java-Themen 11
C Could not find the main class. Allgemeine Java-Themen 15
S Klassen .jar - eine .class datei ändern? Allgemeine Java-Themen 23
A Could not find main class: start Allgemeine Java-Themen 5
S main() class finden Allgemeine Java-Themen 7
hdi Could not find main class? Allgemeine Java-Themen 8
R Warum Class.forName(); Allgemeine Java-Themen 7
C class.class angefordert ? Allgemeine Java-Themen 2
S Methoden Class.forName() >> Methoden - Reihenfolge Allgemeine Java-Themen 5
B Test$1.class mit dem javac compiler Allgemeine Java-Themen 7
G jar Datei findet Main Class nicht... Allgemeine Java-Themen 2
P Java Editor Could not find the main class GUI. Programm will exit. Allgemeine Java-Themen 3
D class Datei einlesen Allgemeine Java-Themen 4
T Interface > Abstract > Class Allgemeine Java-Themen 11
TheDarkRose Subversion .class Dateien auch commiten? Allgemeine Java-Themen 3
E String name in class convertieren Allgemeine Java-Themen 4
F Änderung in .jar bzw. .class vornehmen ? Allgemeine Java-Themen 18
H2SO3- bestimmte class immer mit 1.4 compilieren Allgemeine Java-Themen 5
B class dateien "einlesen" und objekte erzeugen Allgemeine Java-Themen 6
G Unterschied MyClass.class vs this Allgemeine Java-Themen 2
S mit Class eine Klasse nur einmal instantiieren Allgemeine Java-Themen 4
Sonecc Zugriff auf Class File einer anderen Jar während der Laufzeit Allgemeine Java-Themen 2
M Klasse aus xyz.class Datei laden / package entfernen? Allgemeine Java-Themen 4
BattleMaster246 Could not find the Main class Allgemeine Java-Themen 30
N class Task extends TimerTask ohne Blockieren Allgemeine Java-Themen 15
H .class in .java umwandeln Allgemeine Java-Themen 3
T class.newinstance + try/catch-konstruktor Allgemeine Java-Themen 6
J Class.forName und CLASSPATH -Problem Allgemeine Java-Themen 5
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
woezelmann referenz der outer class aus static nested class heraus Allgemeine Java-Themen 7
reibi Main-Class in Jarfile Allgemeine Java-Themen 3
E Timer class macht einfach garnichts :/ Allgemeine Java-Themen 6
D Class.forName Allgemeine Java-Themen 2
S Class RGB Farbe Allgemeine Java-Themen 2
S JavaDoc aus .class Datei extrahieren Allgemeine Java-Themen 5
mongole Class.class.getResource(...) Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben