में अंतिम स्थैतिक चर प्रारंभ करना मेरी प्रोजेक्ट के लिए, मेरे पास कई ऑब्जेक्ट्स 10 कक्षाओं में विभाजित हैं। प्रत्येक वस्तुएं कुछ परिचालन कर सकती हैं, जिन्हें पहले से पंजीकृत किया जाना है (संचालन का पंजीकरण प्रति कक्षा केवल एक बार किया जाता है)। प्रत्येक वर्ग के लिए परिभाषित ऑपरेशंस को public final static
पूर्णांक के रूप में दर्शाया जाता है। मैं रनटाइम पर संचालन की आईडी गतिशील रूप से असाइन करना चाहता हूं (प्रति वर्ग संचालन की संख्या वर्तमान में लगभग 20 है और संख्या में वृद्धि होगी)।स्विच स्टेटमेंट और स्टेटिक ब्लॉक
समस्या उत्पन्न होती है, जब कोई ऑपरेशन किया जाता है और मुझे यह पता लगाना पड़ता है कि कौन सा ऑपरेशन किया जा रहा है (मैं एक स्विच स्टेटमेंट का उपयोग करता हूं)।
public class Test {
final static int foo = 8;
final static int bar = 10;
public static void main(String[] args)
{
int x=10;
switch(x)
{
case foo:
System.out.println("FOO");
break;
case bar:
System.out.println("BAR");
break;
default:
System.out.println("PROBLEM");
}
}
}
इस कोड को सामान्य रूप से संकलित और प्रदर्शित करता है BAR
:
यहाँ काम कर कोड का एक सरल उदाहरण है।
लेकिन यह थोड़ा रूपांतरित कोड के साथ Unresolved compilation problem
उत्पन्न करता है।
public class Test {
final static int foo;
final static int bar;
static
{
foo=8;
bar=10;
}
public static void main(String[] args)
{
int x=10;
switch(x)
{
case foo:
System.out.println("FOO");
break;
case bar:
System.out.println("BAR");
break;
default:
System.out.println("PROBLEM");
}
}
}
क्या ये कोड वास्तव में काम नहीं करते और संकलित नहीं करते हैं? मैं इस समस्या को हल करने तक गतिशील रूप से कुछ भी करने में सक्षम नहीं हूं? या कोई और तरीका है?
धन्यवाद
संपादित करें:
public class Test {
enum OperationSet1 {
FOO, BAR, THESE, ARE, ALL, DIFFERENT, OPERATIONS
}
enum OperationSet2 {
FOO, BAR, NOW, SOME, OTHER, OPS
}
public static void main(String[] args) {
OperationSet1[] ops = new OperationSet1[10];
for (int i=0; i<ops.length; i++)
ops[i] = OperationSet1.values()[(int)(Math.random()*OperationSet1.values().length)];
OperationSet2[] ops2 = new OperationSet2[10];
for (int i=0; i<ops.length; i++)
ops[i] = OperationSet2.values()[(int)(Math.random()*OperationSet2.values().length)];
for (OperationSet1 op:ops)
handleOperation(op);
}
for (OperationSet2 op:ops2)
handleOperation(op);
}
public static void handleOperation(Object? op) {
switch(op) {
/**code to handle**/
}
}
}
हम दो enums है और मैं स्विच के साथ (prefferably एक हैंडलिंग समारोह करना चाहते हैं: enums उपयोग करने के विचारों मैं इस समस्या का समाधान चाहते हैं के कारण कथन), जो इन दो enums में सभी मामलों को लागू करने के लिए संभाल लेंगे।
EDIT2: तो यहां जाता है। मेरे पास 10 वर्ग (C1, C2, ..., C10)
और इन कक्षाओं के लगभग 40 ऑब्जेक्ट हैं। इनमें से कुछ वस्तुएं तथाकथित मालिक हैं और कुछ साझा की जाती हैं। प्रत्येक साझा ऑब्जेक्ट में एक स्वामी होता है (यह मूल संबंध है - इसमें जावा विरासत के साथ कुछ भी नहीं है)।
अब साझा वस्तुओं obj
समय-समय पर परिवर्तन, और इस obj
जरूरतों में से प्रत्येक के अपने मालिक own
पूछने के लिए अगर यह बदल सकते हैं (यह केवल संचालन में से एक है) और फिर यह परिवर्तन (और फिर मालिक को सूचित करता है) । ऑब्जेक्ट obj
में C1
में enum
द्वारा परिभाषित किए गए संचालन का पूर्वनिर्धारित सेट भी है। इसलिए own
वर्ग C1
के ऑब्जेक्ट ऑपरेशंस के लिए एक हैंडलिंग फ़ंक्शन होना चाहिए। अब हमारे पास ऑब्जेक्ट obj2
है जो C2
वर्ग है, इसमें संचालन का एक अलग सेट है और एक ही मालिक own
है। obj
C1
और obj2
में परिभाषित केवल संचालन निष्पादित कर सकता है केवल C2
में परिभाषित संचालन कर सकता है।
हैंडलिंग फ़ंक्शन को सामान्यीकृत करने के लिए कैसे इसे अच्छी तरह से लिखा जाएगा? क्या मुझे भी enums का उपयोग करना चाहिए?
ओर्थोगोनल प्रश्न: वहाँ एक कारण है कि आप ints और नहीं एक enum का उपयोग कर रहे है? –
कोई कारण नहीं है (मुझे लगता है)। मैं वास्तव में एक बहुत अनुभवी प्रोग्रामर नहीं हूं, इसलिए मैं वास्तव में नहीं देखता हूं, मैं इसे enums के साथ कैसे लागू करूंगा। मुझे लगता है कि प्रत्येक वर्ग में एक सार्वजनिक enum (संचालन के साथ) होगा? लेकिन मैं 10 enums (प्रत्येक वर्ग के लिए एक) पर एक स्विच स्टेटमेंट कैसे बनाऊंगा? – Nejc
मैं अच्छे विचार के रूप में enums का उपयोग करने के बारे में नहीं सोचता, खासकर जब आप डेटाबेस से निपट रहे हैं। –