Можете ли вы объяснить это об инкапсуляции?
В ответ на Какое ваше долговременное программирующее предположение оказалось неверным?, одно из неправильных предположений:
Эти частные переменные-члены были частный для экземпляра, а не класс.
(Ссылка)
Я не мог понять, о чем он говорит, может ли кто-нибудь объяснить, что в этом нет неправильного/правильного?
Ответы
Ответ 1
public class Example {
private int a;
public int getOtherA(Example other) {
return other.a;
}
}
Нравится это. Как вы видите, private не защищает член экземпляра от доступа другим экземпляром.
Кстати, это не так уж плохо, если вы немного осторожны.
Если private не будет работать, как в приведенном выше примере, было бы громоздко написать equals() и другие подобные методы.
Ответ 2
Здесь эквивалент Майкл Боргвардт отвечает, когда вы не можете получить доступ к закрытым полям другого объекта:
public class MutableInteger {
private int value;
// Lots of stuff goes here
public boolean equals(Object o) {
if(!(o instanceof MutableInteger)){ return false; }
MutableInteger other = (MutableInteger) o;
return other.valueEquals(this.value); // <------------
}
@Override // This method would probably also be declared in an interface
public boolean valueEquals(int oValue) {
return this.value == oValue;
}
}
В настоящее время это знакомо программистам Ruby, но я делаю это в Java некоторое время. Я предпочитаю не полагаться на доступ к частным полям другого объекта. Помните, что другой объект может принадлежать к подклассу, который может хранить значение в другом поле объекта или в файле или базе данных и т.д.
Ответ 3
Пример кода (Java):
public class MutableInteger {
private int value;
// Lots of stuff goes here
public boolean equals(Object o) {
if(!(o instanceof MutableInteger)){ return false; }
MutableInteger other = (MutableInteger) o;
return this.value == other.value; // <------------
}
}
Если предположение "частные члены-переменные являются частными для экземпляра" были правильными, отмеченная строка вызовет ошибку компилятора, поскольку поле other.value
является частным и является частью другого объекта, чем тот, чей метод equals()
вызывается.
Но так как в Java (и большинстве других языков, имеющих концепцию видимости) private
видимость - это класс, доступ к полю разрешен ко всему коду MutableInteger
, не относящемуся к какому экземпляру, который использовался для вызова он.