लघु जवाब कोई लेकिन ध्यान रखें कि यह एक प्रायोगिक सुविधा है। आप जो पूछते हैं वह संभव नहीं है। प्रतिबिंब रनटाइम पर कोड को देखता है और गतिशील रूप से विधियों को आमंत्रित करता है, यह वास्तविक तरीकों को उत्पन्न नहीं कर सकता है।
आप होगा कर सकता है क्या:
Foo foo = ReflectiveBuilder.from(Foo.class).
set("id", 1).
set("title", "title").
build();
इस तीन बड़े पैमाने पर समस्या है:
- क्षेत्रों
String
रों हैं - एक टाइपो एक संकलन समय एक के बजाय एक रनटाइम त्रुटि का कारण बनता है ,
- मान
Object
एस हैं - गलत प्रकार संकलन समय के बजाय रनटाइम त्रुटि का कारण बनता है, और
- यह विकल्प से बहुत धीमा होगा क्योंकि प्रतिबिंब बहुत धीमा है।
तो एक प्रतिबिंब आधारित समाधान, जबकि संभव हो (अपाचे कॉमन्स बीनयूट्स BeanMap
देखें) बिल्कुल व्यावहारिक नहीं है।
लंबे उत्तर, यदि आप कुछ संकलन समय जादू की अनुमति देने के इच्छुक हैं, तो आप Project Lombok का उपयोग कर सकते हैं। लंबोक के पीछे विचार जावा एनोटेशन प्रीप्रोसेसर सिस्टम का उपयोग करके एनोटेशन से बॉयलरप्लेट कोड उत्पन्न करना है।
वास्तव में जादुई बात यह है कि सभी आईडीई, कम से कम बड़े 3, एनोटेशन प्रीप्रोकैसिंग और कोड पूर्ण होने को समझते हैं, फिर भी कोड सही ढंग से कार्य करेगा, भले ही कोड वास्तव में मौजूद न हो।
एक एक Builder
साथ POJO
आप @Data
उपयोग कर सकते हैं के मामले में और @Builder
@Data
@Builder
public class Foo {
public int id;
public String title;
public boolean change;
...
}
@Data
एनोटेशन उत्पन्न करेगा:
- एक आवश्यक तर्क निर्माता (है कि सभी
final
क्षेत्रों लेता है),
equals
और hashCode
विधियां जो सभी फ़ील्ड का उपयोग करती हैं (@EqualsAndHashCode
टिप्पणी के साथ विन्यस्त किया जा सकता)
- सभी क्षेत्रों पर एक
toString
विधि ((खेतों पर @Getter
/@Setter
एनोटेशन का उपयोग विन्यस्त किया जा सकता @ToString
एनोटेशन और
public
getters और सभी क्षेत्रों के लिए निर्धारक के साथ विन्यस्त किया जा सकता है)।
@Builder
एनोटेशन Builder
कि Foo.builder()
का उपयोग कर instantiated जा सकती है, कहा जाता है एक आंतरिक वर्ग उत्पन्न होगा।
सुनिश्चित करें कि आप equals
, hashCode
और toString
तरीकों कॉन्फ़िगर के रूप में यदि आप एक दूसरे के लिए संदर्भ है लंबोक के साथ दो वर्गों है तो आप डिफ़ॉल्ट मामले में एक अनंत लूप के साथ अंत के रूप में दोनों वर्गों में अन्य शामिल होंगे बनाने करो इन तरीकों से।
वहाँ भी है एक नया configuration system उदाहरण के लिए, आप का उपयोग करने की अनुमति देता है कि, धाराप्रवाह setters ताकि आप के और अधिक कम बिल्डर को दूर कर सकते हैं कि आपके POJO परिवर्तनशील है:
new Foo().setId(3).setTitle("title)...
एक और दृष्टिकोण के लिए आप कर सकते हैं Aspect-oriented programming (एओपी) और AspectJ पर देखें। एओपी आपको अपने वर्गों को "पहलुओं" में काटने की अनुमति देता है और फिर प्री-कंपाइलर का उपयोग करके कुछ नियमों का उपयोग करके उन्हें एक साथ चिपकाता है। उदाहरण के लिए आप कस्टम एनोटेशन और एक पहलू का उपयोग करके, लॉमोकॉक वास्तव में क्या कार्यान्वित कर सकते हैं। हालांकि यह एक काफी उन्नत विषय है, और शायद अधिक हो सकता है।
क्या आप ToString हैशकोड के लिए अपाचे कॉमन्स का उपयोग कर रहे हैं और बराबर हैं? यह अभी भी एक दर्द है, लेकिन आपको बहुत समय बचाएगा। आपके कोड में बेस क्लास है जो प्रतिबिंबित करता है, स्ट्रिंग, बराबर और हैशकोड तब आपके सभी POJO को – Leon
@Leon I do, वास्तव में प्राप्त करता है। लेकिन प्रत्येक वर्ग अभी भी प्रत्येक निर्माता से कोड की 70-100 लाइनों को समाप्त कर देगा।एक बेहतर पैटर्न होना चाहिए जिसे मैं सिर्फ एक प्रतिबिंबित निर्माता को लागू करने के लिए नहीं जानता हूं या कम से कम ऐसा महसूस करता हूं। – buildpattern