2010-03-04 10 views
11

यह एक स्टाइलिस्ट प्रश्न है। मैं एक वैरिएबल on के साथ दो बार लूप करना चाहता हूं जो गलत पर सेट है, फिर सत्य पर। इनमें से कौन सा स्पष्ट है:जावा: दो बूलियन मानों (झूठी, सत्य) पर लूपिंग

एक)

for (final boolean on : new boolean[] { false, true}) 
{ 
    doStuffBasedOnABooleanFlag(on); 
} 

बी)

for (int i = 0; i < 2; ++i) 
{ 
    final boolean on = (i == 1); 
    doStuffBasedOnABooleanFlag(on); 
} 

सी) कुछ और


संपादित करें: अनायास ही व्याख्याओं के मर्फी कानून खेलने में आता है। .. उपयोग के मामले में मैंने मूल रूप से ऐसा करने की बजाय कुछ ऐसा देखा है StStuffBasedOnABooleanFlag:

for (final boolean on : new boolean[] { false, true}) 
{ 
    JButton button = on ? onButton : offButton; 
    button.addActionListener(new ActionListener() { 
     @Override public void actionPerformed(ActionEvent event) { 
     doStuffLaterBasedOnABooleanFlag(on); 
     } 
    } 
} 

लेकिन मैं मैं ब्रेंडन के जवाब की तरह लगता है, मैं सिर्फ एक अलग विधि में पाश सामग्री refactor होगी:

doStuffBasedOnABooleanFlag(false); 
doStuffBasedOnABooleanFlag(true); 

    ... 

private void doStuffBasedOnABooleanFlag(final boolean on) 
{ 
    JButton button = on ? onButton : offButton; 
    button.addActionListener(new ActionListener() { 
     @Override public void actionPerformed(ActionEvent event) { 
     doStuffLaterBasedOnABooleanFlag(on); 
     } 
    } 
} 
+0

मुझे लगता है कि आपने गलती से अपने प्रश्न का उत्तर दिया और मैंने आपको इसका एहसास करने में मदद की? –

+0

हे, हाँ .... :-) –

उत्तर

22

चूंकि यह दो पंक्तियों है, मैं सिर्फ पाश छोड़ सकते हैं और करना चाहते हैं:

doStuffBasedOnABooleanFlag(false); 
doStuffBasedOnABooleanFlag(true); 

कम कोड, अधिक स्पष्ट, अधिक कुशल।

+0

मैं यह जवाब पसंद करता हूं। गलत व्याख्या करने के लिए सरल, स्पष्ट, और असंभव। – Joshua

+0

मुझे यह पसंद है। के लिए, अंतिम, i = 0 जबकि <2 के साथ मैं == 1?! और जो भी रास्ता बहुत जटिल है। बस दो बार विधि को बुलाओ! :) मुझे अपना जवाब हटाना पड़ा क्योंकि मुझे सवाल को बहुत कम से कम देखना गलत है। दो सरल विधि कॉल पढ़ने के लिए बहुत आसान हैं। – stmax

+1

बीटीडब्ल्यू आपको गलत क्रम में भी सच/गलत मिला है;) – stmax

3

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

लेकिन मुझे ब्रेंडन का जवाब बेहतर पसंद है।

11

एक अन्य विकल्प बूलियन से बचने और एक enum उपयोग करने के लिए होगा:

enum Mode { APPEND, REPLACE } // or whatever your boolean indicated 

तो आप या तो पुनरावृति सकता है:

for(Mode m : Mode.values()) doStuff(m); 

या सीधे कॉल करें:

doStuff(Mode.APPEND); 
doStuff(Mode.REPLACE); 

इसका लाभ यह होगा कि एपीआई स्पष्ट रूप से इंगित करता है कि क्या हो रहा है।

+1

बहुत बढ़िया। आप उस कोड को भी डाल सकते हैं जो आपके लूप में आपके मोड क्लास में ही है, मोड.एपीपीएनडी.डोस्टफ()। अन्यथा doStuff एक गैर-ओओ उपयोगिता विधि है - यक। –

+0

@ बिल के: मैं सहमत हूं, लेकिन मेरे मामले में doStuff() एक गैर स्थैतिक विधि है जिसके लिए अन्य गैर-स्थैतिक तरीकों तक पहुंच की आवश्यकता है। –

+0

Enums विधियां गैर स्थैतिक हो सकती हैं, और enum के अंदर अन्य वस्तुओं तक पहुंच हो सकती है। वे वास्तव में बहुत शक्तिशाली हैं। enums पूर्ण विशेषताओं वाले वर्ग हैं, केवल पूर्व परिभाषित उदाहरणों तक ही सीमित हैं। –

0

यह सिर्फ लूप नहीं है, मैं भी इस तरह से बूलियन के उपयोग से असहज हूं।

क्या की तरह कुछ के बारे में:

ActionListener myListener = new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent event) { 
     doStuffLaterBasedOnABooleanFlag(event.getSource() == onButton); 
    } 
    }; 
    onButton.addActionListener(myListener); 
    offButton.addActionListener(myListener); 

कि अभी भी श्रोता के भीतर बूलियन छोड़ देता है, लेकिन यह जानकर क्या doStuffLater विधि है कि जहाँ तक हम जा सकते है करता है बिना।

+0

मुझे बुलियन की आवश्यकता है। मैं अपना असली कोड पोस्ट नहीं कर सकता, यह इससे अधिक जटिल है, और मेरे पास यूआई घटकों की दो सूचियां हैं, एक एक तरफ से एक तरफ है, दूसरे ने दूसरे तरीके से संभाला है। –

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