2012-01-13 21 views
8

के साथ स्विच/केस अनुरोध मैं एक विधि बनाने की कोशिश कर रहा हूं जो जांचता है कि लॉगिन (उपयोगकर्ता नाम और पासवर्ड) में कम से कम 6 charakters हैं।बूलियन

यह समझने के लिए कि मैंने इस विधि को public void checkLoginData(final String username, final String password) बनाया है। उस विधि में, मैं बूलियन्स (उपयोगकर्ता और पास) के लिए बनाने के लिए, लोगों के साथ मैं 4 अलग बूलियन-चेन बना सकते हैं:

  • उपयोगकर्ता: सच पास: सच
  • उपयोगकर्ता: झूठी पास: सच
  • उपयोगकर्ता : झूठी पास: झूठी
  • उपयोगकर्ता: सच पास: झूठी

अब मैं उनमें से प्रत्येक के लिए एक स्विच/मामले अनुरोध करना चाहते हैं, लेकिन मुझे लगता है कि साकार करने के लिए कैसे नहीं मिलता है ...

यदि आप पूछते हैं कि मुझे स्विच की आवश्यकता क्यों है, तो मुझे लगता है कि मुझे इसकी आवश्यकता है, क्योंकि मैं उन 4 बूलियन-चेनों में से प्रत्येक के लिए करना चाहता हूं, यह कुछ भिन्न/दिखाता है। इसके अलावा मैं इसे एक सेक्सी-जावा-वे तरीके से करना चाहता हूं, जिसमें भिन्न 'ifs' के tousands नहीं हैं: पी, कृपया मदद करें!

public void checkLoginData(final String username, final String password){ 

    boolean user, pass; 

    if (username.length() < 6){ 
     user = false; 
    }else { 
     user = true; 
    } 

    if (password.length() < 6){ 
     pass = false; 
    }else { 
     pass = true; 
    } 

    boolean[] logindaten = {user, pass}; 



} 

अग्रिम में मदद के लिए Thx:

यहाँ विधि का कोड है!

बेस्ट सादर सफारी

+1

आपको यहां स्विच करने की आवश्यकता क्या है? आपकी क्या प्राप्त करने की इच्छा है? – Egor

+0

मुझे उन सभी बूलियन-चेन की आवश्यकता है जो यह कुछ अलग करता है। इसके कारण मैं इसे एक स्विच के साथ करना चाहता हूं। लेकिन मुझे यह काम नहीं मिल रहा है – safari

+1

प्रत्येक मामले के लिए एक enum का उपयोग करने पर विचार करें कि यह निर्धारित करने के लिए कि आपके पास दो युगल के बजाय कौन सी वर्तमान स्थिति है। तो आप आसानी से स्विच/केस का उपयोग कर सकते हैं। – crusam

उत्तर

9

आप केवल अभिन्न प्रकारों पर boolean[] पर स्विच नहीं कर सकते। किसी पूर्णांक पर बूलियन्स बदलने के लिए, आप उदाहरण के लिए इस तरह 2 बूलियन्स के लिए एक सा मुखौटा इस्तेमाल कर सकते हैं,:

int val = 0; 
if (user) val |= 0x1; 
if (pass) val |= 0x2; 

switch (val) { 
case 0: // Both too short 
case 1: // User Ok, pass too short 
case 2: // User too short, pass ok 
case 3: // Both Ok 
} 
+9

उग ... कोई भी जो सोचता है वह "सेक्सी जावा" स्कूल में वापस जाने की जरूरत है। आपको यह सुनिश्चित करने के लिए सावधानी से इसे पढ़ने की ज़रूरत है कि यह सही है ... और यह हमेशा एक बुरा संकेत है। –

+0

ठीक है, यह स्विच के साथ ऐसा करने का तरीका है। यदि मैं श्रृंखला –

+0

@StephenC सेक्सी नहीं हो सकता है, तो यह व्यक्तिगत रूप से इसे लागू करेगा यदि यह सेक्सी नहीं हो सकता है लेकिन यह करने का एक तेज़ और विश्वसनीय तरीका है ... माना जाता है कि आप एक enum का उपयोग कर सकते थे, लेकिन यह भी तेज़ है। – fge

3
if (user) { 
    if (pass) { 
     // user = true, pass = true 
    } else { 
     // user = true, pass = false 
    } 
} else { 
    if (pass) { 
     // user = false, pass = true 
    } else { 
     // user = false, pass = false 
    } 
} 

या

int case = user ? (pass ? 1 : 2) : (pass ? 3: 4); 

switch (case) { 
    case 1: 
    System.out.println(" user = true, pass = true "); 
    break; 
    case 2: 
    System.out.println(" user = true, pass = false "); 
    break; 
    case 3: 
    System.out.println(" user = false, pass = true "); 
    break; 
    case 4: 
    System.out.println(" user = false, pass = false "); 
    break; 
    } 
} 
+0

हे भगवान! पर्याप्त कोड नहीं है! बहुत आसान! – 4ndrew

+0

@ सफारी यदि आपके पास केवल 4 संयोजन हैं, तो पहला ठीक है। स्विच का उपयोग करके कोशिश की, इसे जांचें। – Vaandu

+0

@ 4ndrew मैंने बस प्रश्न का उत्तर दिया! – Vaandu

8

मूल रूप से वहाँ इस से कोई आसान तरीका है, और कोई रास्ता नहीं है यह काफी कम लाइनों में क्या करना है कोड का

if (username.length() < 6){ 
    if (password.length() < 6){ 
     // do case 1 
    } else { 
     // do case 2 
    } 
} else { 
    if (password.length() < 6){ 
     // do case 3 
    } else { 
     // do case 4 
    } 
} 

