Frage

Wenn Sie eine Situation, wo Sie wissen müssen, wo ein boolescher Wert nicht gesetzt wurde (zum Beispiel, wenn die nicht gesetzt Wert von einem übergeordneten Wert erben soll), um die Java boolean primitive (und das äquivalent in anderen Sprachen) ist eindeutig nicht ausreichend.

Was ist die beste Praxis, dies zu erreichen? Definieren Sie eine neue einfache Klasse, die zum Ausdruck zu bringen alle drei Zustände fähig ist oder die Java-Boolean-Klasse verwenden und null unscharfen Zustand, um anzuzeigen?

War es hilfreich?

Lösung

Boolean a = true;
Boolean b = false;
Boolean c = null;

Das würde ich verwenden. Es ist das ziemlich einfach.

Eine andere Möglichkeit ist eine Aufzählung zu verwenden. das ist noch besser und schneller vielleicht, da kein Boxen erforderlich:

public enum ThreeState {
    TRUE,
    FALSE,
    TRALSE
};

Es ist der Vorteil der ersten, dass die Benutzer Ihrer Klasse nicht über Ihren Drei-Zustand boolean zu kümmern brauchen. Sie können nach wie vor true und false passieren. Wenn Sie nicht den null mögen, da es hier eher wenig über seine Bedeutung erzählt, kann man noch einen public static final Boolean tralse = null; in Ihrer Klasse machen.

Andere Tipps

In Java 8, gibt es auch die Optional :

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 Karte und verbrauchen Methoden.

Obwohl es nicht Java-spezifische, meine eigenen Vorlieben in diesem Szenario ist es, eine Klasse oder Threestate-Enumeration zu definieren und verwenden - so wie Sie erwähnt haben, eine wahre, eine falsche und eine nicht definierte (oder Standard oder entschärft, als domänenspezifische Terminologie diktiert). Es fühlt sich besser, natürliche und selbsterklärend als repräsentierte ungesetzt / undefined mit null.

Die @Nullable Boolean bekommt meine Stimme.

nulls Mit dem Zustand von etwas darzustellen, ist schlechtes Design. Es ist undescriptive und schwer zu pflegen. Ich würde eher einen Staat Objekt mit einem Standardzustand, wenn nichts auf sie explizit festgelegt wurde. Zum Beispiel:

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

Das hat mir nichts gesagt über das, was der erwarteten Zustand ist. Etwas mehr wie das macht es klarer.

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

Ganz zu schweigen erweiterbar. Was passiert, wenn Sie brauchen einen vierten Zustand?

Es hängt davon ab. Hier erwähnen Sie es nicht gesetzt sein würde, wenn er seinen Wert von einem übergeordneten Wert erben. Haben Sie irgendeine Art von Datenhierarchie haben? So 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, ist es, die Eltern für den Wert sucht.

Ich würde einfach eine int verwenden (integer) mit Werten 0,1,2 und Griff innerhalb Programms.

Hinzufügen @voho, Optional auch schön mit Lambda spielt, eine potentiell saubere Struktur machen:

public class Node {
  private Node parent;
  private Optional<Boolean> something = Optional.empty();

  public boolean isSomething() {
    return something.orElseGet(() -> {
      if (parent != null)
        return parent.isSomething();
      return false;
    });
  }

  public void setSomething(boolean v) {
    this.something = Optional.of(v);
  }
}

Es ist jedoch immer noch nicht offensichtlich, dass viel besser als Boolean und eine Null-Kontrolle:

public class Node {
  private Node parent;
  private Boolean something;

  public boolean isSomething() {
    if (something != null)
      return something;
    if (parent != null)
      return parent.isSomething();
    return false;
  }

  public void setSomething(boolean v) {
    this.something = v;
  }
}

In der übergeordneten Klasse initiieren die boolean auf null und in der untergeordneten Klasse eine Methode bauen zu überprüfen, um zu sehen, ob der boolean gesetzt worden

in Übergeordnete Klasse

private Boolean a = null;

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


public Boolean getA() {
    return a;
}

In der Kinderklasse

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

Stellen Sie sicher, dass Behauptungen eingeschaltet sind. Assertions sind nur für den Entwicklungszyklus und Testzyklus, sie sind nicht für die Laufzeit Ausnahmen.

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

Private Boolean myBoolean;

sollte alles, was Sie sein need.Note dass Boolean.TRUE eine Äquivalenzprüfung passieren wird, aber unterscheidet sich von „true“ (was auf TRUE wird autoboxed).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top