Was ist für ein boolesches Feld die Namenskonvention für seinen Getter / Setter?

177

Z.B.

boolean isCurrent = false;

Wie nennt man Getter und Setter?

user496949
quelle
2
Ich gehe davon aus, dass Sie sich auf JavaBeans beziehen. In diesem Fall ist die Antwort von @Jigar Joshi richtig. Wenn Sie jedoch nach generischen Getter / Setter fragen, besteht die einzige Konvension darin, dass die Methoden den Feldnamen enthalten und der Getter keine Argumente und einen Wert zurückgibt, der Setter ein Argument und keinen Wert zurückgibt oder das Objekt selbst zurückgibt. Siehe Buffer als Beispiel für einen anderen Ansatz für Getter / Setter.
Peter Lawrey

Antworten:

253

Angenommen, Sie haben

boolean active;

Accessors Methode wäre

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

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

Siehe auch

Jigar Joshi
quelle
9
Könnten Sie auf den Abschnitt der Code-Konventionen von Sun verweisen, in dem boolesche Getter-Namen speziell behandelt werden? Ich konnte es nicht finden.
Konstantin Pelepelin
3
Ich habe eine boolesche Datei mit dem Namen hasCustomName. Was soll ich nun für die Getter- und Setter- Methoden nennen? Ist setHasCustomName[setter]und hasCustomName[getter]gut?
Hadi
@Hadi benenne einfach deine Variable "customerName" und generiere getter n setter dafür. Erwartete Getter und Setter sind public boolean isCustomerName(){return this.customerName;} public void setCustomerName(boolean customerName){this.customerName= customerName;}
Assegd
1
Wie sind wir vom benutzerdefinierten Namen zum Kundennamen gekommen? ;)
Kartik Chugh
1
@Assegd Die Bezeichnung "customerName" oder "customName" ist verwirrend und bedeutet nicht, dass es boolesch ist. Wenn ich die Variable sehe, würde ich erwarten, dass sie einen Namen enthält. In diesem Fall sollte es IMO "hasCustomName" heißen.
Nathan
82

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

  1. is Das Präfix sollte für boolesche Variablen und Methoden verwendet werden.

    isSet, isVisible, isFinished, isFound,isOpen

Dies ist die Namenskonvention für boolesche Methoden und Variablen, die Sun für die Java-Kernpakete verwendet. Die Verwendung des Präfixes is löst ein häufiges Problem bei der Auswahl fehlerhafter boolescher Namen wie Status oder Flag. isStatus oder isFlag passen einfach nicht und der Programmierer ist gezwungen, aussagekräftigere Namen zu wählen.

Setter-Methoden für boolesche Variablen müssen das Präfix wie folgt gesetzt haben:

void setFound(boolean isFound);

Es gibt einige Alternativen zum Präfix is, die in bestimmten Situationen besser passen. Diese Präfixe haben, können und sollten:

boolean hasLicense(); 
boolean canEvaluate(); 
boolean shouldAbort = false;
Narayan
quelle
7
Wenn es also die boolesche Eigenschaft gibt hasData, wie würde der Setter aussehen? setData(bool hasData)Sieht für mich mit Sicherheit furchtbar falsch aus ...
Franz B.
7
@FranzB. Ich würde setHasData (...)
user362178
2
Für diejenigen, die Java Beans specifcation wollen folgt, scheint es , dass has, can, shouldPräfixe nicht Teil der Spezifikation sind. Referenz JavaBeans Specification 1.01 Abschnitt 8.3.
VCD
@ Andrew Hallo. Wenn ich in meiner Variablen das Präfix 'is' verwende und den Wert dieser Variablen aus meiner js-Datei in den Daten sende, erhalte ich immer den Wert false. Und wenn ich das Präfix 'is' entferne, funktioniert es absolut einwandfrei. Was kann der Grund dafür sein? Danke im Voraus.
Me_developer
1
Der Setter ist unkompliziert, für den Getter, den ich boolean isIsCurrent(){...}sonst verwenden musste, beschwerte sich das Framework, mit dem das Objekt deserialisiert wurde getter not found for property isCurrent.
Maurizio Lo Bosco
67

Für ein benanntes Feld isCurrentlautet die korrekte Getter- / Setter-Benennung setCurrent()/ isCurrent()(zumindest denkt Eclipse das), was sehr verwirrend ist und auf das Hauptproblem zurückgeführt werden kann:

Ihr Feld sollte nicht isCurrentan erster Stelle aufgerufen werden . Is ist ein Verb und Verben sind unangemessen, um den Zustand eines Objekts darzustellen. Verwenden Sie stattdessen ein Adjektiv, und plötzlich sind Ihre Getter- / Setter-Namen sinnvoller:

