2012-03-17 3 views
1

У меня есть переменная называетсяПолучает ли геттер с другим типом возвращаемого типа в качестве геттера?

List<String> names;

, если у меня есть метод, как

Iterator getNames() { return names.iterator(); }

Является ли это технически еще метод геттер, потому что я изменил его на итератор?

+2

Я не понимаю, почему не – Jeffrey

+0

Я спрашиваю, потому что это не отображается под кодом, который охватывается моими модульными тестами. Так что я в дилемме, нужно ли мне написать единичный тестовый пример или нет? Потому что мы вообще не пишем тестовые примеры для Getters и Setters правильно? – sriram

ответ

4

Даже если JDK это позволяет, не очень хорошая идея, чтобы сделать это.

Во-первых, существуют соглашения, основанные на наименовании ваших методов, которые имеют некоторые зависимости от них.

  1. Объекты JavaBean используют геттеры и сеттеры для установки свойств бобов. Если они не согласятся на соглашение, программа завершится неудачно. См. JavaBeans spec, section 8.3.1

  2. Объекты JSON - класс JSONObject использует методы доступа в конструкторе. ))

  3. Некоторые реализации JPA будут неправильно обрабатывать классы объектов, если у них есть несколько геттеров с одинаковым именем, но с разными типами возвратов.

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

2

Кажется, это плохая идея для меня с точки зрения дизайна.

Я бы просто получил геттер public List<String> getNames().

Для «безопасной публикации», вы должны рассмотреть возможность возвращения в копии списка в реализации:

public List<String> getNames() { 
    return new ArrayList<String>(names); 
} 
+1

[unmodifiable list] (http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#unmodifiableList (java.util.List)) не будет ужасной идеей ,Это остановит того, кто звонит вашему получателю, думая, что они могут добавлять/изменять имена через «Список», которые они получают, в отличие от правильных методов в вашем классе. – Jeffrey

+0

Да, но если мы вернем список, метод, который использует это, также должен быть списка типов. В будущем, если мы изменим тип переменной, чтобы сказать массив в более поздний момент времени. Это означало бы, что мне нужно изменить тип возвращаемого метода getter. Это, в свою очередь, повлияло бы на метод, который его использует. – sriram

2

Если класс будет интроспектирован некоторым инструментом фасоли, GetNames() должен возвращать имена. Для ясности, назовем его, что это такое:

getNamesIterator(); 
1

Вы думаете о другом. Метод формы getXxx является геттером. Соглашения Java не подразумевают, что у вас должно быть поле с именем xxx. Это ваш бизнес класса, и инкапсуляция обеспечивает просто: способность скрывать ваши структуры данных к другим классам.

Извините за опечатки, мобильный ..

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