जावा संकलित कक्षाओं में डॉलर के संकेत होते हैं


83

मैं अपने विकास आईडीई के रूप में ग्रहण का उपयोग कर रहा हूं। मैं इसका उपयोग अपने आवेदन को एक .jar फ़ाइल में निर्यात करने के लिए भी करता हूं। जब मैं अपनी कक्षाओं को .jar फ़ाइल में देखता हूं, तो मेरी कुछ कक्षाओं में उस वर्ग का नाम, एक डॉलर चिह्न, फिर एक संख्या होती है। उदाहरण:

  • $ 1.class खोजें
  • $ 2.class खोजें
  • $ 3.class खोजें
  • पता लगाएं

मैंने देखा है कि यह बड़ी कक्षाओं में ऐसा करता है। क्या यह इसलिए है क्योंकि कक्षाएं इतनी बड़ी हो जाती हैं, यह इसे कई वर्गों में संकलित करता है? मैंने गुगली की है और कई मंचों पर देखा है, और जावा डॉक्यूमेंटेशन की खोज की है, लेकिन इससे संबंधित कुछ भी नहीं मिला है। कोई समझा सकता है?


इस मुद्दे का परीक्षण करने के लिए नमूना कोड github.com/Aksi0m/SampleFor123686419
Prags

Google टीम के जारीकर्ता की प्रतिक्रिया के अनुसार। URLissues / 123736741 , यह आंतरिक रूप से तय किया गया है और नेविगेशन की अगली रिलीज़ में उपलब्ध होगा।
प्राग्स

जवाबों:


111

आंतरिक कक्षाएं, यदि आपकी कक्षा में कोई भी उपस्थित है, तो संकलित की जाएगी और कक्षा फ़ाइल होगी ClassName$InnerClassName। अनाम आंतरिक वर्गों के मामले में, यह संख्याओं के रूप में दिखाई देगा। कक्षा का आकार (जावा कोड) कई वर्गों की पीढ़ी का नेतृत्व नहीं करता है।

उदाहरण के लिए यह कोड दिया गया है:

public class TestInnerOuterClass {
    class TestInnerChild{

    }

    Serializable annoymousTest = new Serializable() {
    };
}

उत्पन्न होने वाली कक्षाएं निम्न होंगी:

  1. TestInnerOuterClass.class
  2. TestInnerOuterClass$TestInnerChild.class
  3. TestInnerOuterCasss$1.class

अपडेट करें:

अनाम वर्ग का उपयोग करना एक बुरा अभ्यास नहीं माना जाता है, यह सिर्फ उपयोग पर निर्भर करता है।

एसओ पर इस चर्चा की जाँच करें


1
ठीक है, तो क्या एक अनाम वर्ग होना बुरा है? मुझे समझ में नहीं आता कि यह कैसे काम करता है यदि मैं एक कक्षा में एक कक्षा का एक नया उदाहरण चर बनाता हूं, जो एक अनाम वर्ग है?
फ़्रीजिनेटर

नहीं, यह अनाम वर्ग के लिए बुरा नहीं है, यह उपयोग पर निर्भर करता है। मेरे पोस्ट को अपडेट किया
मप्र प्रभात

4
एक वर्ग निकाय वाली Enums स्वचालित रूप से एक अनाम आंतरिक वर्ग उत्पन्न करेगी जो Enum वर्ग का विस्तार करती है, और इस प्रकार इसमें $ के साथ एक और वर्ग फ़ाइल उत्पन्न होती है।
dlaidlaw

1
अगर आंतरिक वर्ग निजी है, तो भी एक अतिरिक्त वर्ग का नाम OuterClass $ 1.class है
संदीपगौड़ा

@mprabhat: क्या एंड्रॉइड स्टूडियो में इन कक्षाओं की पदानुक्रम या सूची देखने के लिए कोई तंत्र है?
user1090751


9

@ प्रभात द्वारा प्रस्तुत उपरोक्त मामलों के अलावा, अन्य मामले निम्न हो सकते हैं:

  1. यदि आप वर्ग में एनम चर होते हैं तो उसके लिए भी एक अलग वर्ग उत्पन्न होगा। .Class का नाम ClassName $ Name_of_enum होगा
  2. यदि आपकी कक्षा X विरासत में मिली है अर्थात एक अन्य वर्ग Y का विस्तार कर रही है , तो वहाँ एक .class नाम होगा जिसका नाम ClassName $ 1.class या ClassName $ 1 $ 1.class है
  3. यदि आपकी कक्षा X एक इंटरफ़ेस Y को लागू कर रही है , तो एक .class नाम होगा जिसका नाम ClassName $ 1.class या ClassName $ 1 $ 1.class है

ये मामले मेरे निरीक्षण पर व्युत्पन्न हैं। जार में .class फ़ाइलों पर।


मेरे पास एक वर्ग है जो इन मानदंडों में से कोई भी पूरा नहीं करता है, और Group.getName () अभी भी गलत है- Group.java के लिए, यह Group _ $$ _ jvst248_20 देता है। मुझे कुछ पता नहीं है क्या चल रहा है। निश्चित रूप से कोई भी दुश्मनी, विस्तार या लागू नहीं होता है।
अमलगोविनास

0

अनाम कक्षाओं के बारे में आपकी टिप्पणी का उत्तर देने के लिए। वे सबसे निश्चित रूप से नहीं हैं। JButton में एक एक्शन श्रोता को असाइन करने के लिए इस पर विचार करें:

JButton button = new JButton(...);
button.addActionListener(new ActionListener() { ... });

या "नाम" संपत्ति द्वारा असंवेदनशील सॉर्ट करने के लिए ऐसा करना

Collections.sort( array, new Comparator<Foo>() {
    public int compare(Foo f1, Foo f2) {
        return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase());
    }
});

अनाम वर्गों के रूप में आपको बहुत सारे Runnable और Callable भी दिखाई देंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.