Java inner class and private field visibility

I have never understood this until today, but in Java private fields are not really private in inner classes. You can instantiate the class and access the fields as if they were public. My question is: why was this done in Java? What design decisions have led to what seems like a break in encapsulation? Are there any advantages to this?

public class test { public static void main(String[] args) { Inner inner = new Inner(); inner.data = "TEST"; System.out.println(inner.data); Inner1 inner1 = new Inner1(); inner1.data = "TEST"; System.out.println(inner1.data); new test(); } public test() { Inner2 inner2 = new Inner2(); inner2.data = "TEST"; System.out.println(inner2.data); Inner3 inner3 = new Inner3(); inner3.data = "TEST"; System.out.println(inner3.data); } private final class Inner3 { private String data; public String getData() { System.out.println("Inner3.getData()"); return data; } public void setData(String data) { System.out.println("Inner3.setData(String)"); this.data = data; } } private class Inner2 { private String data; public String getData() { System.out.println("Inner2.getData()"); return data; } public void setData(String data) { System.out.println("Inner2.setData(String)"); this.data = data; } } private static class Inner1 { private String data; public String getData() { System.out.println("Inner1.getData()"); return data; } public void setData(String data) { System.out.println("Inner1.setData(String)"); this.data = data; } } private static final class Inner { private String data; public String getData() { System.out.println("Inner.getData()"); return data; } public void setData(String data) { System.out.println("Inner.setData(String)"); this.data = data; } } } 
+4
source share
1 answer

This helps with anonymous classes. They access the class around (for example, with final variables in methods). This way you avoid the many setters / getters that you still need to do, at least for a private package, and thus for sharing with a more than private class.

If you don't like this behavior (for example, I do most of the time), just use static private classes that only have access to private static members that leave me with a better gut feeling.

0
source

Source: https://habr.com/ru/post/1493660/


All Articles