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

17

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

  

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

(

задан Moayad Mardini 31.08.2009 в 15:35
источник

3 ответа

35
public class Example {
  private int a;

  public int getOtherA(Example other) {
    return other.a;
  }
}

Нравится это. Как вы видите, private не защищает член экземпляра от доступа другим экземпляром.

Кстати, это не так уж плохо, если вы немного осторожны. Если private не будет работать, как в приведенном выше примере, было бы громоздко написать equals () и другие подобные методы.

    
ответ дан Gregory Mostizky 31.08.2009 в 15:37
источник
3

Вот эквивалент ответа Майкла Боргвардта если вы not можете получить доступ к закрытым полям другого объекта:

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 некоторое время. Я предпочитаю не полагаться на доступ к частным полям другого объекта. Помните, что другой объект может принадлежать к подклассу, который может хранить значение в другом поле объекта или в файле или базе данных и т. Д.

    
ответ дан finnw 31.08.2009 в 16:09
источник
2

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

    
ответ дан Michael Borgwardt 31.08.2009 в 15:42
источник