Рассмотрим этот класс Java:
public class Base {
private int a
protected int b;
public Base(int a,int b) {
this.a = a;
this.b = b;
}
public int getA() {
return a;
}
public int getB() {
return b;
}
}
...
Base foo = new Base(1,2);
Base bar = new Base(3,4);
Нет никакого способа (возможно, кроме как посредством грязного отражения), экземпляр foo
может изменить защищенную или приватную переменную в bar
Вы можете разрешить это, если хотите,
public class Base {
private int a
protected int b;
public Base(int a,int b) {
this.a = a;
this.b = b;
}
public int getA() {
return a;
}
public int getB() {
return b;
}
public void changeB(int newB,Base other) {
other.b = newB;
}
}
...
Base foo = new Base(1,2);
Base bar = new Base(3,4);
foo.changeB(5,bar);
Вы не можете защитить метод changeB
от изменения содержимого объекта other
[*], вам просто нужно быть осторожным с тем, что выпрограмма делает.В некоторых языках вы могли бы пометить аргумент other
как неизменяемый, но не в Java - я не нахожу это большим делом.
[*} Вы могли бы, отметив все поля Base
как окончательное, хотя тогда даже сам экземпляр не может изменить членов после того, как объект был построен.