Можете ли вы объяснить это об инкапсуляции?

В ответ на Какое ваше долговременное программирующее предположение оказалось неверным?, одно из неправильных предположений:

Эти частные переменные-члены были частный для экземпляра, а не класс.

(Ссылка)

Я не мог понять, о чем он говорит, может ли кто-нибудь объяснить, что в этом нет неправильного/правильного?

Ответ 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, не относящемуся к какому экземпляру, который использовался для вызова он.