Overview
I have used nested classes which accessed the
private members of top level classes for some time, and discovered that a top level class can access the private members of nested classes. Recently, I discovered that nested classes can access private member or other nested classes. i.e. where the two classes are not nested, but share a top level class.
Example
Perhaps
private should be called "file local" c.f. package local. ;)
public interface MyApp {
class Runner {
public static void main(String... args) {
// access a private member of another class
// in the same file, but not nested.
SomeEnum.VALUE1.value = "Hello World";
System.out.println(SomeEnum.VALUE1);
}
}
enum SomeEnum {
VALUE1("value1"),
VALUE2("value2"),
VALUE3("value3");
private String value;
SomeEnum(final String value) {
this.value = value;
}
public String toString() {
return value;
}
}
}
Eclipse will give you the following warning (if enabled):
ReplyDeleteWrite access to enclosing field MyApp.SomeEnum.value is emulated by a synthetic accessor method
So it's actually using a method call.
The JVM doesn't support access of private members (field, methods, constructors) from other classes, so the compiler generates accessor methods with names like access$100.
ReplyDeleteAFAIK, The warning comes from the concern this could impact performance, or be confusing (as the generated method appears in the stack trace) You will get this warning even if an inner class accesses a private member of an other class.