Add versionDependantCall, See #144 BauSystem #80
Keine Reviewer
Label
Kein Label
Bug
Codeverbesserung
Einsteiger Freundlich
Idee
In Arbeit
Neues Feature
Prio A
Security Breach
Überprüfung notwendig
Verbesserung
Zu Beobachten
Kein Meilenstein
Niemand zuständig
2 Beteiligte
Fällig am
Kein Fälligkeitsdatum gesetzt.
Abhängigkeiten
Keine Abhängigkeiten gesetzt.
Referenz: SteamWar/SpigotCore#80
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren
Keine Beschreibung angegeben.
Branch "VersionDependantCalls" löschen
Das Löschen eines Branches ist permanent. Obwohl der Branch für eine kurze Zeit weiter existieren könnte, kann diese Aktion in den meisten Fällen NICHT rückgängig gemacht werden. Fortfahren?
@ -51,3 +50,1 @@
} else {
BungeeReceiver_9.playpling(player);
}
Core.versionDependantCall(new VersionedRunnable(() -> BungeeReceiver_8.playPling(player), 8),
Das finde ich nicht so gut, dass du hier immer 2 (bzw. 4) Wegwerfobjekte erstellst. Der GC freut sich...
@ -85,0 +105,4 @@
}
}
public static void versionDependantCall(Runnable v8, Runnable v9, Runnable v10, Runnable v12, Runnable v14, Runnable v15) {
Ne, nicht auf Argumentanzahl aufbauen, welche Version aufgerufen werden soll, bitte entfernen.
@ -85,0 +106,4 @@
}
public static void versionDependantCall(Runnable v8, Runnable v9, Runnable v10, Runnable v12, Runnable v14, Runnable v15) {
switch (Core.getVersion()) {
Das ist nicht wirklich generalisiert...
@ -85,0 +160,4 @@
return versionedCallable1.call();
}
return versionedCallable2.call();
}
Das gefällt mir hier alles noch ganz und gar nicht, dass es hier X verschiedene varianten zum Aufruf gibt. Wenn, dann möchte ich Aufrufsvarianten mit z.B. VersionedRunnable... sehen, was dann für x verschiedene Versionen funktioniert, sonst haben wir bei verschiedensten Versionen die lustigsten Probleme.
Auch finde ich, dass das nicht in den Core gehört, sondern wenn in eine eigene Klasse (oder die passenden Funktionen einfach direkt jeweils in VersionedCallable und VersionedRunnable
@ -0,0 +20,4 @@
package de.steamwar.core;
@FunctionalInterface
public interface ExceptionlessCallable<T> {
Der Name ist absolut irreführend und die Klasse nicht notwendig, da es da garantiert schon ein passendes Interface aus vanilla java gibt.
Es gibt eine Callable, jedoch hat die das Problem, dass bei dem call() auch eine Exception geworfen werden kann, bzw so steht es an der Methoden Signatur, und deswegen habe ich dies gemacht.
Der Fehler soll nicht irgendwo verschluckt werden.
Da dieses Interface eigentlich nie außerhalb benötigt wird, kannst du das doch auch inlinen in VersionedCallable (und in VersionedRunnable dann eine entsprechende Parallelklasse aufmachen)
@ -0,0 +31,4 @@
public VersionedCallable(ExceptionlessCallable<T> exceptionlessCallable, int... versions) {
this.exceptionlessCallable = exceptionlessCallable;
for (int version : versions) this.versions.add(version);
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.
@ -21,6 +21,7 @@ package de.steamwar.sql;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import de.steamwar.core.Core;
import de.steamwar.core.VersionedCallable;
Bitte aktiviere mal in deine IDE, dass Unused Imports automatisch aufgeräumt werden.
Habe ich kriegt er aber manchmal selber nicht hin
Was hälst du jetzt davon, geht es mehr in die gewünschte Richtung?
@ -82,4 +82,5 @@ public class Core extends JavaPlugin{
private static void setInstance(Core instance) {
Core.instance = instance;
}
Echt tolle nötige Newline!
@ -0,0 +35,4 @@
return exceptionlessCallable.call();
}
public static <T> T versionDependantCall(VersionedCallable<T>... versionedCallables) {
Könnte man auch einfach in call umbenennen, weil es ist ja schon durch den Klassennamen klar, dass es versionsabhängig ist.
@ -0,0 +36,4 @@
}
public static <T> T versionDependantCall(VersionedCallable<T>... versionedCallables) {
int version = Core.getVersion();
Du musst die version nicht zwischenspeichern, Core.getVersion() ist kostenlos.
@ -0,0 +37,4 @@
public static <T> T versionDependantCall(VersionedCallable<T>... versionedCallables) {
int version = Core.getVersion();
for (int i = versionedCallables.length - 1; i >= 0; i--) {
Kann man nicht einfach einen reverse-iterator verwenden? Wäre wesentlich sauberer
Ich glaube nicht so ganz
Außerdem wäre ein Reverse-Iterator wieder ein Objekt mehr. Ich glaube die einfache Schleife reicht da.
@ -0,0 +39,4 @@
int version = Core.getVersion();
for (int i = versionedCallables.length - 1; i >= 0; i--) {
VersionedCallable<T> versionedCallable = versionedCallables[i];
if (version >= versionedCallable.minVersion || i == 0) {
Kein überprüfen auf i == 0 hier!
Wenn ich dies nicht mache, können NullPointerExceptions fliegen!
Bitte erstmal weiterlesen! Ja! Wenn hier nichts zutrifft, ist das ein Fehler!
Habe ich ja jetzt schon behoben!
@ -0,0 +43,4 @@
return versionedCallable.call();
}
}
return null;
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)
@ -0,0 +37,4 @@
public static void versionDependantCall(VersionedRunnable... versionedRunnables) {
int version = Core.getVersion();
for (int i = versionedRunnables.length - 1; i >= 0; i--) {
Siehe VersionedCallable.
Sollte nun wieder etwas näher an deine Vorstellung rankommen
Willst du es mergen oder wie soll ich das mir überlegen?