Erste Schritte Geschweifte Klammern

  • Themenstarter Themenstarter Klammerheinz
  • Beginndatum Beginndatum
K

Klammerheinz

Gast
Hallo!

Ich habe mal eine kleine Anfängerfrage zu einem Programm das ich ändern muss:

Java:
class A{
//Was ist das für ein Konstrukt?
{
...
}

}

Mitten in der Klasse sind einfach {...}-Block ohne Modifier. Handelt es sich um die Kurzform von static{...}?

Danke.
 
Nein, aber so ähnlich: Ein Initialisierungsblock. Ist manchmal nützlich, etwa wenn man viele unabhängige Konstruktoren hat, und immer eine bestimmte Aufgabe erledigen muss, oder für anonyme Klassen, die keinen Konstruktor haben. Manchmal sieht man z.B. das (meiner Meinung nach unschöne):

Java:
class X {
   private List<String> list = new ArrayList<String>(){ { add("foo"); add("bar"); } };
}

Hier wird eine anonyme Unterklasse von [c]ArrayList[/c] abgeleitet, und (mangels eigenem Konstruktor) über einen Intialisierungsblock, äh... initialisiert. Wie gesagt, würde ich aber eher von abraten.

Siehe z.B. Initialisierungsblöcke
 
Zuletzt bearbeitet:
Ich hab das gleiche mitten in einer Methode stehen.
Finds grad nicht, aber ich glaubt da ist eine Schleife drin.
(is jetzt nicht dringeng aber mich würde es mal interessieren)
 
[OT]
Wie peinlich! Latürnich muss es "(mangels eigenen Konstruktors)" heißen. Genitiv ins Wasser, denn es ist Dativ! Oder umgekehrt...

"Mangels eigenem Konstruktor" ist auch richtig. Aber wenn es Dativ sein soll, dann (wie bereits richtig gemacht) gehört auch kein Genitiv-s dazu

Imho kann man sehr wohl "Mangels wem?" oder "Mangels wessen?" fragen[/OT]
 
Nein, aber so ähnlich: Ein Initialisierungsblock. Ist manchmal nützlich, etwa wenn man viele unabhängige Konstruktoren hat, und immer eine bestimmte Aufgabe erledigen muss, oder für anonyme Klassen, die keinen Konstruktor haben. Manchmal sieht man z.B. das (meiner Meinung nach unschöne):

Java:
class X {
   private List<String> list = new ArrayList<String>(){ { add("foo"); add("bar"); } };
}

Hier wird eine anonyme Unterklasse von [c]ArrayList[/c] abgeleitet, und (mangels eigenem Konstruktor) über einen Intialisierungsblock, äh... initialisiert. Wie gesagt, würde ich aber eher von abraten.

Siehe z.B. Initialisierungsblöcke

Tut mir leid aber diese Unterklasse, wie du sie beschrieben hast, bringt's ja mal gar nicht! Na gut, in sehr wenigen Situationen vielleicht, aber an sich weiß ich nicht, was jeder gegen anonyme Unterklassen hat.
Sowas wie
Java:
private final JTextField field = new JTextField(){
    @Override
    public void paste(){
        super.paste();
        field.setText(field.getText().replaceAll("[^0-9]", "")); // lösche alle nichtnumerischen Zeichen
    }
};
finde ich absolut praktisch... Und generell "new ActionListener(){ blabla };" oder "new Thread(new Runnable(){blabla});" verwendet auch jeder!

(mal ein simples Beispiel, um bei einem numerischen Textfeld Einfügen von Buchstaben zu vermeiden)
 
Tut mir leid aber diese Unterklasse, wie du sie beschrieben hast, bringt's ja mal gar nicht!
Ich habe es nur als Anwendungsbeispiel gebracht und ausdrücklich nicht empfohlen. Es ist aber schon anzumerken, dass es eine große Lücke bei den Collections ist, dass diese nicht ohne weiteres über den Konstruktor initialisiert werden können (abgesehen von [c]EnumSet.of()[/c], und abscheulichen Hacks wie [c]new ArrayList<String>(Arrays.asList("foo","bar"));[/c])

Niemand "hat etwas gegen" anonyme Unterklassen, wo hast du das gelesen? Aber anonyme Unterklassen haben nun mal keinen eigenen Konstruktor, und genau da können Initialisierungsblöcke helfen. Bei "normalen" Klassen sind diese zwar erlaubt, aber (im Gegensatz zu statischen Initialisierungsblöcken) weniger nützlich, und führen regelmäßig zur Verwirrung (manche kennen das Feature nicht, oder die Abarbeitungsreihenfolge ist nicht klar).
 
Ich habe es nur als Anwendungsbeispiel gebracht und ausdrücklich nicht empfohlen. Es ist aber schon anzumerken, dass es eine große Lücke bei den Collections ist, dass diese nicht ohne weiteres über den Konstruktor initialisiert werden können (abgesehen von [c]EnumSet.of()[/c], und abscheulichen Hacks wie [c]new ArrayList<String>(Arrays.asList("foo","bar"));[/c])
[OT]Guava - bzw die ehemaligen google-collections haben da schoene Aushilfen[/OT]
 

Zurück
Oben