2009-12-28 15 views
9

में सार्वजनिक एनम के परिणाम का परिणाम मुझे संकलन-समय पर एक अनाम कक्षा मिल रही है जिसे मैं उम्मीद नहीं कर रहा हूं। प्रासंगिक कोड इस प्रकार है, तो एक अधिक विस्तृत विवरण:बेनामी कक्षा

CircuitType.java की सम्पूर्णता:

public enum CircuitType { V110A20, V110A30, V208A20, V208A30 } 

Auditor.java से, लाइनों 3-9:

public class Auditor { 
    private String[] fileNames; 
    private int numV110A20; 
    private int numV110A30; 
    private int numV208A20; 
    private int numV208A30; 

Auditor.java से, लाइनों 104-121:

[...] 
switch (newCircuit.getType()) { 
    case V110A20: 
     this.numV110A20++; 
     break; 
    case V110A30: 
     this.numV110A30++; 
     break; 
    case V208A20: 
     this.numV208A20++; 
     break; 
    case V208A30: 
     this.numV208A30++; 
     break; 
    default: 
     System.err.println("An Error Has Occured."); 
     System.exit(-1); 
     break; 
} 
[...] 

Circuit.java से, लाइनों 1-5:

public class Circuit { 
    private CircuitType myType; 
    public CircuitType getType() { 
     return this.myType; 
    } 
[...] 

जब आदेश

javac *.java 

निष्पादित किया जाता है, एक गुमनाम वर्ग लेखा परीक्षक $ 1.java उत्पन्न होता है। फाइलें, जाहिर है, सभी एक फ़ाइल सिस्टम निर्देशिका में एक दूसरे के बगल में बैठते हैं जिसमें कुछ भी नहीं है।

जब लाइन 104-121 टिप्पणी की जाती है, तो कोई अज्ञात वर्ग उत्पन्न नहीं होता है।

मैंने पहली बार सोचा था कि यह एक पैकेज मुद्दा था, इसलिए तीन वर्गों को पैकेज में रखें, लेकिन मुझे इसे काम करने के लिए पैकेजों के बारे में पर्याप्त जानकारी नहीं थी। यदि यह वास्तव में एक पैकेज मुद्दा है, तो क्या कोई मुझे लेबल करने के तरीके के माध्यम से मुझे कदम दे सकता है? अगर मुझे ऐसा करने की ज़रूरत नहीं है, तो मुझे उन्हें पैकेज नहीं करना पड़ेगा।

अज्ञात वर्ग एक समस्या है, इस तथ्य के अलावा कि इस तरह के वर्ग आमतौर पर नामस्थान समस्या को इंगित करते हैं, यह है कि यह मेरे मेकफ़ाइल I को स्वचालित संकलन के लिए उपयोग करता है।

% javap 'Auditor$1' 
Compiled from "Auditor.java" 
class Auditor$1 extends java.lang.Object{ 
    static final int[] $SwitchMap$CircuitType; 
    static {}; 
} 
+1

दुर्भाग्य से मैं इस समस्या के साथ मदद नहीं कर सकता, लेकिन +1 एक बहुत पोस्टिंग अच्छी तरह से सवाल पूछा। –

+1

शायद यह वह उत्तर नहीं है जिसे आप सुनना चाहते थे, लेकिन 'मेक' वास्तव में जावा विकास के लिए उपयुक्त उपकरण नहीं है। मैं दृढ़ता से 'चींटी' का उपयोग करने की सलाह देता हूं। जैसे ही आप अधिक जटिल अनुप्रयोग विकसित करते हैं, आपके पास जगह पर अज्ञात कक्षाएं होंगी, और ठीक है। –

+0

मुझे ऑडिटर.जावा के और अधिक देखने में दिलचस्पी होगी। आपने जो कहा है उसके आधार पर मुझे यह विश्वास करना मुश्किल लगता है कि सर्किट.जावा मुद्दा है। आपके अनुरोध के अनुसार – Shaun

उत्तर

4

मैंने आगे बढ़ और एक छोटे से स्रोत आप युक्त परियोजना का निर्माण किया है:

अद्यतन


संलग्न एक कंसोल सत्र जो मुझे आशा है कि इस रहस्य पर प्रकाश डाला सकता है इसे संकलित करने के लिए पोस्ट किया गया और बस इसके चारों ओर पर्याप्त रूपरेखा तैयार की गई। मुझे 3 क्लास फाइलें मिलीं: सर्किट.क्लास, सर्किट टाइप.क्लास और ऑडिटर.क्लास - जैसा कि अपेक्षित था।

यह सब जावा 1.6 के तहत है। लेकिन जैसा कि अन्य ने संकेत दिया है, मुझे लगता है कि समस्या का निदान बंद है।

बेनामी कक्षाएं गलती से उत्पन्न करने के लिए आसान कर रहे हैं: आमतौर पर

Circuit myCircuit = new Circuit() { 
    public CircuitType getCircuitType() { 
     return XXX; 
    } 
} 

की तरह एक निर्माण उदाहरण के लिए, बना दिया जाएगा। आपके कोड को और देखते हुए, अच्छे SO लोग आपकी त्रुटि को इंगित करने में सक्षम हो सकते हैं।

javap के साथ अपनी कक्षा फ़ाइलों को अलग करना या JD जैसे "वास्तविक" जावा डिस्सेबलर को बेहतर बनाने के लिए यह दिलचस्प और निर्देशक हो सकता है।


अद्यतन

मेरा करने के लिए अपने नए लेखा परीक्षक कोड जोड़ा गया ... कोई परिवर्तन नहीं। कोई अज्ञात वर्ग नहीं

आपका कोड बिल्कुल सही है (जिस हद तक हम इसे देख सकते हैं) लेकिन डिजाइन बहुत ओओ नहीं है। कुछ लोग बताएंगे कि जब भी कोई नया सर्किट प्रकार दिखाई देता है तो आपको अपनी काउंटर घोषणाएं और switch कथन का विस्तार करना होगा।

आप भी enums के "विशेष विशेषताओं" का अधिक उपयोग नहीं कर रहे हैं।

private int[] counters = new int[CircuitType.values().length]; 

