5

मैं एक PersonFactory इंटरफेस के रूप में निम्नानुसार है:डिफ़ॉल्ट विधि में स्वत: निर्माता मिलान

@FunctionalInterface 
public interface PersonFactory<P extends Person> { 
    P create(String firstname, String lastname); 

    // Return a person with no args 
    default P create() { 
     // Is there a way I could make this work? 
    } 
} 

Person वर्ग:

public class Person { 
    public String firstname; 
    public String lastname; 

    public Person() {} 

    public Person(String firstname, String lastname) { 
     this.firstname = firstname; 
     this.lastname = lastname; 
    } 
} 

मैं इस तरह मेरी Person रों का दृष्टांत करने में सक्षम होना चाहता हूँ:

PersonFactory<Person> personFactory = Person::new; 

Person p = personFactory.create(); // does not work 
Person p = personFactory.create("firstname", "lastname"); // works 

क्या कोई तरीका है जिससे मैं जावा सह बना सकता हूं mpiler स्वचालित रूप से PersonFactory.create() के हस्ताक्षर से मेल करके सही कन्स्ट्रक्टर का चयन करता है?

+2

सं केवल समझदार जिस तरह से आप डिफ़ॉल्ट विधि लागू कर सकते हैं 'this.create करके है (" someDefaultFirstName "," someDefaultLastName ") ; ' –

उत्तर

5

एक तरह से एक निम्न होना होगा:

default P create() { 
    return create(null, null); 
} 

लेकिन मुझे यकीन है कि तुम क्या चाहता था नहीं हूँ। समस्या यह है कि आप एक विधि संदर्भ नहीं बना सकते हैं 2 अलग-अलग तरीकों (या रचनाकार) को संदर्भित करें। इस मामले में, आप Person::new निर्माता को संदर्भित करने के लिए और कन्स्ट्रक्टर 2 पैरामीटर लेते हुए संदर्भित करने के लिए चाहते हैं, जो संभव नहीं है।

जब आपके पास:

@FunctionalInterface 
public interface PersonFactory<P extends Person> { 
    P create(String firstname, String lastname); 
} 

और तरह

PersonFactory<Person> personFactory = Person::new; 
Person p = personFactory.create("firstname", "lastname"); 

इसका इस्तेमाल आप को एहसास है कि विधि-संदर्भ Person::new निर्माता 2 पैरामीटर लेने के लिए संदर्भित करता है। अगली पंक्ति सिर्फ पैरामीटर को पार करके इसे आमंत्रित करती है।

तुम भी अधिक स्पष्ट रूप एक लैम्ब्डा अभिव्यक्ति का उपयोग कर इसे लिख सकते हैं:

PersonFactory<Person> personFactory = (s1, s2) -> new Person(s1, s2); // see, we have the 2 Strings here 
Person p = personFactory.create("firstname", "lastname"); 
संबंधित मुद्दे