2008-11-24 7 views
22

Wenn Sie wissen möchten, wo ein boolescher Wert nicht festgelegt wurde (z. B. wenn der nicht festgelegte Wert von einem Parent-Wert erben soll), und das Äquivalent in anderen Sprachen) ist eindeutig nicht angemessen.Die beste Methode zum Definieren von True, False und Unset

Was ist die beste Vorgehensweise, um dies zu erreichen? Definieren Sie eine neue einfache Klasse, die alle drei Zustände ausdrücken kann, oder verwenden Sie die Java-Boolesche Klasse und verwenden Sie null, um den unscharfen Zustand anzuzeigen?

+19

Wie http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx natürlich :) –

+1

Ich würde diesen Kommentar upvote wenn ich könnte. –

Antwort

37

Ich würde das verwenden. Es ist das Einfachste.

Eine andere Möglichkeit ist die Verwendung einer Aufzählung. Vielleicht ist es noch besser und schneller, da keine Boxen erforderlich:

public enum ThreeState { 
    TRUE, 
    FALSE, 
    TRALSE 
}; 

Dort wird der Vorteil der ersten ist, dass Benutzer Ihrer Klasse nicht über Ihre Drei-Zustand boolean zu kümmern braucht. Sie können immer noch true und false übergeben. Wenn Sie die null nicht mögen, da es hier wenig über seine Bedeutung aussagt, können Sie trotzdem einen public static final Boolean tralse = null; in Ihrer Klasse machen.

+10

Die Daily WTF Website sagt, dass der 3. Wert "FILE_NOT_FOUND" heißen sollte. Siehe: http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx – Darron

+1

Ich würde mit dem Boolean gehen, mich selbst. Das ganze TRUE, FALSE, FILE_NOT_FOUND/TRALSE Ding bittet nur um Ärger. –

+0

Schlechtes Design. Erstelle ein Tristate-Objekt. Instanziieren Sie es mit dem übergeordneten Element, um die Vererbung von Werten zu automatisieren, wenn Sie "unset" auswählen. Andernfalls wird der Test-/Verwendungsparent im gesamten Code verteilt. –

10

Obwohl es nicht Java-spezifisch ist, ist meine eigene Vorliebe in diesem Szenario, eine ThreeState-Klasse oder -Enumeration zu definieren und sie zu verwenden - genau wie erwähnt, ein True, ein False und ein Undefined (oder Default oder Unset, als Ihre domänenspezifische Terminologie diktiert). Es fühlt sich besser, natürlicher und selbstdokumentierender an, als wenn man es mit null darstellt.

+0

Dies ist absolut der Weg zu gehen. Außerdem können Sie in Ihrer Klasse auf "Parent" verweisen, sodass Sie automatisch dessen Status übernehmen können. Andernfalls haben Sie den Code "erben" in Ihrem Code verteilt (nicht DRY). –

+0

Bill, was zum Teufel meinst du mit "Eltern"? –

-3

java.lang.Boolean tut dies für Sie. Es gibt statische Konstanten Boolean.TRUE, Boolean.False.

private Boolean myBoolean;

sollten alle Sie need.Note dass Boolean.TRUE wird eine Äquivalenzprüfung bestehen, aber unterscheidet sich von „true“ (was auf TRUE autoboxed wird).

8

Die Nullable boolean bekommt meine Stimme

1

Es kommt darauf an. Hier erwähnen Sie, dass es nicht gesetzt wäre, wenn es seinen Wert von einem Elternwert erben müsste. Haben Sie eine Art Datenhierarchie? Etwas wie folgt aus:

Parent a { 
    boolean val = true; 
    boolean val2 = false; 
} 
Child b { 
    boolean val = false; 
    //here val2 should be unset! 
} 

In diesem Fall, wenn es möglich ist, würde ich einfach nicht sagen, val2 im Kindes verbunden sind, haben Ihre Lookup-Logik so sein, dass, wenn es nicht die Variable nicht finden, es sucht die Eltern nach dem Wert.

4

Nullen zu verwenden, um den Zustand von etwas darzustellen, ist schlechtes Design. Es ist nicht beschreibend und schwer zu pflegen. Ich hätte lieber ein Zustandsobjekt mit einem Standardzustand, wenn nichts explizit darauf festgelegt wurde. Zum Beispiel:

if(state == null) { 
    doSomething(); 
} 

Dies sagt mir nichts über den erwarteten Zustand. Etwas Ähnliches macht es klarer.

if(state.awaitingSet()) { 
    doSomething(); 
} 

Ganz zu schweigen von erweiterbar. Was passiert, wenn Sie einen vierten Zustand benötigen?

-1

In der übergeordneten Klasse initiieren die boolean in der untergeordneten Klasse auf null und ein Verfahren bauen zu überprüfen, um zu sehen, ob die boolean

in Übergeordnete Klasse

private Boolean a = null; 

public void setA(Boolean a) { 
    this.a = a; 
} 


public Boolean getA() { 
    return a; 
} 

In der Kinderklasse

gesetzt wurde
if (a == true) 
{ 
dothis; 
} 
else if (a == false) 
{ 
dothat; 
} 
else 
{ 
assert false : "Boolean a has not been set"; 
} 

Stellen Sie sicher, dass Assertions aktiviert sind. Behauptungen gelten nur für den Entwicklungszyklus und Testzyklus, sie sind nicht für Laufzeitausnahmen.

8

In Java 8 gibt auch die Optional Option ist:

public static final Optional<Boolean> TRI_TRUE = Optional.of(true); 
public static final Optional<Boolean> TRI_FALSE = Optional.of(false); 
public static final Optional<Boolean> TRI_UNKNOWN = Optional.empty(); 

Als Bonus erhalten Sie alle jene Karte bekommen und Methoden verbrauchen.

+0

Wenn Java 8 nicht verwendet werden kann, aber Guava vorhanden ist, kann stattdessen 'com.google.common.base.Optional' verwendet werden. – thee

1

Ich würde einfach eine int (ganze Zahl) mit Werten 0,1,2 und behandeln innerhalb des Programms.

Verwandte Themen