पर सीरियलज़ेबल पेश करना मुझे विश्वास है कि यह वास्तव में एक आम मामला होना चाहिए, फिर भी मुझे कोई सर्वोत्तम प्रथा नहीं मिल रही है। मान लें कि मेरे पास निम्न श्रेणी है:मौजूदा कोड
public class Equation {
private Operator operator;
private Object leftValue;
private Object rightValue;
// getters and setters
}
public enum Operator {...}
यह कक्षा हमारे साथ कुछ वर्षों से पहले से ही अच्छी तरह से उपयोग की जा रही है और इसका उपयोग किया जाता है। अब मुझे इसे क्रमबद्ध करने की जरूरत है। मैं उसको कैसे करू?
बस implements Serializable
जोड़ने उस मामले में, Equation
वर्ग केवल जब तक मान Serializable
हैं काम करता है। चूंकि समीकरण केवल संख्याओं पर काम करते हैं (शायद तिथियां और तार?) जो काम कर सकते हैं। लेकिन मूल्य Object
किसी भी तरह का हो सकता है, इसलिए एक बेहतर तरीका होना चाहिए।
मेक महत्व देता Serializable
public class Equation implements Serializable{
private Operator operator;
private Serializable leftValue;
private Serializable rightValue;
// getters and setters
}
यह किसी भी मामले में काम करता है, लेकिन इन परिवर्तनों एक API तोड़ रहे हैं। और इससे कोई फर्क नहीं पड़ता कि मुझे कक्षा का उपयोग करके सभी कोड बदलने की ज़रूरत है, जिससे संभावित रूप से और भी एपीआई ब्रेक होते हैं। एक बड़ी सॉफ्टवेयर प्रणाली के लिए जो उम्र ले सकती है।
मेक Serializable
को महत्व देता है, getters और setters को वैसे ही छोड़
public void setLeftValue(Object leftValue) {
if (!(leftValue instanceof Serializable))
throw new IllegalArgumentException("Value must be Serializable!");
this.leftValue = leftValue;
}
इस कोड को कोई मौजूदा एपीआई टूट जाता है, लेकिन कैसे कोड बर्ताव बदल जाता है। फिर भी अगर मुझे लगता है कि सभी मान Serializable
हैं, तो मुझे लगता है कि यह जाने का तरीका हो सकता है। मैं पुराने सेटर्स के बगल में नए सेटर्स भी डाल सकता हूं और उन्हें भविष्य में डेवलपर्स के लिए यह स्पष्ट करने के लिए बहिष्कृत कर सकता हूं कि किस वस्तु का उपयोग करना है।
मेक transient
को महत्व देता है:
कम से कम है कि क्या सोनार पता चलता है। फिर भी यह कम से कम उन सभी मामलों में एक अनुपयोगी वर्ग की ओर जाता है जहां हमें वास्तव में Equation
Serializable
होने की आवश्यकता होती है।
कार्यान्वयन कि है Serializable
बनाएँ:
public class SerializableEquation extends Equation implements Serializable{
private Serializable leftValue;
private Serializable rightValue;
// override getters and setters
}
इस तरह हम जो बदसूरत की तरह लगता है क्रमबद्धता प्रयोजनों के लिए एक पूरी अलग वर्ग, का उपयोग करना होगा, यह नहीं करता है?
प्रश्न:
एक अच्छा तरीका उपयोग के इस मामले को संभालने के लिए क्या है? मैं आदर्श रूप से एपीआई तोड़ना नहीं चाहता। और जावा के रूप में देखकर अभी तक एपीआई तोड़ना है, इस तरह के मामलों को संभालने का एक तरीका होना चाहिए।
यह स्पष्ट रूप से कार्यान्वयन की समस्या है, 'ऑब्जेक्ट' के बजाय 'ऑपरेंड' वर्ग/इंटरफ़ेस होना चाहिए। उस स्थिति में, आपको केवल उस वर्ग/इंटरफ़ेस में कार्यान्वयन जोड़ना होगा। – AxelH
आपका प्रश्न जावा के अंतर्निहित धारावाहिक तंत्र के नुकसान को दिखाता है। कक्षाओं को serializable बनाने के लिए वास्तव में आवश्यक है? या आप कुछ अन्य समाधान ढूंढ सकते हैं, उदाहरण के लिए कक्षाएं लिखें जो 'समीकरण' ऑब्जेक्ट्स को मानक प्रारूप में एक्सएमएल या जेएसओएन में पढ़/लिख सकते हैं। – Jesper
सीरियलज़ेबल लागू करें। दस्तावेज कि एक समीकरण केवल serializable हो सकता है अगर इसके मूल्य भी हैं (हालांकि यह स्पष्ट होना चाहिए)। ArrayList किसी भी प्रकार का ऑब्जेक्ट स्टोर करता है, और अभी भी Serializable लागू करता है। आपको वही काम करने से डरना नहीं चाहिए। –