मेरे दिमाग में, यह सबसे अच्छा समाधान बनाता है।

इसके अलावा, मैं के tousands साथ नहीं एक सेक्सी-जावा-तरह से यह करने के लिए करना चाहते हैं अलग 'भारतीय विदेश सेवा'

द्वारा "सेक्सी-जावा तरह से" यदि आप "चालाक" मतलब या "अस्पष्ट", तो इसे करने के अन्य तरीके हैं। लेकिन वे निश्चित रूप से कोड को पढ़ने/अधिक रखरखाव करने में आसान नहीं बनाते हैं।

वैसे, उपर्युक्त केवल 3 शामिल है ... यह सही है तीन ... if बयान।


हालांकि अपने (अंतिम) विशिष्ट उदाहरण:

public void checkLoginData(final String username, final String password){ 
    boolean user, pass; 
    if (username.length() < 6){ 
     user = false; 
    }else { 
     user = true; 
    } 
    if (password.length() < 6){ 
     pass = false; 
    }else { 
     pass = true; 
    } 
    boolean[] logindaten = {user, pass}; 
    .... 
} 

के लिए निम्न सरल किया जा सकता:

public void checkLoginData(final String username, final String password){ 
    boolean user = username.length() >= 6; 
    boolean pass = password.length() >= 6; 
    boolean[] logindaten = {user, pass}; 
    .... 
} 

ध्यान दें कि सरलीकरण यहां संभव है क्योंकि क्रिया ("मामलों" है आपके hypothetical स्विच में) सरल बुलियन असाइनमेंट में refactored किया जा सकता है और परीक्षण वास्तव में एक दूसरे से स्वतंत्र हैं। सामान्य तौर पर आप ऐसा नहीं कर सकते ...


... लेकिन आईडी इसे और अधिक celver के लिए अपने मालिक को प्रभावित करना चाहते;)

गंभीरता से, अगर मैं अपने मालिक था और आपने उस तरह कोड लिखा था, मैं संयुक्त राष्ट्र- प्रभावित होगा। कोई भी मालिक जो आपको लगता है कि अस्पष्ट और अस्पष्ट कोड लिखने के लिए चालाक हैं, वह अनजान है।

+0

में सुधार होगा हाँ, मुझे पता है कि मेरे पास पहले ऐसा ही था, लेकिन आईडी को मेरे मालिक को प्रभावित करने के लिए इसे और अधिक सेल्वर रखना पसंद है;) क्योंकि मैं अभी भी यह सब सीख रहा हूं जावा और एंड्रॉइड सामान! वैसे भी! थक्स आदमी! +1। आपकी हास्यास्पद टिप्पणी के कारण: पी – safari

7

अनुमान thats कैसे मैं इसे enums के साथ हल होगा:

public class LoginController 
{ 
    private void login(String username, String password) 
    { 
    LoginState state = determineLoginState(username, password); 

    switch (state) 
    { 
     case LOGIN_OK: 
     //Do Something 
     break; 
     case USERNAME_FALSE: 
     //Do Something 
     break; 
     case PASSWORD_FALSE: 
     //Do Something 
     break; 
     case BOTH_FALSE: 
     //Do Something 
     break; 
    } 

    } 

    private LoginState determineLoginState(String username, String password) 
    { 
    final boolean checkUsername = checkUsername(username); 
    final boolean checkPassword = checkPassword(password); 

    if (checkUsername && checkPassword) 
     return LoginState.LOGIN_OK; 

    if (!checkUsername && checkPassword) 
     return LoginState.USERNAME_FALSE; 

    if (checkUsername && !checkPassword) 
     return LoginState.PASSWORD_FALSE; 

    if (!checkUsername && !checkPassword) 
     return LoginState.BOTH_FALSE; 

    throw new AuthenticationException(); 
    } 

    protected boolean checkUsername(String username) 
    { 
    return username.length() > 6; 
    } 

    protected boolean checkPassword(String password) 
    { 
    return password.length() > 6; 
    } 

    private enum LoginState 
    { 
    LOGIN_OK, USERNAME_FALSE, PASSWORD_FALSE, BOTH_FALSE; 
    } 

    public class AuthenticationException extends RuntimeException 
    { 

    } 
} 
+0

मैंने इसे एक और तरीका किया। आपकी मदद के लिए Thx वैसे भी! – safari

11

तुम सच में एक "सेक्सी-जावा तरह से" चाहते हैं (लेकिन यह है कि क्या आप इस तरह के रूप में समझते हैं निर्भर करता है) आप (जावा की तरह कुछ कर सकते हैं 7 आवश्यक):

boolean user, pass; 

switch (user + "-" + pass) { 
    case "false-false": 
     ... 
    case "false-true": 
     ... 
    case "true-false": 
     ... 
    case "true-true": 
     ... 
    default: 
     throw new RuntimeException(
      "something strange happening here, user: " + user + ",pass: " + pass); 
} 

लेकिन मैं सिर्फ 2 अलग चेकों अपने संदेश का मालिक के साथ प्रत्येक, संदेश प्रस्तुति के लिए जुड़े हुए जा रहा करने के लिए पसंद करेंगे। (और यह सुनिश्चित नहीं है कि इसे "सेक्सी-जावा-वे" माना जा सकता है, एक 'वर्कअराउंड' की तरह)

+0

यह भी वास्तव में महान दिखता है !! +1 और thx! – safari

+0

मुझे लगता है कि मैं समझता हूं कि बिट मास्क बेहतर क्यों है लेकिन मुझे लगता है कि यह विधि अपडेट करने के लिए और अधिक पढ़ने योग्य और आसान है। – bigLarry

+0

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

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