Каков правильный синтаксис для "is" переменных getter/setters в классе POJO?

Если класс содержит переменную с именем "blah", то стандартный синтаксис getter/setter, очевидно, getBlah() и setBlah(). Но если у меня есть класс POJO с переменной с именем isBlah, я бы использовал:

public type getIsBlah() {
  return isBlah;
}

public setIsBlah(type isBlah) {
  this.isBlah = isBlah;
}

Или это будет?

public type isBlah() {
  return isBlah;
}

public setBlah(type blah) {
  this.isBlah = blah;
}

Первое, по-видимому, более строго соответствует соглашениям POJO, но второй тип - это то, что генерирует IntelliJ, если я попрошу его создать класс getter/setters (и hey, IntelliJ еще не подвела меня:]). Итак, какой предпочтительный синтаксис?

Ответы

Ответ 1

Одной из причин использования свойств является отключение API от реализации. Другими словами, вы не должны чувствовать привязанность к тому, что называется вашей частной переменной. Это не должно указывать на именование, не пытаясь сохранить его для чтения для поддерживающих код.

Я бы сказал, что если "type" boolean в этом случае, то вторая форма верна. Если это не boolean, вы должны использовать getXXX - но я, вероятно, не использовал бы getIsXXX. Для меня "есть" имеет очень сильное соответствие с булевыми свойствами, и использование его в других контекстах не только нарушит соглашения JavaBeans (которые могут повлиять на другие инструменты), но и будет вводить в заблуждение IMO.

Ответ 2

Обратите внимание, что имя поля совершенно не соответствует спецификации JavaBean. Используются только имена геттера/сеттера.

Обычно имя получателя get<PropertyName>(). Только для boolean свойств is<PropertyName>() разрешено в качестве альтернативы.

Обратите внимание, что в вашем примере имя свойства Bean - это "Бла", когда вы вызываете getter isBlah(), и это "IsBlah", когда вы вызываете ваш getter getIsBlah().

Лично я обычно предпочитаю isBlah().

Ответ 3

Не сказал бы там сильного соглашения для POJO, но для JavaBeans второй (IntelliJ) пример является стандартом для логических атрибутов, все остальное использует getX.

Ответ 4

Есть одна большая проблема с синтаксисом "есть", если вы используете JSTL, а JSTL EL не распознает их. Это довольно глупо, но дизайнеры JSTL EL не потрудились проверить свою логику соответствия javabeans.

Я часто нахожу себя в методах getIsBlah() в своих классах уровня представления, которые вызывают isBlah(), чтобы просто дать JSTL крючок. Это ужасно.

Ответ 5

Я бы тоже выбрал второй вариант. Первый, с getIsBlah() кажется многословным и избыточным.

Ответ 6

Оба "get" и "is" на самом деле хороши, поскольку они технически все еще приемлемы в соответствии с соглашением JavaBeans. Я бы выбрал то, что звучит лучше или естественнее, в зависимости от того, на каком слове ваш "Бла" на самом деле.

Ответ 7

JSTL разрешает только isMyBool, если он является логическим, а не булевым или любым другим объектом, согласно спецификации bean. (примитивный объект vs).

Ответ 8

Это означает, что JAXB генерирует неверный код. Он создает свойства Boolean, потому что они должны быть нулевыми, но все равно называет их getters isXXX(), что нарушает спецификацию Bean.