Gab es nicht mal einen Thread zum Thema “Interessante Fakten”, in denen selten verwendete aber hilfreiche Snippets/Fakten gepostet werden konnten?
Falls jemand sich noch erinnert und den Link parat hat - gestern hatte ich so einen “Aha” Moment:
Mit Enums kann man auch Interfaces implementieren. Eigentlich klar, aber mir war es bis gestern nicht bewusst.
Felder in Interfaces brauchen keine Modifier, es wird implizit public static final vorausgesetzt - genauso wie man sich bei Methoden das public abstract sparen kann.
RuntimeExceptions kann man ruhig zu Dokumentationszwecken in der throws-Klausel angeben, man braucht sie trotzdem im Client-Code nicht abzufangen.
throws null; wirft eine NullPointerException.
Enum-Instanzen können Methoden “individuell” implementieren, man braucht kein switch:
public enum Op {
PLUS { public int calc(int x, int y){ return x + y; } },
MINUS { public int calc(int x, int y){ return x - y; } },
MULT { public int calc(int x, int y){ return x * y; } },
DIV { public int calc(int x, int y){ return x / y; } };
public abstract int calc(int x, int y);
}
Enum-Instanzen werden vor (anderen) statischen Feldern des Enums initialisiert, sowas funktioniert deshalb nicht:
public enum Test {
FOO(CONSTANT + "foo"),
BAR(CONSTANT + "bar");
private final static String CONSTANT = "Test: ";
Test(String s) {
System.out.println(s);
}
}
Über den Namen der äußeren Klasse bekommt man die aktuelle Instanz, auch (oder gerade) wenn man sich in einer inneren Klasse befindet.
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Gui {
private JFrame frame;
private JButton button;
public Gui() {
// ...
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// funktioniert nicht, da sich "this" auf die anonyme instanz
// bezieht, nicht auf die gui-instanz
// this.frame.dispose();
//so gehts:
Gui.this.frame.dispose();
}
});
}
}```