Verständnisfrage - nested static classes

Status
Nicht offen für weitere Antworten.

jollyroger

Bekanntes Mitglied
Hi,

kann mir bitte mal jemand erklären, warum um alles in der Welt ich jemals "nested static classes" einsetzen wollte?

Um mal kurz zu definieren was ich meine:

static classes: no associated outer class instance.

Das ist von hier:

-> http://mindprod.com/jgloss/nestedclasses.html

So eine "nested static class" würde z.b. so aussehen:

Code:
package com.mindprod.practice;

import com.mindprod.common11;

public class Outer
   {
   void anOuterMethod()
      {
      /* does nothing */
      }

   // static class, nested inside Outer
   public static class NestedStatic
      {
      void aNestedStaticMethod()
         {
         /* does nothing */
         }
      // end of class NestedStatic
      }

   // end of class Outer
   }

Sprich, es handelt sich um eine "inner class", nur das ich keine äußere Klasse brauche, um das Ding zu instanziieren.

Auf den ersten Blick betrachtet, kommt mir das wie das unsinnigste Sprachfeature überhaupt vor.

Wieso sollte ich sowas jemals machen?

Gibt es hier einen "realitätsnahen" Anwendungsfall?
 

Marco13

Top Contributor
:shock: ja sicher - immer, wenn man eine "Hilfs-Klasse" braucht, die alleine exisitieren kann und soll - konkretes Beispiel aus einer der Map-Implementierungen
Code:
    /**
     * LinkedHashMap entry.
     */
    private static class Entry<K,V> extends HashMap.Entry<K,V> {
...
 

jollyroger

Bekanntes Mitglied
sicher - immer, wenn man eine "Hilfs-Klasse" braucht, die alleine exisitieren kann und soll

Und was spricht dann dagegen, eine "normale" Top-Level-Klasse daraus zu machen?

Anders gefragt: Was für einen Vorteil hat dein obiges Beispiel im Vergleich zu einer Top-Level Klasse?

Code-Übersichtlichkeit und Wartbarkeit kann es ja wohl nicht sein......und nur weil Sun das macht, muss ja noch lange nicht sinnvoll sein, weil das wäre eine Begründung nach dem Motto "Ich tue etwas und deshalb ist es sinnvoll".

P.S.: Nur um das nochmal klarzustellen: Es geht mir nicht um die Sinnhaftigkeit von "nested inner classes", sondern ausschließlich um die Sinnhaftigkeit von "nested static classes".
 

musiKk

Top Contributor
Also soweit ich das verstanden habe, gibt es wirklich keinen Grund, nested static classes ausser zu Strukturierungszwecken einzusetzen. Was gegen Uebersichtlichkeit spricht, verstehe ich allerdings nicht. Es ist halt eine Ebene unter den Packages und drueckt noch eine gewisse Zugehoerigkeit aus.
 

didjitalist

Bekanntes Mitglied
Ein Aspekt von OO ist Kapselung. Es sollte nur das sichtbar sein, was für den Betrachter von Interesse ist. Nested classes können in ihrer Sichtbarkeit soweit eingeschränkt werden, dass sie nur noch für eine Klasse sichtbar sind und das kann sehr sinnvoll sein.

Es gibt übrigens sogar einen coding Grundsatz der besagt, dass inner classes immer static sein sollten, es sei denn, es gibt wirklich trifftige Gründe, die dagegen sprechen.
 

musiKk

Top Contributor
Das heisst, wenn man deine beiden Aussagen zusammenfasst, soll man am besten private static bei inneren Klassen benutzen?
 

Marco13

Top Contributor
Ganz subjektiv(!) würde ich sogar sagen, dass static classes meistens private sein sollten - wenn sie public sind, hat man ja wieder eine (ggf. unerwünschte) Verbindung zur einschließenden Klasse, wenn jemand eigentlich nur die innere Klasse verwenden will....
 

jollyroger

Bekanntes Mitglied
Ein Aspekt von OO ist Kapselung. Es sollte nur das sichtbar sein, was für den Betrachter von Interesse ist. Nested classes können in ihrer Sichtbarkeit soweit eingeschränkt werden, dass sie nur noch für eine Klasse sichtbar sind und das kann sehr sinnvoll sein.

Dann lies doch bitte mein Posting richtig.

Das "Nested Inner Classes" sehr sinnvoll sein können hab ich nie bestritten.

Darum hatte ich extra noch mal das hier

P.S.: Nur um das nochmal klarzustellen: Es geht mir nicht um die Sinnhaftigkeit von "nested inner classes", sondern ausschließlich um die Sinnhaftigkeit von "nested static classes".

angefügt.

Nochmal:

Static Nested Classes
As with class methods and variables, a static nested class is associated with its outer class. And like static class methods, a static nested class cannot refer directly to instance variables or methods defined in its enclosing class — it can use them only through an object reference.

Note: A static nested class interacts with the instance members of its outer class (and other classes) just like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience.

Ok, eine nested static classes ist also

* eine Top-Level Class
* Hat genau die gleiche Sichtbarkeit als wenn ich sie in einem separaten source-file hätte
* Und kann im Prinzip von jedem aufgerufen werden -> im Unterschied zu "nested inner class" - da ist also nix mit erhöhter Kapselung!

Sprich,

ob ich das nun separat definiere oder als "static nested class" ist von den Auswirkungen her völlig egal, weil es aufs gleiche rauskommt?

Wo ist denn nun der Vorteil in welcher Situation?

Wenn das einzige Argument jetzt "bessere Lesbarkeit" ist, dann muss ich sagen -> das ist persönliche Ansichtssache.

Ich finde das eben nicht lesbarer, ein anderer vielleicht schon.

P.S.:

Falls ich was falsch verstanden haben sollte, bitte ich demutsvoll um Aufklärung..... :wink:
 
M

maki

Gast
Comperatoren sind gute Beispiele für statische innere Klassen, man braucht keine Instanzen, trennt aber dennoch die Aspekte und hält Dinge zusammen die irgendwie doch zusammengehören.
 

jollyroger

Bekanntes Mitglied
Um jetzt auch noch mal meinen Senf dazu zu geben, hab ich jetzt vor kurzem Code geschrieben, wo ich eine sinnvolle Anwendung für "nested static classes" gefunden habe, in Anlehnung an das was Maki geschrieben hatte:

Comperatoren sind gute Beispiele für statische innere Klassen, man braucht keine Instanzen, trennt aber dennoch die Aspekte und hält Dinge zusammen die irgendwie doch zusammengehören.

In meinem Fall war das ein DTO welches mehrere Comparatoren hatte. Eingesetzt wurde das ganze dann ungefähr folgendermaßen:

Code:
Arrays.sort(myDtoArr, new myDTO.myComparator());

Wie maki schon erwähnte ein sehr gutes Beispiel:

- myComparator macht nur im Context des DTOs Sinn
- soll aber unabhängig von einer konkreten Instanz des DTOs erzeugt werden

Wieder was gelernt, danke an alle........ :wink:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Verständnisfrage java.util.TimerTask Allgemeine Java-Themen 2
C try-catch Block Verständnisfrage Allgemeine Java-Themen 14
RalleYTN Collections Verständnisfrage zu Objektreferenzen in Listen Allgemeine Java-Themen 5
O log4j - Verständnisfrage Allgemeine Java-Themen 1
M Verständnisfrage bei Hausaufgabe Allgemeine Java-Themen 7
L Getter und Setter Verständnisfrage Allgemeine Java-Themen 10
H MVC - Verständnisfrage Allgemeine Java-Themen 12
E Verständnisfrage zu synchronized-Blöcken Allgemeine Java-Themen 3
E Verständnisfrage bezüglich Threads Allgemeine Java-Themen 4
agent47 Plugin System Verständnisfrage Allgemeine Java-Themen 6
T Verständnisfrage bei Nachbarschaftsbetrachtung Allgemeine Java-Themen 8
M Verständnisfrage Exceptions Allgemeine Java-Themen 2
A Generics Verständnisfrage Allgemeine Java-Themen 7
J Verständnisfrage zu Casts auf Interfaces Allgemeine Java-Themen 5
J Verständnisfrage zu exceptions Allgemeine Java-Themen 3
J volatile Verständnisfrage Allgemeine Java-Themen 6
S JAAS - Verständnisfrage Allgemeine Java-Themen 2
G allgemein synchroniszed verständnisfrage Allgemeine Java-Themen 19
V FileWriter und Zahlen (Kein Problem, nur Verständnisfrage) Allgemeine Java-Themen 4
K Verständnisfrage. Allgemeine Java-Themen 9
T Eine Verständnisfrage Allgemeine Java-Themen 15
T Kleine Verständnisfrage zu Stringbuffer Allgemeine Java-Themen 2
sliwalker Verständnisfrage ObserverPattern Allgemeine Java-Themen 2
looparda Nested Predicate Allgemeine Java-Themen 6
C Nested JSON in Java ansprechen [Wordpress Rest Api] Allgemeine Java-Themen 26
L Klassen Nested Class In Nested Class Allgemeine Java-Themen 3
D nested loops mit Iterator Allgemeine Java-Themen 2
Pastafari Iterator über nested HashMaps Allgemeine Java-Themen 7
woezelmann referenz der outer class aus static nested class heraus Allgemeine Java-Themen 7
B warum keine nested blocks Allgemeine Java-Themen 2
G Problemem mit <nested:select . Allgemeine Java-Themen 2
E Methoden abstract static Methode Allgemeine Java-Themen 8
N nicht static und auch nicht new Allgemeine Java-Themen 3
P static Blocks und variablen Allgemeine Java-Themen 41
Kirby.exe Cannot make a static reference to the non-static field rimWidth Allgemeine Java-Themen 12
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
S static in Interface und Klasse Allgemeine Java-Themen 2
S static methode im Interface Allgemeine Java-Themen 1
A Variablen non-static variable cannot be referenced from a static content Allgemeine Java-Themen 4
P Static Variable -> unterschiedliche Werte? Allgemeine Java-Themen 1
K Static Variablen verbieten Allgemeine Java-Themen 10
C Generic collections und static typing Allgemeine Java-Themen 4
M Warum nicht static ? Allgemeine Java-Themen 10
M Eine static-Methode verlassen Allgemeine Java-Themen 2
B Schlüsselworte [ERLEDIGT] static { } - Was ist das und wofür kann ich das brauchen? Allgemeine Java-Themen 1
J private static final String variable Allgemeine Java-Themen 8
L Non-static-Variables in Enumerationen Allgemeine Java-Themen 2
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
T Enumeration/Static Final/Bitfield Allgemeine Java-Themen 6
T Static kann nicht verändert werden Allgemeine Java-Themen 3
W Threads Cannot make a static reference.. Allgemeine Java-Themen 13
H Programierstil: static - Zugriff vs. Staticzugriff Allgemeine Java-Themen 24
N Static oder andere Lösung Allgemeine Java-Themen 5
N Vererbung Static & private fields - Nicht ganz einfach? Allgemeine Java-Themen 4
M Wo hin mit static factory methods? Allgemeine Java-Themen 40
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
S Cannot make a static reference to the non-static field MySecondClass.Points Allgemeine Java-Themen 3
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
S auf public void Methode zugreifen ohne static Allgemeine Java-Themen 11
K Static - Problem Allgemeine Java-Themen 10
M Variablen Variablenzugriff aus static void Allgemeine Java-Themen 21
D API - Beispiel + static member in inner (non static) class Allgemeine Java-Themen 2
S static methoden Allgemeine Java-Themen 9
S Performance Frage: Objekt oder static? Allgemeine Java-Themen 33
X HTTP Problem mit static/non static JTextArea Update Allgemeine Java-Themen 17
A Annotation einer Subklasse im static-Block auslesen. Allgemeine Java-Themen 6
B static Variable / Unterklasse Allgemeine Java-Themen 2
I Was macht static { ... } ? Allgemeine Java-Themen 8
G static inner Klassen Allgemeine Java-Themen 7
G static und dynamic linking? Allgemeine Java-Themen 32
J in einer static Variable Wert ändern Allgemeine Java-Themen 6
G static- Methoden überschreiben Allgemeine Java-Themen 10
E Geschwindigkeit static Allgemeine Java-Themen 6
V Static oder wie? Allgemeine Java-Themen 61
I reflection get inner static classes Allgemeine Java-Themen 2
L static main - Spezifikation? Allgemeine Java-Themen 7
G URLClassLoader stößt static Block nicht an Allgemeine Java-Themen 8
D static Allgemeine Java-Themen 46
P static-Methode aus dem Konstruktor aufrufen Allgemeine Java-Themen 6
oliver1974 "(.) should be accessed in a static way" Falsche W Allgemeine Java-Themen 6
P static Klassenvariable Allgemeine Java-Themen 15
B JPasswordField klassenübergreifend auslesen->static Probl Allgemeine Java-Themen 4
F Methoden: static vs. instance Allgemeine Java-Themen 24
MQue static Methoden/Klassen Allgemeine Java-Themen 7
K Warum static-Methoden nutzen Allgemeine Java-Themen 26
G Java-Befehle Native und Static Allgemeine Java-Themen 2
conan2 static-Block in Klassen Allgemeine Java-Themen 6
M JNI, static.a mit load.Library laden? Allgemeine Java-Themen 2
K Static Members von Superklasse für JEDEN Erben Allgemeine Java-Themen 6
padde479 The static method sleep(long) from the type Thread should. Allgemeine Java-Themen 2
M static-Methode vorschreiben Allgemeine Java-Themen 5
S singleton vs. static Allgemeine Java-Themen 7
G Object mit static Feldern speichern Allgemeine Java-Themen 9
J Warum heißt es eig. "public static void main" ? Allgemeine Java-Themen 4
conan2 "Cannot make a static reference to the non-static field Allgemeine Java-Themen 8
P Singleton vs static Allgemeine Java-Themen 19
J parameterized und static fields Allgemeine Java-Themen 4
A Static reference to non-static field Allgemeine Java-Themen 10
S static umgehen Allgemeine Java-Themen 5
G static oder nicht Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben