9.8 Nester
Geschachtelte Klassen haben eine Besonderheit bei privaten Eigenschaften, nämlich dass sowohl der äußere Typ auf private Eigenschaften der geschachtelten Klasse zugreifen kann als auch die geschachtelte Klasse auf private Eigenschaften der äußeren Klasse. Das führt zu einer besonderen Form der Umsetzung in Java-Bytecode, die die privaten Eigenschaften für andere Klassen freigeben muss, denn auf der Ebene der virtuellen Maschine gibt es nur Top-Level-Klassen.
Ab Java 11 gibt es eine Neuerung, sogenannte Nester, beschrieben im JEP 181: »Nest-Based Access Control«.[ 192 ](http://openjdk.java.net/jeps/181) Der Bytecode bildet damit viel besser ab, dass ein Typ in einem Typ geschachtelt ist. In der Bibliothek gibt es drei neue Objektmethoden bei Class: getNestHost(), isNestmateOf(Class) und getNestMembers().
package com.tutego.insel.nested;
public class OuterNest {
public static class In1 {
private void intern1() {
new OuterNest().new In2().intern2();
}
}
public class In2 {
private void intern2() {
new In1().intern1();
}
}
public static void main( String[] args ) {
for ( Class<?> clazz : OuterNest.class.getNestMembers() ) {
System.out.printf( "%s %b%n", clazz, clazz.isNestmateOf( OuterNest.class ) );
}
}
}
Unter Java 11 kommt Folgendes auf die Konsole:
class com.tutego.insel.nested.OuterNest true
class com.tutego.insel.nested.OuterNest$In1 true
class com.tutego.insel.nested.OuterNest$In2 true
Unter Java 10 erscheint lediglich die erste Zeile!