यह केवल एक अर्द्ध गंभीर सुझाव है, लेकिन हम mikera's answer को टाइपएफ़ होने के लिए संशोधित कर सकते हैं।
कहो हमने:
public class A {
private final String foo;
private final int bar;
private final Date baz;
}
फिर हम लिखना:
public abstract class AProperty<T> {
public static final AProperty<String> FOO = new AProperty<String>(String.class) {};
public static final AProperty<Integer> BAR = new AProperty<Integer>(Integer.class) {};
public static final AProperty<Date> BAZ = new AProperty<Date>(Date.class) {};
public final Class<T> propertyClass;
private AProperty(Class<T> propertyClass) {
this.propertyClass = propertyClass;
}
}
और:
public class APropertyMap {
private final Map<AProperty<?>, Object> properties = new HashMap<AProperty<?>, Object>();
public <T> void put(AProperty<T> property, T value) {
properties.put(property, value);
}
public <T> T get(AProperty<T> property) {
return property.propertyClass.cast(properties.get(property));
}
}
उन्नत डिजाइन पैटर्न और/या अस्पष्ट जावा चाल के रूप में इस पहचान लेगा की-पीने के शौकीन एक टाइपफेफ विषम कंटेनर। बस आभारी रहें मैंने getGenericSuperclass()
का भी उपयोग नहीं किया।
फिर, लक्ष्य कक्षा में वापस:
public A(APropertyMap properties) {
foo = properties.get(AProperty.FOO);
bar = properties.get(AProperty.BAR);
baz = properties.get(AProperty.BAZ);
}
यह सब इस तरह प्रयोग किया जाता है:
APropertyMap properties = new APropertyMap();
properties.put(AProperty.FOO, "skidoo");
properties.put(AProperty.BAR, 23);
A a = new A(properties);
बस lulz के लिए, हम भी नक्शा एक धाराप्रवाह इंटरफ़ेस दे सकते हैं:
public <T> APropertyMap with(AProperty<T> property, T value) {
put(property, value);
return this;
}
जो कॉलर्स लिखते हैं:
A a = new A(new APropertyMap()
.with(AProperty.FOO, "skidoo")
.with(AProperty.BAR, 23));
इसमें बहुत कम सुधार हैं जो आप कर सकते हैं। AProperty
में प्रकारों को अधिक सुंदर ढंग से संभाला जा सकता है। APropertyMap
में एक कन्स्ट्रक्टर के बजाए एक स्थिर कारखाना हो सकता है, जिससे आप कोड की अधिक धाराप्रवाह शैली की अनुमति दे सकते हैं, अगर आप उस तरह की चीज में हैं। APropertyMap
build
विधि विकसित कर सकता है जो A
के कन्स्ट्रक्टर को कॉल करता है, अनिवार्य रूप से इसे एक निर्माता में बदल देता है।
आप इनमें से कुछ वस्तुओं को और अधिक सामान्य बना सकते हैं। AProperty
और APropertyMap
में जेनेरिक बेस क्लास हो सकते हैं जो कार्यात्मक बिट्स करते थे, बहुत सरल A
-विशिष्ट उप-वर्गों के साथ।
यदि आप विशेष रूप से उद्यम महसूस कर रहे हैं, और आपकी डोमेन ऑब्जेक्ट्स जेपीए 2 इकाइयां थीं, तो आप संपत्ति वस्तुओं के रूप में मेटामोडेल विशेषताओं का उपयोग कर सकते हैं। यह नक्शा/निर्माता कुछ और काम कर देता है, लेकिन यह अभी भी बहुत आसान है; मेरे पास एक सामान्य बिल्डर है जो 45 लाइनों में काम करता है, जिसमें एक इकाई के उप-वर्ग के साथ एक एकल लाइन विधि होती है। बिल्डर के लिए
आपको अपने निर्माता में गेटर्स की भी आवश्यकता नहीं है, और ए का कन्स्ट्रक्टर निजी हो सकता है। यह कन्स्ट्रक्टर के बजाय बिल्ड() विधि में पैरामीटर की जांच करने की अनुमति देता है। –
सच है। मैंने ए के सीटीआर निजी बनाने पर विचार किया। यह शायद क्लीनर है। –
एक और फायदा यह है कि निर्माता पैरामीटर के आधार पर ए, एबीस या एटीर (एबीएस और एटर ए के उप-वर्ग होने का एक उदाहरण वापस करने का विकल्प चुन सकता है। –