56

में बिल्डर पैटर्न कोड पीढ़ी IntelliJ में बिल्डर पैटर्न लिखने का कोई तरीका है?इंटेलिजे

उदाहरण के लिए, इस सरल वर्ग दी:

public class FilmBuilder { 

    Film film; 

    public FilmBuilder() { 
     film = new Film(); 
    } 

    public FilmBuilder withTitle(String title) { 
     film.setTitle(title); 
     return this; 
    } 

    public FilmBuilder withLength(int length) { 
     film.setLength(length); 
     return this; 
    } 

    public Film build() { 
     return film; 
    } 
} 

उत्तर

72

उपयोग Replace Constructor with Builder रिफैक्टरिंग:

class Film { 
    private String title; 
    private int length; 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public String getTitle() { 
     return this.title; 
    } 

    public void setLength(int length) { 
     this.length = length; 
    } 

    public int getLength() { 
     return this.length; 
    } 
} 

वहाँ एक रास्ता है कि मैं आईडीई इस उत्पन्न करने के लिए मिल सकता है, या इसी तरह की है।

इस फ़ंक्शन का उपयोग करने के लिए, अपने कोड में कन्स्ट्रक्टर के हस्ताक्षर पर क्लिक करें, फिर राइट क्लिक करें और "रिफैक्टर" मेनू का चयन करें, फिर कोड उत्पन्न करने के लिए संवाद बॉक्स लाने के लिए "बिल्डर के साथ कन्स्ट्रक्टर बदलें ..." पर क्लिक करें। ।

+8

क्या "setX()" से "withX()", सर्ज को बदलने का कोई तरीका है? – ae6rt

+2

या आप सेटएक्स() को सिर्फ x() में बदल सकते हैं? – Kurru

+0

अच्छा! अस्तित्व में कभी नया नहीं।धन्यवाद – vikingsteve

9

यदि आप सोच रहे हैं कि इसका उपयोग आंतरिक बिल्डर वर्ग के साथ described by Joshua Block के रूप में एक वर्ग बनाने के लिए किया जा सकता है - आपको केवल खाली खाली कक्षा को परिभाषित करना होगा, फिर "मौजूदा का उपयोग करें" जांचें और अपने नव निर्मित (आंतरिक कक्षा) और हिट "रिएक्टर"।

पीएस! कर्सर को "बिल्डर के साथ कन्स्ट्रक्टर बदलें" रिफैक्टरिंग फ़ंक्शन का उपयोग करने के लिए कन्स्ट्रक्टर (प्री-लिखित) के अंदर रहना चाहिए।

+0

यह दिलचस्प है कि ये प्लगइन्स बिल्डर पैटर्न का एक महत्वपूर्ण हिस्सा भूल जाते हैं: आपको अभी भी कन्स्ट्रक्टर में आवश्यक पैराम परिभाषित करना चाहिए। अन्यथा, आप केवल रनटाइम पर पकड़ने के लिए गायब पैरामीटर त्रुटियों को स्थिर रूप से पकड़ने से स्थानांतरित हो गए हैं। –

+0

@EJCampbell जो बिल्डर का उपयोग करने के प्रयोजनों के _one_ को हरा देगा, जो पैरामीटर को नाम संलग्न करने का तरीका प्रदान करके कोड को और अधिक पठनीय बनाने के लिए है, भले ही उन्हें आवश्यकता हो। इससे मदद मिलती है जब एक कन्स्ट्रक्टर काफी मात्रा में पैरामीटर लेता है। यह आवश्यक नहीं होगा अगर जावा ने हमें कॉल में वास्तविक पैरामीटर नाम देने की अनुमति दी, जैसे सी # और स्विफ्ट डू। – ajb

0

एक पूरक के रूप में @ CrazyCoder के जवाब देने के लिए, मुझे लगता है कि यह पता करने के लिए Replace Constructor with Builder संवाद के ऊपरी-दाएँ पक्ष में एक विन्यास बटन है कि आप setters 'उपसर्ग नाम बदलने के लिए उपयोग कर सकते हैं नहीं है कि बहुत उपयोगी है।

13

मैं कुछ कारणों के लिए थोड़ा भद्दा होने के लिए IntelliJ में निर्मित बिल्डर पैटर्न पीढ़ी पाया:

  1. यह संदर्भ के रूप में एक मौजूदा निर्माता का उपयोग करने की जरूरत है।
  2. यह "जेनरेट" मेनू (ओएस एक्स पर command+N) के माध्यम से जल्दी से सुलभ नहीं है।
  3. यह केवल बाहरी बिल्डर वर्ग उत्पन्न करता है। जैसा कि अन्य ने उल्लेख किया है, बिल्डर पैटर्न को कार्यान्वित करते समय स्थिर आंतरिक कक्षाओं का उपयोग करना बहुत आम है।

InnerBuilder plugin इन सभी कमियों को संबोधित करता है, और कोई सेटअप या कॉन्फ़िगरेशन की आवश्यकता नहीं होती है।

public class Person { 
    private String firstName; 
    private String lastName; 
    private int age; 

    private Person(Builder builder) { 
     firstName = builder.firstName; 
     lastName = builder.lastName; 
     age = builder.age; 
    } 

    public static final class Builder { 
     private String firstName; 
     private String lastName; 
     private int age; 

     public Builder() { 
     } 

     public Builder firstName(String firstName) { 
      this.firstName = firstName; 
      return this; 
     } 

     public Builder lastName(String lastName) { 
      this.lastName = lastName; 
      return this; 
     } 

     public Builder age(int age) { 
      this.age = age; 
      return this; 
     } 

