2016-07-29 7 views
1

Eine Klasse hat viele Methoden, die eine ähnliche Struktur haben.Wie kann ich die Variantenfunktion mit mehreren Parametern stabil umhüllen?

public void notifyProcessingAboutReplay(String transactionId, int matchId, boolean replay){ 
    // PART 1 
    //------------ 
    // much preparation and checking with possible returns, 
    // that all results in a correct item instance. 
    //----------- 

    //  PART 2 
    // here can be one or many calls, connected to that item 
    // and maybe to parameters after the second one 
    item.setReplay(replay); 
    item.rewind(); 
} 

Jede Methode hat zwei oder mehr Parameter. Der erste Teil der Methode überprüft die ersten beiden Parameter und erstellt möglicherweise einen Eintrag für die weitere Arbeit. Vielleicht kommt es nur zurück. Dieser erste Teil ist in allen Methoden gleich.

Die zweiten Teile der Methoden unterscheiden sich sehr. Sie arbeiten mit diesem Element und Parametern nach dem zweiten (falls es welche gibt).

Ich möchte diese beiden Teile in einer Basismethode und vielen Teilmethoden trennen, die in die Basismethode, wahrscheinlich als Runnable, übergeben werden. Aber ich kann die Variante Runnable nicht als item.variantRunnable() anrufen, geschweige denn item.variantRunnable(arg1, arg2...). Offensichtlich ist mein Wissen über Injektion und Runnables zu niedrig.

+0

AOP vor Rat? – sidgate

+0

@sidgate "Ich kann die Variante Runnable nicht als item.variantRunnable()" aufrufen. Alle Antworten, die ich gefunden habe, können nicht auf diese Weise verwendet werden. Die vorherige Arbeit sehnte sich viele Stunden und ihr Ergebnis ist negativ. Der Beitrag muss kurz und verständlich sein und alle notwendigen Informationen enthalten. Ich sehe keinen Weg, wie ich es verbessern könnte. Laut deiner leeren Nachricht auch du. – Gangnus

Antwort

2

Sie könnten eine Parameter-Klasse erstellen:

class Parameter { 
    Item item; 
    boolean replay; 
    //other params 
} 

Und es als ein einziger Zugangspunkt zu den Teil Methoden verwenden:

void baseMethod(Consumer<Parameter> partialMethod, Parameter param) { 
    //common stuff 
    param.setItem(item); 
    //set other relevant things 
    partialMethod.accept(param); 
} 

//example use: 
baseMethod(this::partialMethod1, new Parameter(replay=true, ...)); 

void partialMethod1(Parameter param) { 
    //do what you gotta do 
    param.getItem().setReplay(param.getReplay)); 
    param.getItem().rewind(); 
} 
+0

Danke. Es scheint, dass das funktionieren könnte. Ich werde versuchen und schauen, ob das bequem ist. Aber ich bin mir nicht sicher, ob ich es heute schaffen werde. – Gangnus