क्या जावा स्ट्रक्चर्स का समर्थन करता है?


92

क्या जावा में C ++ का एनालॉग है struct:

struct Member {
  string FirstName; 
  string LastName;  
  int BirthYear; 
};

मुझे अपने स्वयं के डेटा प्रकार का उपयोग करने की आवश्यकता है।


बहुत अधिक शाब्दिक रूप से नकल करने वालों के लिए: जावा में फ़ील्ड को वास्तव में लोअरकेस वर्ण से शुरू करने की आवश्यकता होती है, इसलिए firstName, lastNameऔर birthYear(या yearOfBirthनिश्चित रूप से)।
मार्टेन बॉड्यूज

जवाबों:


52

जावा में निश्चित रूप से कोई संरचना नहीं है :) लेकिन आप यहाँ जो वर्णन करते हैं वह जावा की तरह का वर्ग दिखता है।


30
ठीक है, केवल सार्वजनिक चर के साथ एक वर्ग एक स्टेक की तरह भयानक दिखता है।
mglauche

10
इस उत्तर के 9 साल बाद हमारे पास जावा 14 में रिकॉर्ड होगा । यह मनोरंजक है कि समय कितनी तेजी से उड़ता है।
जॉर्ज लेउंग

कक्षाओं और संरचनाओं के बीच एक प्रमुख अंतर यह है कि वे स्मृति में कैसे व्यवहार करते हैं। इस संबंध में, यह उत्तर गलत है। जावा में ऐसा कुछ भी नहीं है जो एक संरचना की तरह व्यवहार करता है, लेकिन inline classनिकट भविष्य में किसी बिंदु पर उम्मीद है कि मेरा मानना ​​है कि यह एक संरचना की तरह है।
विल काल्डरवुड

बीन में गुण होते हैं (यानी गेटर्स और आमतौर पर बसने वाले) और आजकल आम तौर पर इसके लिए एनोटेट किया जाता है ताकि बीन के लिए आवश्यकताओं का अनुपालन किया जा सके।
मार्टेन बॉड्यूस

88

एक संरचना में जावा के बराबर होगा

class Member
{
    public String FirstName; 
    public String LastName;  
    public int    BirthYear; 
 };

और सही परिस्थितियों में इसके साथ कुछ भी गलत नहीं है। C ++ के समान ही वास्तव में जब आप संकुचित छंदों के साथ एक वर्ग का उपयोग करते हैं तब आप छंद का उपयोग करते हैं।


22
मैं जावा में "POD" प्रकार की कक्षाओं का उपयोग उन्हीं परिस्थितियों में करता हूँ जैसे मैं C ++ में करता हूँ। जे 2 ईई में "वैल्यू ऑब्जेक्ट्स" स्प्रिंग को ध्यान में रखें जहां आपके पास एक विधि है जो एक ही बार में कई मान लौटा रही है। गेट्टर और सेटर विधियों के साथ डेटा को इनकैप्सुलेट करने का कोई मतलब नहीं है, बस खेतों को सार्वजनिक करें - कम और अधिक वर्णनात्मक। कुछ भी "उचित" मैं एनकैप्सुलेट करता हूं, उसी में मैं सी ++ में था। इसलिए मैं अपनी मूल टिप्पणी के साथ खड़ा हूं, लेकिन यह एक शैली पसंद है। मुझे नहीं लगता है कि आप कुछ भी ढीला कर सकते हैं, और वास्तव में मुझे लगता है कि यह अधिक वर्णनात्मक है जब आपको मिला है एक मूल्य वर्ग है।
टॉम क्वारेंडन

16
अर्धविराम के साथ जावा में एक वर्ग को समाप्त करने की आवश्यकता नहीं है।
शेफ फिरौन

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

