2011-08-22 16 views
11

कृपया मुझे बताएं कि यह अनुचित के रूप में अनुचित है (विशेष रूप से प्रोग्रामर.एसई या कुछ प्रश्न के लिए बेहतर होगा।)तरीके?

ठीक है। तो मुझे कई 'लक्षण' मिल गए हैं जिन्हें मैं वर्तमान में इंटरफेस के रूप में व्यक्त कर रहा हूं। आइए उन्हें "अद्यतन करने योग्य" और "विनाशकारी" कहें। उन्हें इंटरफेस के रूप में व्यक्त करना नकारात्मक है कि मैं सभी "विनाशकारी" घटकों के बीच व्यवहार साझा नहीं कर सकता; दूसरी तरफ, इन्हें अमूर्त वर्गों के रूप में व्यक्त करने का मतलब है कि मिश्रित विशेषता को स्पष्ट रूप से परिभाषित किए बिना मिश्रण और मिलान नहीं कर सकता, क्योंकि एक और अमूर्त वर्ग ("अद्यतन करने योग्य और डिज़ाइनिबल") और इसके अलावा यह उस बिंदु पर अमूर्त वर्ग की कार्यक्षमता के दुरुपयोग की तरह लगता है। हालांकि, शायद यह है कि अगर मैं इसे संभालने के क्लीनर तरीके नहीं हैं तो मैं क्या करूँगा।

इस विकल्प के लिए शुद्ध जावा समाधान के रूप में मेरे विकल्प क्या हैं? क्या मेरे लिए साझा व्यवहार का वर्णन करना संभव है और फिर मिश्रण और मिलान करें क्योंकि मैं स्पष्ट रूप से प्रत्येक क्रमपरिवर्तन का वर्णन किए बिना फिट देखता हूं?

+2

आप descibing हैं * mixins * - एक उपयोगी अवधि हो सकता है अगर आप एक कर रहे हैं खोज। – Jesper

उत्तर

6

शायद आप इंटरफेस और डिफ़ॉल्ट कार्यान्वयन के मिश्रण का उपयोग करके लक्ष्य प्राप्त कर सकते हैं।

तरह:

public interface Updatable { 
    void updated(); 
} 

public interface Loadable { 
    void load(); 
} 

public class DefaultUpdatable implements Updatable { 
... 
} 

public class DefaultLoadable implements Loadable { 
... 
} 

public class SomeObject implements Updatable, Loadable { 
    private final Updatable updatable = new DefaultUpdatable(); 
    private final Loadable loadable = new DefaultLoadable(); 

    public void load() { 
    this.loadable.load(); 
    } 

    public void updated() { 
    this.updatable.updated(); 
    } 
} 

फिर भी शोर और हो सकता है के रूप में लचीला नहीं आप चाहते हैं के रूप में लेकिन शायद थोड़ा UpdatableAndDestructable बात कर की तुलना में क्लीनर।

+0

+1 और स्वीकार किया गया, यह समस्या को संभालने का एक समझदार तरीका है। (बस इसे जांचते समय, मुझे गुइस जैसे कई उपयोगी ढांचे मिल गए हैं जो इस तरह के तर्क का उपयोग करने के लिए थोड़ा कम दर्दनाक बनाते हैं।) –

4

मुझे पता है कि आपने "शुद्ध जावा" कहा है, लेकिन यह कुछ Scala अच्छा है। जावा भाषा में सीमाएं अन्य जेवीएम भाषाओं को अपनाने के लिए एक मजबूत चालक हैं ...

+0

इस सुझाव के लिए धन्यवाद। –

5

मुझे नहीं लगता कि इस समस्या का एक बहुत अच्छा समाधान है, लेकिन हो सकता है कि आप बॉयलरप्लेट को कितना तुच्छ मानें इस पर निर्भर करते हुए कुछ व्यावहारिक हो।

आप किसी अन्य वर्ग + इंटरफ़ेस के रूप में एक विशेषता को परिभाषित कर सकते हैं, जो आवृत्ति ऑब्जेक्ट को पहले पैरामीटर के रूप में लेता है। और वे उस कक्षा के साथ इंटरफ़ेस को कार्यान्वित करते हैं, जिसमें आप विशेषता चाहते हैं। फिर स्टब विधियों को बनाएं जो विशेषता इत्यादि पर विधियों को कॉल करें।

public class MyClass implements MyTrait { 
    @Override 
    public void doSomething() { 
     MyTraitImpl.doSomething(this); 
    } 
} 

और फिर विशेषता खुद के लिए:

public interface MyTrait { 
    public void doSomething(); 
} 

public class MyTraitImpl { 
    public static void doSomething(MyTrait obj) { 
     // do something with obj 
    } 
} 

अर्नेस्ट फ्राइडमैन-हिल कहते हैं यद्यपि, स्काला आप के लिए यह करता है (के रूप में मैं इसे समझते हैं, यह है कि यह कैसे JVM पर लक्षण लागू करता है) ।

1

मामले आप lombok के रूप में शुद्ध जावा का उपयोग कर विचार में, आप इस तरह @Delegate का उपयोग करके अपने जीवन को आसान बनाने में कर सकते हैं:

public class SomeObject implements Updatable, Loadable { 
    @Delegate private final Updatable updatable = new DefaultUpdatable(); 
    @Delegate private final Loadable loadable = new DefaultLoadable(); 
} 
संबंधित मुद्दे