Для логического поля, каково соглашение об именах для его метода получения / установки?

178

Например.

boolean isCurrent = false;

Что вы называете его геттером и сеттером?

user496949
источник
2
Я предполагаю, что вы ссылаетесь на JavaBeans, и в этом случае ответ @Jigar Joshi является правильным. Однако, если вы спрашиваете об общих методах получения / установки, единственное соглашение состоит в том, что методы содержат имя поля, а получатель не принимает аргументов и возвращает значение, установщик принимает один аргумент и не возвращает значения или возвращает сам объект. Посмотрите Buffer как пример другого подхода к получателю / установщику.
Питер Лори

Ответы:

255

Предположим, у вас есть

boolean active;

Метод доступа будет

public boolean isActive(){return this.active;}

public void setActive(boolean active){this.active = active;}

Смотрите также

Джигар Джоши
источник
9
Не могли бы вы указать раздел соглашений Sun о кодах, где конкретно рассматриваются логические имена получателей? Я не мог найти это.
Константин Пелепелин
4
У меня есть логический поданный по имени hasCustomName, теперь , что я должен назвать для его геттерных и инкубационных метод? Это setHasCustomName[setter]и hasCustomName[getter]хорошо?
Хади
@Hadi просто назови свою переменную customerName и сгенерируй для нее метод getter n. Ожидаемый геттер и сеттеры public boolean isCustomerName(){return this.customerName;} public void setCustomerName(boolean customerName){this.customerName= customerName;}
Assegd
1
как мы перешли от обычного имени к имени клиента? ;)
Картик Чуг
1
@Assegd Именование его «customerName» или «customName» сбивает с толку и не означает, что оно логическое. Видя переменную, я ожидал, что она будет содержать имя. В этом случае он должен называться «hasCustomName» IMO.
Натан
83

http://geosoft.no/development/javastyle.html#Specific

  1. is Префикс должен использоваться для логических переменных и методов.

    isSet, isVisible, isFinished, isFound,isOpen

Это соглашение об именах для логических методов и переменных, используемых Sun для базовых пакетов Java. Использование префикса is решает распространенную проблему выбора неправильных логических имен, таких как status или flag. isStatus или isFlag просто не подходят, и программист вынужден выбирать более значимые имена.

Методы установки для логических переменных должны иметь префикс установки как в:

void setFound(boolean isFound);

Есть несколько альтернатив префиксу is, который лучше подходит в некоторых ситуациях. Эти префиксы имеют, могут и должны:

boolean hasLicense(); 
boolean canEvaluate(); 
boolean shouldAbort = false;
Нараян
источник
7
Итак, если есть логическое свойство hasData, как будет выглядеть сеттер? Скорее всего, setData(bool hasData)выглядит ужасно неправильно для меня ...
Франц Б.
7
@FranzB. Я бы использовал setHasData (...)
user362178
2
Для тех , кто хочет следующий JavaBeans Specifcation, кажется , что has, can, shouldпрефиксы не являются частью спецификации. Ссылка на спецификацию JavaBeans 1.01 раздел 8.3.
VCD
@ Андрей привет. Когда я использую префикс «is» в моей переменной и отправляю значение этой переменной из моего js-файла в данных, он всегда дает мне значение как false. И если я удаляю префикс «is», то он работает абсолютно нормально. Что может быть причиной этого? Заранее спасибо.
Me_developer
1
Сеттер является простым, поскольку геттер, который я должен был использовать, в boolean isIsCurrent(){...}противном случае, структура, используемая для десериализации объекта, жаловалась getter not found for property isCurrent.
Маурицио Ло Боско
67

Для именованного поля isCurrentправильное именование получателя / установщика - это setCurrent()/ isCurrent()(по крайней мере, так думает Eclipse), что сильно сбивает с толку и может быть связано с основной проблемой:

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

private boolean current;

public boolean isCurrent(){
    return current;
}

public void setCurrent(final boolean current){
    this.current = current;
}
Шон Патрик Флойд
источник
4
Что если логическое значение не является примитивным? Если это логическое значение, то должно ли это быть get или is?
Арун
2
Нет, такой метод может вернуть значение null, что приведет к исключению NullPointerException. Но я бы постарался не возвращать логическое значение в первую очередь
Шон Патрик Флойд
3
@Arun Я думаю, что следует установить / получить вместо этого, если set / is, потому что Boolean - это объект, а не примитив, потому что он имеет 3 характеристики: false, true или null.
Аль-Мотафар
1
IntelliJ по умолчанию использует getпрефикс при получении Booleanvs isдляboolean
jocull
1
@jocull, и это правильное поведение, согласно спецификации JavaBeans
Шон Патрик Флойд
6

Я верю, что это будет:

void setCurrent(boolean current)
boolean isCurrent()
Мик
источник
1
Мне нравится это соглашение, но соглашения не имеют большого значения. Самое главное - придерживаться того, который вы выбрали.
Клемент Херреман,
4
@Clement конвенции делать дело , когда вы будете полагаться на инструменты , которые используют эти конвенции. JavaBeans - это соглашение с широкой поддержкой множества библиотек (JSP / JSF / Spring / Groovy и другие). Нарушение соглашений означает нарушение работы этих библиотек.
Шон Патрик Флойд
1
@Sean Право, исключение для фреймворка, основанного на соглашениях о конфигурации. В этом случае соглашения накладываются рамками, поэтому вы ничего не выбрали. Хорошее замечание
Клемент Херреман,
5

Может быть, пришло время начать пересмотр этого ответа? Лично я бы голосовать за setActive()и unsetActive()(варианты могут быть setUnActive(), notActive(), disable()и т.д. в зависимости от контекста) , так как «SetActive» означает , что вы включите его в любое время, что вы этого не делаете. Отчасти интуитивно понятно сказать «setActive», но фактически удалить активное состояние.

Другая проблема заключается в том, что вы не можете слушать конкретно событие SetActive CQRS, вам нужно будет прослушать setActiveEvent и определить внутри, действительно ли активирован или нет прослушиватель. Или, конечно, определить, какое событие вызывать при вызове, setActive()но это противоречит принципу разделения интересов.

Хорошая статья по этому вопросу - статья Мартина Фаулера, посвященная FlagArgument: http://martinfowler.com/bliki/FlagArgument.html.

Тем не менее, я пришел из PHP и вижу, что эта тенденция все больше и больше используется. Не уверен, сколько это живет с разработкой Java.

Кристиан Вермейлен
источник
-1
private boolean current;

public void setCurrent(boolean current){
    this.current=current;
}

public boolean hasCurrent(){
    return this.current;
}
Mkne
источник
3
имеет ток что? Я думаю, что hasиспользуется для BO или такого сервиса с некоторой обработкой, в то время как для POJO это так is. и, пожалуйста, добавьте описание вашего ответа.
Аль-Мотафар
-3
Setter: public void setCurrent(boolean val)
Getter: public boolean getCurrent()

Для логических значений вы также можете использовать

public boolean isCurrent()
Сурадж Чандран
источник
11
Потому что ОП формулирует вопрос о булевых значениях. Получатель с префиксом 'get' никогда не будет использоваться для логических значений (читай: должен).
Гарольд
-4

Как сеттер, как насчет:

// setter
public void beCurrent(boolean X) {
    this.isCurrent = X;
}

или

// setter
public void makeCurrent(boolean X) {
    this.isCurrent = X;
}

Я не уверен, имеют ли эти названия смысл для носителей английского языка.

amekusa
источник
1
Они действительно не имеют
смысла
Но звучит фонетически, возможно, многообещающе с некоторыми атрибутами :)
seba.wagner