जावा में भी संरचनाओं का अपना स्थान है। आपको केवल उनका उपयोग करना चाहिए यदि निम्नलिखित दो चीजें सत्य हैं:
- आपको बस डेटा को एग्रीगेट करना होगा, जिसमें कोई व्यवहार नहीं है, उदाहरण के लिए एक पैरामीटर के रूप में
- यह एक बिट से कोई फर्क नहीं पड़ता कि डेटा किस प्रकार के मूल्यों का है
यदि यह मामला है, तो आपको खेतों को सार्वजनिक करना चाहिए और गेटर्स / सेटर को छोड़ देना चाहिए। गेटर्स और सेटर वैसे भी क्लिंक होते हैं, और जावा एक उपयोगी भाषा जैसे गुण नहीं होने के लिए मूर्खतापूर्ण है। चूँकि आपकी संरचना जैसी वस्तु में कोई भी तरीका नहीं होना चाहिए, इसलिए सार्वजनिक क्षेत्र सबसे ज्यादा मायने रखते हैं।
हालाँकि, यदि उनमें से एक भी लागू नहीं होता है, तो आप एक वास्तविक वर्ग के साथ काम कर रहे हैं। अर्थात सभी क्षेत्र निजी होने चाहिए। (यदि आपको अधिक सुलभ दायरे में किसी क्षेत्र की आवश्यकता है, तो गेट्टर / सेटर का उपयोग करें।)
यह जांचने के लिए कि क्या आपके माना-संरचना में व्यवहार है, जब खेतों का उपयोग किया जाता है तो देखें। यदि यह बताने का उल्लंघन लगता है , तो मत पूछिए , फिर आपको उस व्यवहार को अपनी कक्षा में ले जाने की आवश्यकता है।
यदि आपका कुछ डेटा नहीं बदलना चाहिए, तो आपको उन सभी फ़ील्ड को अंतिम बनाने की आवश्यकता है। आप अपनी कक्षा को अपरिवर्तनीय बनाने पर विचार कर सकते हैं । यदि आपको अपने डेटा को मान्य करने की आवश्यकता है, तो बसने वालों और निर्माणकर्ताओं में सत्यापन प्रदान करें। (एक उपयोगी चाल एक निजी सेटर को परिभाषित करना है और केवल उस सेटर का उपयोग करके अपने क्षेत्र के भीतर अपने क्षेत्र को संशोधित करना है।)
आपका बोतल उदाहरण सबसे अधिक संभावना दोनों परीक्षणों में विफल होगा। आपके पास (इस तरह दिखता है) कोड हो सकता है:
public double calculateVolumeAsCylinder(Bottle bottle) {
return bottle.height * (bottle.diameter / 2.0) * Math.PI);
}
इसके बजाय यह होना चाहिए
double volume = bottle.calculateVolumeAsCylinder();
यदि आपने ऊंचाई और व्यास को बदल दिया, तो क्या यह एक ही बोतल होगी? शायद ऩही। वे अंतिम होना चाहिए। क्या व्यास के लिए ऋणात्मक मान ठीक है? आपकी बोतल चौड़ी होने की तुलना में लंबी होनी चाहिए? क्या कैप शून्य हो सकती है? नहीं? आप इसे कैसे मान्य कर रहे हैं? मान लें कि ग्राहक या तो मूर्ख या दुष्ट है। ( अंतर बताना असंभव है। ) आपको इन मूल्यों की जांच करने की आवश्यकता है।
यह आपके नए बोतल वर्ग की तरह लग सकता है:
public class Bottle {
private final int height, diameter;
private Cap capType;
public Bottle(final int height, final int diameter, final Cap capType) {
if (diameter < 1) throw new IllegalArgumentException("diameter must be positive");
if (height < diameter) throw new IllegalArgumentException("bottle must be taller than its diameter");
setCapType(capType);
this.height = height;
this.diameter = diameter;
}
public double getVolumeAsCylinder() {
return height * (diameter / 2.0) * Math.PI;
}
public void setCapType(final Cap capType) {
if (capType == null) throw new NullPointerException("capType cannot be null");
this.capType = capType;
}
// potentially more methods...
}