2016-05-02 2 views
1

Ich möchte einen generischen Setter für alle Objekte erstellen, die setBar oder setFoo verwenden können. Diese befinden sich in einer Bibliothek, daher kann ich die Quelle für diese Klassen nicht so anpassen, dass sie von einem übergeordneten Typ erben.AOP? Adapter? Reflexionen? Wie generiere ich Setter-Methoden (ohne das Zielobjekt zu abstrahieren)

Einschränkungen: Ich benutze eine Drittanbieter-Bibliothek, die es mir nicht möglich macht, diesen Objekten eine Elternklasse zu geben, von der man sich abgrenzen kann.

zB:

class Object1 { 
    void setBar(String str){...} 
    void setFoo(String str){...} 
} 

class Object2 { 
    void setBar(String str){...} 
    void setFoo(String str){...} 
} 

class Object3 { 
    void setBar(String str){...} 
    void setFoo(String str){...} 
} 

Ich versuche folgendes zu bestimmen:

Gibt es eine Möglichkeit, ein Adapter-Entwurfsmuster mit AOP oder Reflexionen zu erstellen um die Einschränkung zu arbeiten, und die Menge an Code begrenzen benötigt, um die Setter für jedes Objekt zu behandeln?

Welche Schritte kann ich so nehmen, dass ich eine einzige Methode zu schaffen, die die Setter für jeden dieser Gegenstände abdecken wird (wenn gefordert)

+2

Ich bin verwirrt. Was ist dein eigentliches Ziel? Möchten Sie eine Methode, die drei Argumente akzeptiert, einen für jeden Setter? Was meinst du mit _single method_? Versuchen Sie wirklich, die Setter auf Objekte, die Sie wegwerfen, sofort aufzurufen? –

+0

Können Sie ein Beispiel geben, wie Ihre einzelne Methode aufgerufen wird und was sie tun würde? Möchten Sie zum Beispiel setSetter2 (..) für ein beliebiges Objekt der Klassen object1, object2 oder object 3 aufrufen? Wenn nicht, was sollte es tun? – n13

+0

Meine Frage angepasst. Das Ziel ist es, eine gemeinsame setBar und setFoo zu machen. Denken Sie daran, dass ich es nicht implementieren kann. – shinjw

Antwort

2

Sie adapters verwenden könnte, dass eine gemeinsame Schnittstelle implementieren:

interface CommonInterface { 
    void setBar(String str); 
    void setFoo(String str); 
} 

class Object1Adapter implements CommonInterface { 
    private final Object1 obj; 

    public Object1Adapter(Object1 obj) { 
     this.obj = obj; 
    } 

    @Override 
    public void setBar(String str) { 
     obj.setBar(str); 
    } 
    ... 
} 

class Object2Adapter implements CommonInterface {...} 
class Object3Adapter implements CommonInterface {...} 

Dann können Sie die Adapter dann unter dem CommonInterface Typ speichern.


Wenn Sie die Setter in CommonInterface mit 1 funnelling Methode aufrufen Sie dies tun könnte (Sie werden nach wie vor die Adapterklassen müssen):

interface CommonInterface { 
    enum Setter { 
     Bar, 
     Foo; 
    } 

    void setBar(String str); 
    void setFoo(String str); 

    default void set(Setter set, String value) { 
     switch(set) { 
     case Bar: 
      setBar(value); 
      break; 
     case Foo: 
      setFoo(value); 
      break; 
     default: // Do nothing 
     } 
    } 
} 

Sie dann alles wie diese verwenden:

CommonInterface obj = new Object1Adapter(new Object1()); 
obj.set(CommonInterface.Setter.Bar, "Hello"); // Uses 'setBar' 
Verwandte Themen