     public Person build() { 
      return new Person(this); 
     } 
    } 
} 
+2

कृपया, मेरी सभी उल्लिखित समस्याओं के अंतर्निहित समाधान के लिए [मेरा उत्तर] (http://stackoverflow.com/a/35144261/875485) देखें। – jFrenetic

+0

आप कुछ अच्छे अंक @jFrenetic बनाते हैं, लेकिन मुझे अभी भी अंततः उन कामकाजों के साथ भी बहुत बोझिल होने के लिए अंतर्निहित दृष्टिकोण मिलते हैं। प्लगइन के साथ, यह सचमुच सिर्फ 'alt + shift + b',' enter', और BAM है, आपके पास आपका निर्माता है। : डी –

+0

ओएमजी यह एक सपना सच है। बिल्ट इन बिल्डर ने मेरे लिए यह नहीं किया - मैं बिल्डर को पोजो के आंतरिक वर्ग के रूप में रखना पसंद करता हूं। धन्यवाद एक प्यारी नोक! –

3

यह करने के लिए करने के लिए इंटेलीजे तरीका है, IMHO, जटिल है: यहां एक नमूना प्लगइन द्वारा उत्पन्न बिल्डर है। वहाँ दो प्लगइन्स हैं (मैं इसे एक पसंद करता हूं: https://plugins.jetbrains.com/plugin/7354) जो इस उद्देश्य को बहुत बेहतर तरीके से सेवा प्रदान करता है।

उदाहरण के लिए, मैं बिल्डर वर्ग को पोजो के आंतरिक वर्ग के रूप में पसंद करता हूं। IntelliJ के साथ इसे प्राप्त करने के लिए आपको कुछ अतिरिक्त स्ट्रोक चाहिए।

प्लगइन के लिए एक और प्लस कार्यक्षमता का स्थान है (Generate... संदर्भ मेनू में)।

9

यहाँ कैसे shortcomingsमंसूर सिद्दीकी ने उल्लेख किया काबू पाने के लिए है:

1) यह संदर्भ के रूप में एक मौजूदा निर्माता का उपयोग करने की जरूरत है।

जो उत्पन्न करना बहुत आसान है। जेनरेट मेनू का आह्वान करने और Constructor चुनने के लिए बस विंडोज़ पर Alt + इन्स हिट करें और Constructor चुनें।

2) यह "उत्पन्न" मेनू (कमांड + ओएस एक्स पर एन)

बस, Builder के लिए खोज Settings -> Keymap पर जाएं और उसे अपनी पसंद का एक शॉर्टकट असाइन के माध्यम से जल्दी से सुलभ नहीं है (यदि आप अक्सर इस कार्यक्षमता का उपयोग करते हैं, जो शायद ही कभी मामला है)। उदाहरण के लिए आप Alt + बी असाइन कर सकते हैं। एक (कार्रवाई का पता लगाएं)

एक अन्य विकल्प Ctrl +शिफ्ट + है। Builder लिखना प्रारंभ करें और आप तुरंत आदेश एक्सेस कर सकते हैं:

Find Action dialog

आप किसी भी IntelliJ विचार सुविधा तक पहुंच पाना (यह एक बहुत है जब आप वास्तव में क्या याद नहीं है में मदद करता है के लिए इस शॉर्टकट इस्तेमाल कर सकते हैं आदेश कहा जाता है और इसे कहां मिलना है)।

3) यह केवल बाहरी बिल्डर वर्ग उत्पन्न करता है। जैसा कि अन्य ने उल्लेख किया है, बिल्डर पैटर्न को कार्यान्वित करते समय स्थैतिक आंतरिक कक्षा का उपयोग करना बहुत आम है।

मैं अपने बिल्डरों को स्थैतिक आंतरिक कक्षाओं के रूप में भी पसंद करता हूं। दुर्भाग्यवश, ऐसा करने का कोई सीधा तरीका नहीं है, लेकिन यह अभी भी व्यवहार्य है। आपको केवल नेस्टेड आंतरिक कक्षा को स्वयं परिभाषित करना होगा (इसे खाली छोड़ दें), और जब आप Replace Constructor with Builder संवाद का आह्वान करते हैं, तो Use existing विकल्प चुनें और अपनी आंतरिक कक्षा का चयन करें। एक जादू की तरह काम करता है! हालांकि, यह विकल्प कॉन्फ़िगर करने योग्य बनाना आसान होगा।

0

बिल्डर पैटर्न के साथ "बहुत से पैरामीटर" को प्रतिस्थापित करने के इच्छुक लोगों के लिए, "पैरामीटर ऑब्जेक्ट निकालें" और उसके बाद कन्स्ट्रक्टर को अन्य उत्तरों में उल्लिखित निर्माता को कनवर्ट करें।

0

क्लास जेनरेट> कन्स्ट्रक्टर पर राइट क्लिक करके कक्षा के निर्माता का निर्माण करें। फिर, विंडोज़ पर, कार्रवाई खोजने के लिए Ctrl + Shift + A दबाएं और "बिल्डर" टाइप करें, चुनें "निर्माता के साथ कन्स्ट्रक्टर बदलें .."

0

मेरी राय में, आंतरिक स्थिर वर्ग को पाने का सबसे आसान तरीका एक अलग हैं:

  1. आप अभी तक एक निर्माता नहीं है, तो, एक Generate a constructor dialog
  2. का उपयोग कर उत्पन्न फिर, Replace Constructor with Builder
  3. ले जाएँ नव निर्मित कक्षा वापस प्रारंभिक एक Move refactoring (हॉटकी का उपयोग करने का उपयोग करें: F6)
संबंधित मुद्दे