4
@ULazdins: मुझे लगता है कि आप C ++ स्ट्रक्चर्स के साथ C # स्ट्रक्चर्स को भ्रमित कर रहे हैं। जब आप C ++ में किसी विधि के लिए एक क्लास पास करते हैं, तो यह कॉपी कंस्ट्रक्टर को कॉल करता है, जो डिफ़ॉल्ट रूप से प्रत्येक फ़ील्ड को कॉपी करता है। आपको संदर्भ द्वारा इसे पास करने के लिए वाक्यविन्यास का स्पष्ट रूप से उपयोग करना होगा।
रोनाल्डो नज़रिया

4
@PabloAriel मैं भी अपनी पहले की टिप्पणी से असहमत था। मेरी सोच को 7 साल में विकसित करने की अनुमति है;)
माइकल बेरी

16

वास्तव में सी ++ में एक संरचना एक वर्ग है (जैसे आप वहां तरीकों को परिभाषित कर सकते हैं, इसे बढ़ाया जा सकता है, यह बिल्कुल एक कक्षा की तरह काम करता है), एकमात्र अंतर यह है कि डिफ़ॉल्ट एक्सेस मोडफ़ायर सार्वजनिक रूप से सेट होते हैं (उन कक्षाओं के लिए जो वे निजी सेट हैं डिफ़ॉल्ट रूप से)।

यह वास्तव में C ++ का एकमात्र अंतर है, बहुत से लोग यह नहीं जानते हैं। ; )


14

जावा में C ++ की संरचना का एनालॉग नहीं है, लेकिन आप सभी सार्वजनिक सदस्यों के साथ कक्षाओं का उपयोग कर सकते हैं।


15
वास्तव structमें सी ++ में ( बहुत ज्यादा ) classसी ++ में एक ही चीज है।
जोकिम सॉर

इन सदस्यों को ऐसा करने की आवश्यकता publicक्यों है , क्यों न उन्हें पैकेज में आंतरिक रूप से बहुत कम से कम रखा जाए? उस तरह की कक्षाएं आम तौर पर एक एपीआई में उपयोग के लिए फिट नहीं होती हैं (यदि संभव हो तो केवल nullसंदर्भ के लिए)। हमेशा न्यूनतम दृश्यता का उपयोग करें!
मार्टेन बॉड्यूस

8

प्रोजेक्ट JUnion के साथ आप @Struct एनोटेशन के साथ एक क्लास एनोटेट करके जावा में स्ट्रक्चर्स का उपयोग कर सकते हैं

@Struct
class Member {
  string FirstName; 
  string LastName;  
  int BirthYear; 
}

परियोजना की वेबसाइट पर अधिक जानकारी: https://tehleo.github.io/junion/


अच्छी चीज़। अब मैं समझता हूं कि स्मृति में संरचनाओं (वस्तुओं) का प्रतिनिधित्व कैसे किया जाता है। धन्यवाद आदमी :)
11:21

6

हां, एक वर्ग जो आपको चाहिए। एक वर्ग अपने प्रकार को परिभाषित करता है।


5

हां, जावा में अभी तक संरचना / मूल्य प्रकार नहीं है। लेकिन, जावा के आगामी संस्करण में, हम प्राप्त करने जा रहे हैं inline classजो सी # में संरचना के समान है और हमें आवंटन मुक्त कोड लिखने में मदद करेगा।


inline class point { 
  int x;
  int y;
}


2

"वास्तव में" शुद्ध संरचनाएं जावा में समर्थित नहीं हैं। जैसे, C # उन structपरिभाषाओं का समर्थन करता है जो मूल्यों का प्रतिनिधित्व करते हैं और कभी भी आवंटित किए जा सकते हैं।

जावा में, C ++ स्ट्रक्चर्स का एक अनुमान प्राप्त करने का अनूठा तरीका

struct Token
{
    TokenType type;
    Stringp stringValue;
    double mathValue;
}

// Instantiation

{
    Token t = new Token;
}

(स्टेटिक बफर या सूची) का उपयोग किए बिना कुछ ऐसा कर रहा है

var type = /* TokenType */ ;
var stringValue = /* String */ ;
var mathValue = /* double */ ;

तो, बस चर का आवंटन करें या सांख्यिकीय रूप से उन्हें एक वर्ग में परिभाषित करें।

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