2015-06-23 3 views
1

Например, в основном методе у меня есть setFirstName() и позвоните по номеру . Для этого необходимо связаться с классом. В классе контактов я знаю, что я должен использовать: public String getName() , а затем public void setFirstName(String name)Аксессор и мутатор в Java

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

public String setFirstName(String name) 
{ 
    return this.name=name; 
} 

это будет также работать и мне не нужно использовать getName() метод.

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

+4

Предположим, вы хотите получить текущее значение 'name', как ваше решение поможет вам? –

+0

@FrankTby Вы можете (и должны) просто изменить свой вопрос, чтобы улучшить его. – Hulk

+0

Бывают ситуации, когда мутант имеет смысл возвращать предыдущее значение (см., Например, метод [put на карте] (http://docs.oracle.com/javase/8/docs/api/java/util /HashMap.html#put-KV-)), но обычно вы также хотите получить доступ к значению без его модификации. – Hulk

ответ

1

Это сама идея доступа, которую он читает, но не изменяет. Это полезное соглашение, потому что, если сделать это последовательно, он делает рассуждения о некотором коде, который вам не намного легче. Обычно вам не следует ожидать странных побочных эффектов от чего-то, что называется getX(). Возможно, будет нормально выполнять какую-то ленивую инициализацию, но становится яснее, если такие «ленивые геттеры» называются getOrCreateX() или похожи, чтобы дать пользователю подсказку о том, что первое использование может занять немного больше времени/задействовать некоторую дорогостоящую операцию.

Мутатор, который возвращает что-то, может быть полезен, но он поможет пользователям вашего класса, если вы назовете его так, чтобы дать подсказку о том, что он возвращает. Это код ошибки или предыдущее значение? Люди не ожидают возвратных значений от чего-то имени setX(), поэтому они будут удивлены, увидев такую ​​подпись, и должны посмотреть документацию вашего класса, чтобы узнать, что она делает.

Резюме: Всегда указывайте код, как если бы кто-то еще должен был взять ваш код в любой момент - не делайте ничего удивительного. Даже если вы никогда не передадите свой код кому-либо еще, ваше будущее будет благодарно вам за выбор имен, которые объясняют, что делает этот метод.

Примечание: Ваша реализация сеттера не очень полезно, так как она всегда возвращает новое значение, которое вы только что прошли в

1

Getters and setters - это просто конвенция. Компилятор не распознает их специально или что-то в этом роде.

Геттер, например public String getFirstName() {return this.name;}, является всего лишь методом, возвращающим значение поля.

Комплект, например. public void setFirstName(String name) {this.name=name;} - это просто метод, который задает значение поля для его аргумента.

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

 

Вы создали метод, который:

  • Устанавливает значение поля name в качестве аргумента.
  • Возвращает значение поля name.

Ничего страшного в этом, это совершенно правильный метод.
Полезен ли он как сеттер? Конечно, он устанавливает значение.
Полезен ли он как геттер? Нет, скажи мне, как бы ты использовал его, чтобы получить имя человека?
Но это вполне допустимый метод, и это не «правильно» или «неправильно», это просто не особенно полезно.

+0

Спасибо за ваш ответ. – FrankTby

0

Сеттеров и добытчики должны быть надлежащим образом реализованы, поскольку некоторые структуры зависят от них собственно. функционирование.

Смазочные фреймворки, такие как Mockito, DI frameworks и некоторые методы сериализации XML, зависят от методов set и get.

Смежные вопросы