È possibile utilizzare un booleano Java per la logica ternaria (a 3 stati)?

5

Sto provando a creare una cache di base con un valore booleano, e l'ho fatta come tale:

private Boolean _valueCache = null;
private boolean getValue() {
    try {
        if (_valueCache == null) { // if cache was never filled
            return _valueCache = getReader().getMyBooleanProperty(); // fill it and return the new value
        }
        return _valueCache; // else, return the cache
    } catch (NullPointerException ex) { // getReader() returned null
        return false; // that return may not be null in the future, so set nothing
    }
}

Questo va contro le migliori pratiche? (lasciando che un Boolean abbia 3 valori: true , false e null ) Voglio solo mettere in cache questo valore, quindi non voglio creare un'intera HashMap personalizzata che riproduca questo comportamento con un metodo get-or-default. Detto questo, non ho mai fatto una cache così piccola, quindi non conosco gli svantaggi.

Per chiarire , intendevo "ternario" come in "3-state", in opposizione a "binario" come in "2-stato". Ci scusiamo per qualsiasi confusione.

    
posta Ben Leggiero 05.03.2015 - 16:47
fonte

3 risposte

7

Non stai facendo la logica ternaria, stai solo usando null come segnaposto per un valore mancante che è di tipo Boolean . (Non avere truefalse non è proprio come avere uno dei due ma non sapere quale.) Usare null in questo modo è una pratica abbastanza comune, ma Non lo definirei un buon .

È improbabile che causi problemi in questo caso particolare perché è usato solo internamente in un ambito molto piccolo, ma in generale si vorrebbe usare Optional invece. Dal momento che qualsiasi variabile non primitiva potrebbe avere null , è molto difficile tenerne traccia in un grande codebase. Il modo più semplice per evitare il problema è non utilizzare null in primo luogo.

    
risposta data 05.03.2015 - 17:07
fonte
2

Durante l'utilizzo di null o l'utilizzo di un Opzionale sono scelte ragionevoli, un'altra opzione sarebbe quella di aggiungere un secondo campo esplicito, boolean _hasBeenRead . Il tuo codice sarà simile a

private boolean getValue() {
    if (_hasBeenRead)
       return _valueCache;

    else {
       // read the value and, if successful, set both _hasBeenRead and _valueCache.
    }
}

Alcuni lo considererebbero più esplicito e quindi più chiaro. Soprattutto se stai usando Java in stile vecchio senza nuove fantastiche funzionalità come Optional.

P.S. Qualunque cosa tu faccia, considera se questo metodo deve essere sincronizzato, se le variabili devono essere volatili, ecc ...

    
risposta data 05.03.2015 - 23:37
fonte
-2

La logica del tenario per questo dovrebbe essere

private Boolean _valueCache = null;
private boolean getValue() { 
         Boolean readerValue = getReader() == null ? false : reader.getMyBooleanProperty();
         _valueCache = _valueCache == null  ? readerValue : _valueCache; 
         return _valueCache;

   }

A proposito, qual è l'uso dell'eccezione NullPointer gestita, getReader () restituisce null, anche le eccezioni di runtime come questa non sono consigliabili

    
risposta data 06.03.2015 - 23:45
fonte

Leggi altre domande sui tag