    public void tallySomething() { 
     Circuit newCircuit = new Circuit(); 
     counters[newCircuit.getType().ordinal()]++; 
    } 

अद्यतन 2

मैं अपने javap उत्पादन काफी रोशन पाया: मैं अपने Auditor विधि का एक बहुत सरलीकृत संस्करण है। नीचे मेरी टिप्पणी देखें।

मेरे निष्कर्ष:

  1. हाँ, जाहिरा तौर पर अपने जावा impl एक anon वर्ग स्विच के लिए उपयोग कर रहा है। लंगड़ा, लेकिन वैध।
  2. आप निम्नलिखित विकल्प हैं:
    • को खत्म switch
    • एक अलग जावा कार्यान्वयन
    • गुमनाम वर्ग के साथ रहते हैं का उपयोग करें; make डुबोएं और ant का उपयोग करें जो एनन कक्षाओं और जावा की अन्य अजनबियों को गले लगाए।

के बाद से आप केवल अपने गैर मानक संकलन सेटअप की वजह से समस्या हो रही है, मैं पिछले समाधान के साथ जाने के लिए और वहाँ समस्या पर हमला था।

+0

मैंने आपके अनुरोध के अनुसार Auditor.java से अधिक कोड शामिल किया था। लाइन 104-121 कोड ब्लॉक अपराधी के लिए निश्चित रूप से है, क्योंकि उस कोड ब्लॉक पर टिप्पणी होने पर अनाम वर्ग उत्पन्न नहीं होता है। मेरा मानना ​​है कि मैंने उस कोड ब्लॉक से संबंधित सबकुछ शामिल किया है। अगर आपको कुछ और चाहिए तो कृपया मुझे बताएं। – Maarx

+0

अपने अपडेट का जवाब देने के लिए मेरा जवाब अपडेट किया गया। –

+0

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

3

यह वास्तव में लगता है कि एक आंतरिक वर्ग स्विच बयान के लिए उत्पन्न हो जाएगा (कुछ मामलों में कम से कम में):

Java enum and additional class files

+0

बहुत अंतर, +1! –

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