private boolean current;

public boolean isCurrent(){
    return current;
}

public void setCurrent(final boolean current){
    this.current = current;
}
Sean Patrick Floyd
quelle
4
Was ist, wenn der Boolesche Wert kein Primitiv ist? Wenn es Boolesch ist, sollte es ein Get sein oder ist es?
Arun
2
Nein, eine solche Methode könnte null zurückgeben, was eine NullPointerException verursachen würde. Aber ich würde versuchen zu vermeiden, Boolean überhaupt zurückzukehren
Sean Patrick Floyd
3
@Arun Ich denke, es sollte stattdessen gesetzt / get werden, wenn gesetzt / ist, weil Boolean ein Objekt anstelle von primitiv ist, weil es 3 Statistiken hat, false, true oder null.
Al-Mothafar
1
IntelliJ verwendet standardmäßig das getPräfix, wenn ein Booleanvs isfür aboolean
jocull
1
@jocull und das ist das richtige Verhalten gemäß der JavaBeans-Spezifikation
Sean Patrick Floyd
6

Ich glaube es wäre:

void setCurrent(boolean current)
boolean isCurrent()
miku
quelle
1
Ich mag diese Konvention, aber Konventionen spielen keine Rolle. Am wichtigsten ist es, bei dem zu bleiben, den Sie gewählt haben.
Clement Herreman
4
@ Clement-Konventionen sind wichtig, wenn Sie sich auf Tools verlassen, die diese Konventionen verwenden. JavaBeans ist eine Konvention mit umfassender Unterstützung in zahlreichen Bibliotheken (JSP / JSF / Spring / Groovy, um nur einige zu nennen). Die Konventionen zu brechen bedeutet, die Funktionsweise dieser Bibliotheken zu brechen.
Sean Patrick Floyd
1
@ Sean Right, mit Ausnahme von Frameworks, die sich auf Konventionen zur Konfiguration stützen. In diesem Fall werden vom Framework Konventionen auferlegt, sodass Sie nichts auswählen. Gute Bemerkung.
Clement Herreman
5

Vielleicht ist es an der Zeit, diese Antwort zu überarbeiten? Persönlich würde ich stimmen setActive()und unsetActive()(Alternativen sein können setUnActive(), notActive(), disable()etc. je nach Kontext) , da „setActive“ bedeutet , dass Sie aktivieren es zu allen Zeiten, die Sie nicht tun. Es ist irgendwie kontraintuitiv, "setActive" zu sagen, aber den aktiven Zustand tatsächlich zu entfernen.

Ein weiteres Problem ist, dass Sie ein SetActive-Ereignis nicht auf CQRS-Weise spezifisch abhören können. Sie müssten ein 'setActiveEvent' abhören und in diesem Listener feststellen, ob es tatsächlich aktiv ist oder nicht. Oder bestimmen Sie natürlich, welches Ereignis beim Anruf aufgerufen werden soll, setActive()aber das widerspricht dann dem Prinzip der Trennung von Bedenken.

Eine gute Lektüre dazu ist der FlagArgument-Artikel von Martin Fowler: http://martinfowler.com/bliki/FlagArgument.html

Ich komme jedoch aus einem PHP-Umfeld und sehe, dass dieser Trend immer mehr übernommen wird. Ich bin mir nicht sicher, wie viel das mit der Java-Entwicklung zu tun hat.

Christian Vermeulen
quelle
-1
private boolean current;

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

public boolean hasCurrent(){
    return this.current;
}
Mkne
quelle
3
hat aktuell was? Ich denke has, für BO oder einen solchen Dienst mit etwas Verarbeitung verwendet, während es für POJO ist is. und bitte fügen Sie eine Beschreibung Ihrer Antwort hinzu.
Al-Mothafar
-3
Setter: public void setCurrent(boolean val)
Getter: public boolean getCurrent()

Für Boolesche Werte können Sie auch verwenden

public boolean isCurrent()
Suraj Chandran
quelle
11
Weil das OP eine Frage zu booleschen Werten stellt. Ein Getter mit dem Präfix 'get' wird (read: should) niemals für boolesche Werte verwendet.
Harold
-4

Wie wäre es als Setter mit:

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

oder

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

Ich bin mir nicht sicher, ob diese Benennung für englische Muttersprachler sinnvoll ist.

Amekusa
quelle
1
Sie machen nicht wirklich
Sinn
Aber klingt phonetisch vielleicht vielversprechend mit einigen Attributen :)
seba.wagner