कंपाइलर त्रुटि पहले से ही यह कहती है। केस लेबल्स निरंतर अभिव्यक्ति होना चाहिए और न ही, कक्षा शाब्दिक और न ही 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;
}
यह पाठक के लिए संबंध दस्तावेजों, लेकिन उपकरण अभी भी सुनिश्चित नहीं है कि वास्तविक स्ट्रिंग सामग्री वर्ग के नाम से मेल खाता है। हालांकि, जो आप प्राप्त करना चाहते हैं उसके आधार पर, अब यह अप्रासंगिक हो सकता है, चाहे स्ट्रिंग सामग्री कक्षा के नाम से मेल खाती है ...
क्या आप स्ट्रिंग को स्थानीय स्ट्रिंग स्थानीय चरों को असाइन करने का प्रयास कर सकते हैं? –
कौन सा जावा संस्करण? आपको जावा 7/8 पर अलग-अलग परिणाम मिलेंगे। – Marged
@ मार्ज किया गया मैं जावा 8 का उपयोग कर रहा हूं, लेकिन किसी भी संस्करण के लिए समाधान में रुचि रखते हैं ... – dedek