Является ли хорошей практикой кодирования для использования getter для доступа к переменным частного экземпляра

5

Недавно я получил комментарий для проверки кода, чтобы использовать метод getter для доступа к переменной частного экземпляра внутри методов того же класса. Действительно ли это хорошая практика? Я чувствую, что он добавляет ненужное усложнение кода. Каков рекомендуемый способ?


public class SomeClass {
String abc;

public boolean compare(SomeClass otherClass) {
otherClass.getAbc().equals(abc);
}
}

public class SomeClass {
String abc;

public boolean compare(SomeClass otherClass) {
otherClass.getAbc().equals(getAbc());
}
}

спросил(а) 2016-06-22T00:20:00+03:00 3 года, 5 месяцев назад
2
2 ответа
5

Я вижу очень специфическую проблему с вашим первым подходом. Вы используете геттеры непоследовательно.


public boolean compare(SomeClass otherClass) {
otherClass.getAbc().equals(abc);
//.getAbc() for one, but direct access for the other!!
}

Вы должны сравнивать яблоки с яблоками для метода equals, и если одна из ваших переменных извлекается для сравнения с использованием getter (который, как я предполагаю, является общедоступным и может быть переопределен), а другой извлекается непосредственно из частной переменной ( который нельзя переопределить), тогда вы сделали свой код намного более хрупким, чем это должно быть. Что делать, если кто-то расширяет ваш класс и изменяет метод getter? Ваш код будет закрыт. Поэтому используйте getter для обоих или none.


Учитывая это, любой из них лучше, чем ваш оригинал, поскольку поведение более стабильное:

public boolean compare(SomeClass otherClass) {
otherClass.abc.equals(abc);
}

public boolean compare(SomeClass otherClass) {
otherClass.getAbc().equals(getAbc());
}


В общих целях это зависит от того, как вы используете данные. В ответе Дэвида перечислены некоторые ресурсы для общего использования геттеров.


Вполне возможно, что ваш рецензент говорил только об общем случае, но я думаю, что они, возможно, просто плохо сообщили проблему.

ответил(а) 2016-06-22T00:44:00+03:00 3 года, 5 месяцев назад
3

Теоретически использование геттеров и сеттеров внутри класса может обеспечить повторное использование кода, например, если сеттер выполняет некоторую проверку диапазона, которая также полезна в классе. На практике я никогда не видел случая, когда это было действительно полезно.


В идеале у класса не должно быть сеттеров и геттеров вообще.

Почему нет сеттеров? Потому что они предоставляют изменчивое состояние, которое вызывает множество проблем. В идеале переменные класса должны быть назначены в конструкторе и никогда не будут меняться позже.


Почему нет геттеров? Потому что класс должен действовать как единое целое. Точка создания класса заключается не только в том, чтобы предоставить временный контейнер для разных переменных, а только для их извлечения позже, один за другим. Это не инкапсуляция.

ответил(а) 2016-06-22T00:53:00+03:00 3 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема