2008-11-24 13 views
22

यदि आपके पास ऐसी स्थिति है जहां आपको यह जानने की आवश्यकता है कि एक बूलियन मान कहाँ सेट नहीं किया गया था (उदाहरण के लिए यदि उस अनसेट मान को मूल मान से प्राप्त होना चाहिए) जावा बूलियन आदिम (और अन्य भाषाओं में समकक्ष) स्पष्ट रूप से पर्याप्त नहीं है।सत्य, झूठी, अनसेट राज्य को परिभाषित करने का सबसे अच्छा तरीका

इसे प्राप्त करने का सबसे अच्छा अभ्यास क्या है? एक नई साधारण कक्षा को परिभाषित करें जो सभी तीन राज्यों को व्यक्त करने में सक्षम है या जावा बूलियन वर्ग का उपयोग करने में सक्षम है और अनसेट स्थिति को इंगित करने के लिए शून्य का उपयोग करें?

+19

बिल्कुल http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx की तरह :) –

+1

अगर मैं कर सकता तो मैं उस टिप्पणी को ऊपर उठाऊंगा। –

उत्तर

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

मैं इसका उपयोग करूंगा। यह सबसे सीधा आगे है।

एक और तरीका एक गणना का उपयोग करना है। हो सकता है कि यहां तक ​​कि, बेहतर और तेज है, क्योंकि कोई मुक्केबाजी की जरूरत है:

public enum ThreeState { 
    TRUE, 
    FALSE, 
    TRALSE 
}; 

वहाँ पहले का लाभ है कि अपने वर्ग के उपयोगकर्ताओं को अपने तीन राज्य बूलियन के बारे में परवाह करने की जरूरत नहीं है। वे अभी भी true और false पास कर सकते हैं। यदि आपको null पसंद नहीं है, क्योंकि यह इसके अर्थ के बारे में थोड़ा सा कह रहा है, तो भी आप अपनी कक्षा में public static final Boolean tralse = null; बना सकते हैं।

+10

दैनिक डब्ल्यूटीएफ वेबसाइट का कहना है कि तीसरा मान "FILE_NOT_FOUND" नाम दिया जाना चाहिए। देखें: http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx – Darron

+1

मैं खुद को बूलियन के साथ जाऊंगा। पूरा सत्य, गलत, FILE_NOT_FOUND/TRALSE बात सिर्फ परेशानी के लिए पूछ रही है। –

+0

खराब डिजाइन। त्रि-राज्य वस्तु बनाएं। "अनसेट" होने पर मूल्य विरासत को स्वचालित करने के लिए अभिभावक के साथ इसे तत्काल करें, अन्यथा परीक्षण/उपयोग माता-पिता आपके कोड में फैल जाएगा। –

10

हालांकि जावा-विशिष्ट नहीं है, इस परिदृश्य में मेरी अपनी प्राथमिकता एक थ्रीस्टेट कक्षा या गणना को परिभाषित करना है और इसका उपयोग करना है - जैसा कि आपने बताया है, एक सत्य, एक गलत और एक अनिर्धारित (या डिफ़ॉल्ट, या अनसेट, जैसा कि आपकी डोमेन-विशिष्ट शब्दावली dictates)। यह null के साथ अनसेट/अपरिभाषित प्रतिनिधित्व करने से बेहतर, अधिक प्राकृतिक और अधिक आत्म-दस्तावेज महसूस करता है।

+0

यह बिल्कुल जाने का तरीका है। साथ ही, आप अपनी कक्षा में "अभिभावक" का उल्लेख कर सकते हैं ताकि आप स्वचालित रूप से इसके राज्य का उत्तराधिकारी हो सकें। अन्यथा आपके पास "उत्तराधिकारी राज्य" कोड है जो आपके पूरे कोड में फैला है (DRY नहीं)। –

+0

विधेयक, "माता-पिता" से आपका क्या मतलब है? –

-3

java.lang.Boolean यह आपके लिए करता है। स्थिर स्थिरांक Boolean.TRUE, Boolean.False हैं।

निजी बुलीयन myBoolean;

आपको जो चाहिए वह होना चाहिए। नोट करें कि बूलियन.TRUE एक समकक्ष परीक्षण पास करेगा लेकिन "सत्य" से अलग है (जो सत्य के लिए autoboxed हो जाता है)।

8

नालीबल बूलियन को मेरा वोट

1

यह निर्भर करता है। यहां आप उल्लेख करते हैं कि यह अनसेट होगा यदि उसे मूल मूल्य से अपना मूल्य प्राप्त करना है। क्या आपके पास कुछ प्रकार का डेटा पदानुक्रम है? कुछ इस तरह:

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

इस मामले में, यदि यह संभव है, तो मैं बस यही चाहते हैं बच्चे में val2 शामिल नहीं हैं, और आपके देखने तर्क यह है कि अगर यह चर नहीं मिल रहा है इस तरह के हो है, यह मूल्य के लिए माता-पिता की खोज करता है।

4

कुछ की स्थिति का प्रतिनिधित्व करने के लिए नल का उपयोग करना खराब डिजाइन है। यह अव्यवहारिक और बनाए रखने के लिए मुश्किल है। यदि इसके बारे में कुछ भी स्पष्ट रूप से सेट नहीं किया गया है तो मेरे पास एक डिफ़ॉल्ट स्थिति के साथ एक राज्य वस्तु होगी। उदाहरण के लिए:

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

यह मुझे अपेक्षित स्थिति के बारे में कुछ नहीं बताता है। ऐसा कुछ और अधिक स्पष्ट करता है।

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

एक्स्टेंसिबल का उल्लेख नहीं करना चाहिए। क्या होता है जब आपको चौथा राज्य की आवश्यकता होती है?

-1

जनक कक्षा में बूलियन आरंभ शून्य पर और बच्चे कक्षा में देखने के लिए अगर बूलियन जनक वर्ग

private Boolean a = null; 

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


public Boolean getA() { 
    return a; 
} 

में

स्थापित किया गया है बाल कक्षा

में जांच करने के लिए एक विधि का निर्माण
if (a == true) 
{ 
dothis; 
} 
else if (a == false) 
{ 
dothat; 
} 
else 
{ 
assert false : "Boolean a has not been set"; 
} 

सुनिश्चित करें कि दावा चालू हैं। अनुमान केवल विकास चक्र और परीक्षण चक्र के लिए हैं, वे रनटाइम अपवादों के लिए नहीं हैं।

8

जावा 8 में, वहाँ भी वैकल्पिक विकल्प है:

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(); 

एक बोनस के रूप में, आप उन सभी नक्शा मिल जाएगा और तरीकों खपत करते हैं।

+0

यदि कोई जावा 8 का उपयोग नहीं कर सकता है लेकिन गुवा मौजूद है, तो इसके बजाय 'com.google.common.base.Optional' का उपयोग किया जा सकता है। – thee

1

मैं केवल 0,1,2 मानों के साथ एक int (पूर्णांक) का उपयोग करता हूं और प्रोग्राम के भीतर संभालता हूं।

संबंधित मुद्दे