2016-01-05 3 views
13

मैं जावा switch कथन का उपयोग करना चाहता हूं, जो class नाम case स्थिरांक के रूप में उपयोग करता है। क्या यह किसी भी तरह से संभव है? या मुझे कक्षा के नामों को डुप्लिकेट करना है?क्या जावा स्विच/केस स्टेटमेंट में कक्षा का नाम संभव है?

मामले भाव स्थिर भाव

String tableName = "MyClass1"; 

... 

switch (tableName) { 
case MyClass1.class.getSimpleName(): 
    return 1; 
case MyClass2.class.getSimpleName(): 
    return 2; 
default: 
    return Integer.MAX_VALUE; 
} 

यहाँ होना चाहिए मुद्दा (openjdk 1.8.0_45) के एक ऑनलाइन प्रदर्शन: http://goo.gl/KvsR6u

कोड संकलक त्रुटि की वजह से काम नहीं करता है के बाद

+2

क्या आप स्ट्रिंग को स्थानीय स्ट्रिंग स्थानीय चरों को असाइन करने का प्रयास कर सकते हैं? –

+1

कौन सा जावा संस्करण? आपको जावा 7/8 पर अलग-अलग परिणाम मिलेंगे। – Marged

+0

@ मार्ज किया गया मैं जावा 8 का उपयोग कर रहा हूं, लेकिन किसी भी संस्करण के लिए समाधान में रुचि रखते हैं ... – dedek

उत्तर

6

कंपाइलर त्रुटि पहले से ही यह कहती है। केस लेबल्स निरंतर अभिव्यक्ति होना चाहिए और न ही, कक्षा शाब्दिक और न ही getSimpleName() पर हमला करने का नतीजा निरंतर अभिव्यक्ति है।

एक काम कर समाधान होगा:

String tableName = "MyClass1"; 
... 
switch (tableName) { 
    case "MyClass1": 
     return 1; 
    case "MyClass2": 
     return 2; 
    default: 
     return Integer.MAX_VALUE; 
} 

अभिव्यक्ति MyClass1.class.getSimpleName()"MyClass1" से अधिक आसान नहीं है, लेकिन, ज़ाहिर है, वहाँ किसी भी संकलन समय जांच नहीं होगा कि क्या नाम मौजूदा वर्गों और पुनर्रचना के उपकरणों से मेल खाते हैं या obfuscators वर्ग MyClass1 और स्ट्रिंग अक्षर "MyClass1" के बीच संबंधों को नहीं देखते हैं।

इसका कोई समाधान नहीं है। समस्या को कम करने के लिए आप केवल एक चीज कर सकते हैं, संबंधित वर्ग के भीतर कुंजी को रिश्ते दस्तावेज करने के लिए घोषित करना है, उदा।

class MyClass1 { 
    static final String IDENTIFIER = "MyClass1"; 
    ... 
} 
class MyClass2 { 
    static final String IDENTIFIER = "MyClass2"; 
    ... 
} 
... 
String tableName = MyClass1.IDENTIFIER; 
... 
switch (tableName) { 
    case MyClass1.IDENTIFIER: 
     return 1; 
    case MyClass2.IDENTIFIER: 
     return 2; 
    default: 
     return Integer.MAX_VALUE; 
} 

यह पाठक के लिए संबंध दस्तावेजों, लेकिन उपकरण अभी भी सुनिश्चित नहीं है कि वास्तविक स्ट्रिंग सामग्री वर्ग के नाम से मेल खाता है। हालांकि, जो आप प्राप्त करना चाहते हैं उसके आधार पर, अब यह अप्रासंगिक हो सकता है, चाहे स्ट्रिंग सामग्री कक्षा के नाम से मेल खाती है ...

+0

यह मेरे लिए सही उत्तर है: * केस लेबल्स निरंतर अभिव्यक्ति होना चाहिए और न ही, कक्षा शाब्दिक और न ही उन पर 'getSimpleName()' का आह्वान करने का नतीजा निरंतर अभिव्यक्तियां हैं। * – dedek

+0

** संकलन-समय निरंतर अभिव्यक्तियों का अच्छा स्पष्टीकरण ** यहां पाया जा सकता है: http://stackoverflow.com/a/3827424/1857897 – dedek

+0

मैंने सोचा कि * कक्षा अक्षर * निरंतर अभिव्यक्तियां हैं, लेकिन फिर "+" MyClass1.class' को काम करना चाहिए, लेकिन यह नहीं है ... – dedek

8

स्विच का उपयोग करने के बजाय, क्यों नहीं मानचित्र में मैपिंग स्टोर करें?

स्ट्रिंग टू इंटीजर का नक्शा बनाएं, और सभी क्लास नामों को उनके वापसी मूल्य पर मानचित्र बनाएं।

अनुरोध पर, यदि प्रविष्टि मौजूद नहीं है, तो डिफ़ॉल्ट मान वापस करें। अन्यथा, मानचित्र में मान वापस करें।

+0

मैं इस समाधान के बारे में सोच रहा था, लेकिन 'स्विच' अधिक कुशल नहीं होगा? – dedek

+2

शायद, लेकिन आपका कोड भी कम पठनीय होगा क्योंकि आपको हर वर्ग के नाम के लिए एक पंक्ति की आवश्यकता है और फिर प्रत्येक मामले के लिए कुछ और। आपको प्राप्त होने वाले ऑप्टिमाइज़ेशन के कुछ नैनोसेकंड शायद 'मानचित्र' –

+1

का उपयोग करके आपके द्वारा प्राप्त कोड की शुद्धता के लायक नहीं होंगे ओह, मैं जोड़ना भूल गया था।अगर मुझे सही याद है, तो स्ट्रिंग्स पर स्विच करें [अपने हैशकोड पर स्विच करें] (http://www.benf.org/other/cfr/java7switchonstring.html) जब तक कि हाल ही में कुछ बदलाव नहीं हुआ है –

2

स्विच के बजाय .. आप इसका उपयोग क्यों नहीं करते हैं .. कृपया। जब तक मुझे पता न हो, जावा के सभी संस्करणों में काम करना चाहिए।

if (tableName.equals(MyClass1.class.getSimpleName())) { 
    return 1; 
} else if (tableName.equals(MyClass2.class.getSimpleName())) { 
    return 2; 
} else { 
    return Integer.MAX_VALUE; 
} 
+1

मुझे वास्तव में 'अन्यथा' बयान पसंद नहीं है, तो 'सैम-सन – dedek

+0

द्वारा' मानचित्र 'आधारित समाधान देखें, लेकिन जब तक मुझे पता न हो यह सभी संस्करणों में समर्थित है और आपको किसी संस्करण निर्भरता को संभालने की आवश्यकता नहीं होगी। –

+1

इस समाधान की समस्या यह है कि सबसे बुरे मामले में, इसे हर एक संभावना पर जाना पड़ता है, यही कारण है कि लोग "स्विच" चाहते हैं। – Leonmax

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