Wie kann ich einer existierenden Enum von außerhalb veränderte Werte zuweisen?

Drachenbauer

Aktives Mitglied
In Minecraft sind die 16 Basisfarben so in einem Enum angegeben:

Java:
    WHITE(0, "white", 16383998, MaterialColor.SNOW, 15790320, 16777215),
    ORANGE(1, "orange", 16351261, MaterialColor.ADOBE, 15435844, 16738335),
    MAGENTA(2, "magenta", 13061821, MaterialColor.MAGENTA, 12801229, 16711935),
    LIGHT_BLUE(3, "light_blue", 3847130, MaterialColor.LIGHT_BLUE, 6719955, 10141901),
    YELLOW(4, "yellow", 16701501, MaterialColor.YELLOW, 14602026, 16776960),
    LIME(5, "lime", 8439583, MaterialColor.LIME, 4312372, 12582656),
    PINK(6, "pink", 15961002, MaterialColor.PINK, 14188952, 16738740),
    GRAY(7, "gray", 4673362, MaterialColor.GRAY, 4408131, 8421504),
    LIGHT_GRAY(8, "light_gray", 10329495, MaterialColor.LIGHT_GRAY, 11250603, 13882323),
    CYAN(9, "cyan", 1481884, MaterialColor.CYAN, 2651799, 65535),
    PURPLE(10, "purple", 8991416, MaterialColor.PURPLE, 8073150, 10494192),
    BLUE(11, "blue", 3949738, MaterialColor.BLUE, 2437522, 255),
    BROWN(12, "brown", 8606770, MaterialColor.BROWN, 5320730, 9127187),
    GREEN(13, "green", 6192150, MaterialColor.GREEN, 3887386, 65280),
    RED(14, "red", 11546150, MaterialColor.RED, 11743532, 16711680),
    BLACK(15, "black", 1908001, MaterialColor.BLACK, 1973019, 0);

Gibt es einen Weg, dort von außerhalb (ohne eine kopie der Enum zu schreiben) diesen Feldern eigene Werte zuzuweisen?

Ich möchte diese Werte benutzen:
Java:
    WHITE(0, "white", 16777215, MaterialColor.SNOW, 16777215, 16777215),
    LIGHT_GRAY(1, "light_gray", 12566463, MaterialColor.LIGHT_GRAY, 12566463, 12566463),
    GRAY(2, "gray", 8355711, MaterialColor.GRAY, 8355711, 8355711),
    BLACK(3, "black", 4144959, MaterialColor.BLACK, 4144959, 4144959),
    RED(4, "red", 16711680, MaterialColor.RED, 16711680, 16711680),
    ORANGE(5, "orange", 16744192, MaterialColor.ADOBE, 16744192, 16744192),
    YELLOW(6, "yellow", 16776960, MaterialColor.YELLOW, 16776960, 16776960),
    LIME(7, "lime", 65280, MaterialColor.LIME, 65280, 65280),
    CYAN(8, "cyan", 65535, MaterialColor.CYAN, 65535, 65535),
    BLUE(91, "blue", 255, MaterialColor.BLUE, 255, 255),
    PURPLE(10, "purple", 10420479, MaterialColor.PURPLE, 10420479, 10420479),
    MAGENTA(11, "magenta", 16711935, MaterialColor.MAGENTA, 16711935, 16711935),
    PINK(12, "pink", 16756151, MaterialColor.PINK, 16756151, 16756151),
    LIGHT_BLUE(13, "light_blue", 32767, MaterialColor.LIGHT_BLUE, 32767, 32767),
    GREEN(14, "green", 48896, MaterialColor.GREEN, 48896, 48896),
    BROWN(15, "brown", 10452831, MaterialColor.BROWN, 10452831, 10452831);

Am besten währe es, wenn ich eine Methode in der Hauptklasse meiner Modifikation schreiben könnte, die den 16 feldern diese Werte zuweist und sie in diese Reihenfolge bringt.
 
Zuletzt bearbeitet:
Hier würde mich interessieren, was Du genau erreichen willst. Das klingt extrem "seltsam" und ist auf jeden Fall ein "dirty hack".

Generell geht es aber über Reflection, denn eine Enum ist auch nur eine spezielle Klasse. Also kann man sich die Klasse holen, da dann das Feld, für das es keinen Setter gibt um da dann den Zugriff zu erlauben und im Anschluss ein set aufzurufen.

Aber das ist etwas, das ich bei einem Code Review wohl jemandem massiv um die Ohren hauen würde. Enums sind halt eigentlich Konstanten und sollten keinen veränderbaren State haben. Und eine Veränderung von vorgegebenen Werten ist auf jeden Fall problematisch und kann auch negative Konsequenzen an anderer Stelle haben...

Eine kleine Enum für die Tests
Java:
public enum TestEnum {
    VALUE1(1),
    VALUE2(2);

    private int value;

    TestEnum(final int value) {
        this.value = value;
    }

    public int getValue() { return value; }
}

Und dazu eine kleine Applikation, die den Wert von VALUE1 verändert:
Java:
import java.lang.reflect.Field;

public class Test {
    public static void main(String[] args) throws Exception {
        System.out.println(TestEnum.VALUE1.getValue());

        Class clazz = TestEnum.class;
        Field f = clazz.getDeclaredField("value");
        f.setAccessible(true);
        f.set(TestEnum.VALUE1, 50);

        System.out.println(TestEnum.VALUE1.getValue());
    }
}
 
Das legt die Farben für gestimmte Objekte im Spiel fest.
Und diese Farben möchte ich gerne verändern.
Ich hätte da gerne Farbtöne, die etwas leuchtender sind.
Die großen zahlen da sind die Farbwerte.
Immer erst für diese Objekte, dann für Feuerwerk und dann für Text

Die Modifikation Optifine hat das auch irgendwie geschafft.
 
Also einen technischen Weg habe ich aufgezeigt. Wie es noch geht müsstest du sonst schauen - ich kenne diese Minecraft Erweiterungen nicht ....
 
Ich versuche gerade reflection, aber ich weiß nicht, wie ich da den ganzen inhalt von der Farbzeile in den Setter reinbekommen soll, ohne syntax-fehler zu erhalten?
 
Du willst doch nur einen Wert setzen. Also musst du schauen, in welchem Feld der abgelegt ist und dann nur dieses Feld neu setzen ...
 

Zurück
Oben