Thread zum Thema "Interessante Fakten"

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();
			}
		});
	}

}```

Das gilt übrigens auch für normale innere Klassen (also nicht-anonym und nicht-statisch).

Als Ergänzung zu Enums die Interfaces implementieren noch ein Beispiel:

    String getAuthority();
}```
```public enum UserRoles implements GrantedAuthority {
    ADMIN("ROLE_ADMIN"),
    USER("ROLE_USER");
    private final String role;

    UserRoles(String role) {
        this.role = role;
    }

    @Override
    public String getAuthority() {
        return role;
    }
}```