Ich habe zwei Methoden, die entweder eine Circle
oder eine Scene
nehmen und den Hintergrund rot - grün - blau blinken lassen, indem Sie den Wert fill
alle N ms ändern.Zwei überladene Methoden, gleiche Aktionen, doppelter Code
Die beiden Methoden:
private void makeRGB(Circle c) {
Timer t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if(c.getFill() == Color.RED) {
c.setFill(Color.GREEN);
} else if (c.getFill() == Color.GREEN) {
c.setFill(Color.BLUE);
} else {
c.setFill(Color.RED);
}
}
},0, RGB_CHANGE_PERIOD);
}
private void makeRGB(Scene s) {
Timer t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if(s.getFill() == Color.RED) {
s.setFill(Color.GREEN);
} else if (s.getFill() == Color.GREEN) {
s.setFill(Color.BLUE);
} else {
s.setFill(Color.RED);
}
}
},0, RGB_CHANGE_PERIOD);
}
Offensichtlich sind diese sehr ähnlich, aber wie Circle
und Scene
nicht in der gleichen Vererbungsbaum sind ich nicht den Ansatz, den Aufruf einer übergeordneten Klasse von ihnen die beide enthalten, verwenden können .setFill()
/.getFill()
Methoden.
Wie würde ich Code-Duplizierung hier entfernen?
Auch eine 'statische Karte nextColorMap' könnte die mehrstöckige' if' Aussage mit einem einzigen 'updater.accept (nextColorMap.get (currentFill.get ersetzen ())); '. –
9000
Danke für die Antwort, das ist, was ich gesucht habe; obwohl ich mehr in die 'Consumer' Klasse schauen muss :) @ 9000 Danke für den Tipp. –
Statt "Consumer"/"Supplier" zu übergeben, können Sie einfach die Eigenschaft übergeben, da Sie damit den Wert festlegen und erhalten können ... – fabian