Що стосується булевого поля, яка умова іменування для його геттера / сетера?


178

Напр.

boolean isCurrent = false;

Як ви називаєте його геттер і сетер?


2
Я припускаю, що ви посилаєтесь на JavaBeans, і в цьому випадку відповідь @Jigar Joshi правильна. Однак якщо ви запитуєте про загальний геттер / сеттер, єдине скликання полягає в тому, що методи містять ім'я поля, і геттер не приймає аргументів і повертає значення, сеттер приймає один аргумент і не повертає значення або не повертає сам об'єкт. див. буфер як приклад іншого підходу до геттерів / сеттерів.
Пітер Лорі

Відповіді:


255

Припустимо, у вас є

boolean active;

Метод аксесуарів був би

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

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

Дивитися також


9
Чи можете ви вказати на розділ кодових угод Sun, де спеціально висвітлюються булеві назви гетерів? Я не міг її знайти.
Костянтин Пелепелін

4
У мене зареєстровано булеву назву hasCustomName, тепер що мені потрібно назвати для методів getter та setter ? Хіба setHasCustomName[setter]і hasCustomName[getter]добре?
Хаді

@Hadi просто назвіть свою змінну "customerName" та генеруйте для неї getter n setter. Очікувані public boolean isCustomerName(){return this.customerName;} public void setCustomerName(boolean customerName){this.customerName= customerName;}
геттери

1
як ми перейшли від власного імені до імені клієнта? ;)
Kartik Chugh

1
@Assegd Назва його "customerName" або "customName" є заплутаним і не означає, що воно булеве. Побачивши змінну, я очікував би, що вона містить ім'я. У цьому випадку його слід називати IMO "hasCustomName".
Натан

83

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

  1. is префікс слід використовувати для булевих змінних та методів.

    isSet, isVisible, isFinished, isFound,isOpen

Це умова іменування для булевих методів та змінних, які Sun використовує для основних пакетів Java. Використання префікса is вирішує загальну проблему вибору поганих булевих імен, таких як статус або прапор. 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

@Andrew привіт. Коли я використовую префікс 'є' у своїй змінній і надсилаю значення цієї змінної з мого js-файлу в дані, він завжди дає мені значення як помилкове. І якщо я видаляю префікс 'є', він працює абсолютно чудово. Що може бути причиною цього? Заздалегідь спасибі.
Me_developer

1
Сеттер простий, тому що геттер мені довелося використовувати в boolean isIsCurrent(){...}іншому випадку рамки, які використовуються для деріаріалізації об'єкта, скаржився getter not found for property isCurrent.
Мауріціо Ло Боско

67

Для імені поля isCurrentправильне іменування getter / setter - це setCurrent()/ isCurrent()(принаймні, так вважає Eclipse), що дуже заплутано і може бути простежено до основної проблеми:

Ваше поле не слід називати isCurrentв першу чергу. Є чи це дієслово і дієслова є невідповідними для подання стану об'єкта. Використовуйте замість цього прикметник, і раптом ваші імена гетьер / сетер матимуть більше сенсу:

private boolean current;

public boolean isCurrent(){
    return current;
}

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

4
Що робити, якщо булевий не примітив? Якщо це Boolean, чи слід це отримати чи є?
Арун

2
Ні, такий метод може повернути null, що призведе до NullPointerException. Але я б спробував у першу чергу уникнути повернення булевого
Шон Патрік Флойд

3
@Arun Я думаю, що його слід встановити / отримати замість, якщо set / є через 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 Right, за винятком рамки, яка спирається на конвенції щодо конфігурації. У цьому випадку конвенції накладаються рамками, тому ви нічого не вибираєте. Гарне зауваження.
Климент Ерреман

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;
}

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;
}

Я не впевнений, чи мають ці найменування сенс для носіїв англійської мови.


1
Вони насправді не мають сенсу
Янньоел

Але звучить фонетично, можливо, багатообіцяюче:
seba.wagner
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.