Add versionDependantCall, See #144 BauSystem #80
@ -1,25 +0,0 @@
|
||||
/*
|
||||
This file is a part of the SteamWar software.
|
||||
|
||||
Copyright (C) 2020 SteamWar.de-Serverteam
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.core;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface ExceptionlessCallable<T> {
|
||||
T call();
|
||||
}
|
@ -21,25 +21,27 @@
|
||||
|
||||
package de.steamwar.core;
|
||||
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
public class VersionedCallable<T> {
|
||||
|
||||
private ExceptionlessCallable<T> exceptionlessCallable;
|
||||
private Callable<T> callable;
|
||||
private int minVersion;
|
||||
|
||||
public VersionedCallable(ExceptionlessCallable<T> exceptionlessCallable, int minVersion) {
|
||||
this.exceptionlessCallable = exceptionlessCallable;
|
||||
public VersionedCallable(Callable<T> callable, int minVersion) {
|
||||
this.callable = callable;
|
||||
this.minVersion = minVersion;
|
||||
}
|
||||
|
||||
|
||||
public T call() {
|
||||
return exceptionlessCallable.call();
|
||||
}
|
||||
|
||||
public static <T> T call(VersionedCallable<T>... versionedCallables) {
|
||||
for (int i = versionedCallables.length - 1; i >= 0; i--) {
|
||||
VersionedCallable<T> versionedCallable = versionedCallables[i];
|
||||
Lixfel
hat
Könnte man auch einfach in call umbenennen, weil es ist ja schon durch den Klassennamen klar, dass es versionsabhängig ist. Könnte man auch einfach in call umbenennen, weil es ist ja schon durch den Klassennamen klar, dass es versionsabhängig ist.
|
||||
if (Core.getVersion() >= versionedCallable.minVersion) {
|
||||
Lixfel
hat
Du musst die version nicht zwischenspeichern, Core.getVersion() ist kostenlos. Du musst die version nicht zwischenspeichern, Core.getVersion() ist kostenlos.
|
||||
return versionedCallable.call();
|
||||
try {
|
||||
Lixfel
hat
Kann man nicht einfach einen reverse-iterator verwenden? Wäre wesentlich sauberer Kann man nicht einfach einen reverse-iterator verwenden? Wäre wesentlich sauberer
YoyoNow
hat
Ich glaube nicht so ganz Ich glaube nicht so ganz
YoyoNow
hat
Außerdem wäre ein Reverse-Iterator wieder ein Objekt mehr. Ich glaube die einfache Schleife reicht da. Außerdem wäre ein Reverse-Iterator wieder ein Objekt mehr. Ich glaube die einfache Schleife reicht da.
|
||||
return versionedCallable.callable.call();
|
||||
} catch (Exception e) {
|
||||
Lixfel
hat
Kein überprüfen auf i == 0 hier! Kein überprüfen auf i == 0 hier!
YoyoNow
hat
Wenn ich dies nicht mache, können NullPointerExceptions fliegen! Wenn ich dies nicht mache, können NullPointerExceptions fliegen!
Lixfel
hat
Bitte erstmal weiterlesen! Ja! Wenn hier nichts zutrifft, ist das ein Fehler! Bitte erstmal weiterlesen! Ja! Wenn hier nichts zutrifft, ist das ein Fehler!
YoyoNow
hat
Habe ich ja jetzt schon behoben! Habe ich ja jetzt schon behoben!
|
||||
throw new RuntimeException("Could not run version dependant code", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
Lixfel
hat
Wird nie aufgerufen & gefällt mir nicht. Wenn diese Zeile erreicht wird, ist das ein Fehler und sollte auch entsprechend geworfen werden (als Programmierer, also Silent fehler, z.B. SecurityException) Wird nie aufgerufen & gefällt mir nicht. Wenn diese Zeile erreicht wird, ist das ein Fehler und sollte auch entsprechend geworfen werden (als Programmierer, also Silent fehler, z.B. SecurityException)
|
||||
throw new SecurityException();
|
||||
|
@ -31,15 +31,11 @@ public class VersionedRunnable {
|
||||
this.minVersion = minVersion;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
runnable.run();
|
||||
}
|
||||
|
||||
public static void call(VersionedRunnable... versionedRunnables) {
|
||||
for (int i = versionedRunnables.length - 1; i >= 0; i--) {
|
||||
VersionedRunnable versionedRunnable = versionedRunnables[i];
|
||||
if (Core.getVersion() >= versionedRunnable.minVersion) {
|
||||
versionedRunnable.run();
|
||||
versionedRunnable.runnable.run();
|
||||
return;
|
||||
}
|
||||
Lixfel
hat
Siehe VersionedCallable. Siehe VersionedCallable.
|
||||
}
|
||||
|
Besser wäre es, einfach die minimale (kleinste) Version, für die dieser Versionsabhängige Code zuständig ist, zu speichern. Dann müssen die Versionsabhängigen Schnipsel zwar immer in absteigender Reihenfolge kommen, aber meistens ist ja die höchste Version die meistbenötigste.
Dann ist auch bei X Werten immer klar, was aufgerufen werden muss.