Достоинства / Причины использования «get» в качестве префикса в имени метода доступа - PullRequest
7 голосов
/ 09 октября 2009

Я знаю, что в Java обычной практикой является использование "get" в качестве префикса для метода доступа. Мне было интересно, какова причина для этого. Это просто чтобы быть в состоянии предсказать, что это возвращает?

Чтобы уточнить: В некоторых классах Java (например, String) переменная типа length может быть вызвана вызовом "length ()", а не "size()". Почему эти методы написаны так, а другие как "getSomeVariable()"?

Спасибо, что уделили время.

Редактировать: Приятно видеть, что я не одинок из-за путаницы, а также из-за переменных размера и длины

Ответы [ 6 ]

8 голосов
/ 09 октября 2009

Префикс 'get' (или 'is' для методов, возвращающих логические значения) является частью спецификации JavaBean , которая используется в Java, но в основном в представлениях в веб-интерфейсе.

length () и size () - исторические артефакты до-джавабейских времен; многие разработчики пользовательского интерфейса сетуют на то, что в Collection есть метод size() вместо getSize()

7 голосов
/ 09 октября 2009

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

Возможно, имеет смысл сказать:

String txt="I have " + car.GetFuelLevel() + " liters of petrol.";

или ...

String txt="I have " + car.FuelLevel + " liters of petrol.";

но не ...

String txt="I have " + car.FuelLevel() + " liters of petrol.";

Я имею в виду, что не имеет смысла говорить: «Эй, машина. Но сказать: «Эй, машина. Иди GetFuelLevel для меня». Это более естественно.

Теперь, почему они потеряли ранг с String.length () и другими? Меня это тоже всегда беспокоило.

5 голосов
/ 09 октября 2009

Префикс get особенно полезен, если у вас также есть методы set, add, remove и т. Д. Конечно, обычно лучше иметь интерфейс, заполненный get с или set с. Если почти каждый метод имеет get, то он просто становится шумом. Таким образом, я бы отбросил get для неизменяемых и set для строителей. Для «фундаментальных» типов, таких как коллекции и строки, эти маленькие слова также шумят, ИМО.

4 голосов
/ 09 октября 2009

Соглашения get / set основаны на спецификации Java Bean . Так что люди сильно склонны использовать это.

И атрибуты массивов .size (), .length () и даже .length являются примерами неспособности Java следовать своим собственным соглашениям. Их гораздо больше, их "весело" открывать!

2 голосов
/ 09 октября 2009

Это могут быть ошибки в спецификации, однако они улучшают читабельность. Размер и длина позволяют прочитать следующую строку кода:

for (int i=0; i<thing.size(); ++i){ 

Как ...

Хотя я меньше размера вещи ...

За этим нет никакого реального соглашения, но оно облегчает прямой перевод в предложение.

1 голос
/ 09 октября 2009

Историческая причина заключалась в том, что в спецификации JavaBean указывалось, что средства доступа к свойствам класса должны выполняться с помощью getPropertyName / setPropertyName. Преимущество заключается в том, что вы можете использовать API-интерфейсы Introspection для динамического отображения свойств объекта, даже того, который вы ранее не компилировали в свою программу. Примером того, где это было бы полезно, является создание архитектуры подключаемого модуля, которая должна загружать объекты и предоставлять пользователю доступ к свойствам объекта.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...