Wie kann ich die menge an code reduzieren?

Drachenbauer

Aktives Mitglied
Hallo
In dem Spiel für das ich gerade Dinge erstelle, werden neue Blöcke und Items registriert, indem ein Feld des typs RegistryObject geschrieben wird:

Java:
public static final RegistryObject<FlowerPotBlock> YELLOW_FLOWER_POT = BLOCKS.register("yellow_flower_pot", () -> new FlowerPotBlock(
                        null, AIR_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));

Dies fügt dem Spiel einen leeren, gelben Blumentopf als Block hinzu, der in der 3d-Welt aufgestellt wersen kann, und gibt ihm bestimmte Eigenschaften.
Das 3D-Modell kommt von einer extra-Datei.

Jetzt enthält meine Klasse einen Riesen-Haufen solcher Elemente, denn das Spiel benötigt für jede mögliche Kombination aus Blumentopf-Farbe (16 Farben) und Pflanzensorte (25 Pflanzen) und auch für die leeren Töpfe aller Farben einen solchen Block.

Gibt es da eine möglichkeit, das mit einem for-loop zu regeln?
Java:
ArrayList<String> colors = new ArrayList<String>(Arrays.asList(black, blue, brown, cyan, gray, green, light_blue, light_gray,
                                                               lime, magenta, orange, pink, purple, red, white, yellow));

for (String color : colors)
{
     //do stuff
}

Das würde die menge an code in der Klasse enorm reduzieren.
 

White_Fox

Top Contributor
Meinst du so etwas?

Java:
public class GameElement{

    String color;

    public GameElement(String color){
        this.color = color;
    }
}


public class FlowerPot extends GameElement{
    String plantKind;
    
    public FlowerPot(String plantKind, String color){
        super(color);
        this.plantKind = plantKind;
    }
}


public class Game{
    
    public static void main(Strg args[]){
        ArrayList<String> plantKinds = new ArrayList<>();
        ArrayList<String> colors = new ArrayList<>();
        
        //Fülle plantKinds und colors mit Werten...
        
        ArrayList<FlowerPot> flowers = new ArrayList<>();
        for(String color : colors){
            for(String plantKind : plantKinds){
                flowers.add(new FlowerPot(plantKind, color));
            }
        }
    }
}

Ansonsten läßt sich das bestimmt mit Streams und Lambdas machen, aber da weiß ich leider auch nicht wie.
 

Drachenbauer

Aktives Mitglied
Es muss ein RegistryObjekt erzeugen, genauso wie ich es im Startpost platziert habe.

Das ist für eine Minecraft mod und dort werden die Dinge so registriert.

Ich habe gehofft, einen weg zu fenden, dass da nur 25 anstelle von 400 davon einzeln stehen müssen.

Das hier registriert den leeren gelben Topf + alle Pflanzen in gelben töpfen.
Java:
    public static final RegistryObject<FlowerPotBlock> YELLOW_FLOWER_POT = BLOCKS.register("yellow_flower_pot", () -> new FlowerPotBlock(
                        null, AIR_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    private  static final Supplier<FlowerPotBlock> YELLOW_FLOWER_POT_SUPPLIER = () -> YELLOW_FLOWER_POT.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_ACACIA_SAPLING = BLOCKS.register("yellow_potted_acacia_sapling", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, ACACIA_SAPLING_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_ACACIA_SAPLING_SUPPLIER = () -> YELLOW_POTTED_ACACIA_SAPLING.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_ALLIUM = BLOCKS.register("yellow_potted_allium", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, ALLIUM_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_ALLIUM_SUPPLIER = () -> YELLOW_POTTED_ALLIUM.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_AZURE_BLUET = BLOCKS.register("yellow_potted_azure_bluet", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, AZURE_BLUET_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_AZURE_BLUET_SUPPLIER = () -> YELLOW_POTTED_AZURE_BLUET.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_BAMBOO = BLOCKS.register("yellow_potted_bamboo", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, BAMBOO_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_BAMBOO_SUPPLIER = () -> YELLOW_POTTED_BAMBOO.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_BIRCH_SAPLING = BLOCKS.register("yellow_potted_birch_sapling", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, BIRCH_SAPLING_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_BIRCH_SAPLING_SUPPLIER = () -> YELLOW_POTTED_BIRCH_SAPLING.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_BLUE_ORCHID = BLOCKS.register("yellow_potted_blue_orchid", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, BLUE_ORCHID_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_BLUE_ORCHID_SUPPLIER = () -> YELLOW_POTTED_BLUE_ORCHID.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_BROWN_MUSHROOM = BLOCKS.register("yellow_potted_brown_mushroom", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, BROWN_MUSHROOM_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_BROWN_MUSHROOM_SUPPLIER = () -> YELLOW_POTTED_BROWN_MUSHROOM.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_CACTUS = BLOCKS.register("yellow_potted_cactus", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, CACTUS_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_CACTUS_SUPPLIER = () -> YELLOW_POTTED_CACTUS.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_CORNFLOWER = BLOCKS.register("yellow_potted_cornflower", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, CORNFLOWER_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_CORNFLOWER_SUPPLIER = () -> YELLOW_POTTED_CORNFLOWER.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_DANDELION = BLOCKS.register("yellow_potted_dandelion", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, DANDELION_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_DANDELION_SUPPLIER = () -> YELLOW_POTTED_DANDELION.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_DARK_OAK_SAPLING = BLOCKS.register("yellow_potted_dark_oak_sapling", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, DARK_OAK_SAPLING_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_DARK_OAK_SAPLING_SUPPLIER = () -> YELLOW_POTTED_DARK_OAK_SAPLING.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_DEAD_BUSH = BLOCKS.register("yellow_potted_dead_bush", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, DEAD_BUSH_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_DEAD_BUSH_SUPPLIER = () -> YELLOW_POTTED_DEAD_BUSH.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_FERN = BLOCKS.register("yellow_potted_fern", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, FERN_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_FERN_SUPPLIER = () -> YELLOW_POTTED_FERN.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_JUNGLE_SAPLING = BLOCKS.register("yellow_potted_jungle_sapling", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, JUNGLE_SAPLING_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_JUNGLE_SAPLING_SUPPLIER = () -> YELLOW_POTTED_JUNGLE_SAPLING.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_LILY_OF_THE_VALLEY = BLOCKS.register("yellow_potted_lily_of_the_valley", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, LILY_OF_THE_VALLEY_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_LILY_OF_THE_VALLEY_SUPPLIER = () -> YELLOW_POTTED_LILY_OF_THE_VALLEY.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_OAK_SAPLING = BLOCKS.register("yellow_potted_oak_sapling", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, OAK_SAPLING_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_OAK_SAPLING_SUPPLIER = () -> YELLOW_POTTED_OAK_SAPLING.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_ORANGE_TULIP = BLOCKS.register("yellow_potted_orange_tulip", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, ORANGE_TULIP_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_ORANGE_TULIP_SUPPLIER = () -> YELLOW_POTTED_ORANGE_TULIP.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_OXEYE_DAISY = BLOCKS.register("yellow_potted_oxeye_daisy", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, OXEYE_DAISY_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_OXEYE_DAISY_SUPPLIER = () -> YELLOW_POTTED_OXEYE_DAISY.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_PINK_TULIP = BLOCKS.register("yellow_potted_pink_tulip", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, PINK_TULIP_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_PINK_TULIP_SUPPLIER = () -> YELLOW_POTTED_PINK_TULIP.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_POPPY = BLOCKS.register("yellow_potted_poppy", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, POPPY_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_POPPY_SUPPLIER = () -> YELLOW_POTTED_POPPY.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_RED_MUSHROOM = BLOCKS.register("yellow_potted_red_mushroom", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, RED_MUSHROOM_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_RED_MUSHROOM_SUPPLIER = () -> YELLOW_POTTED_RED_MUSHROOM.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_RED_TULIP = BLOCKS.register("yellow_potted_red_tulip", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, RED_TULIP_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_RED_TULIP_SUPPLIER = () -> YELLOW_POTTED_RED_TULIP.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_SPRUCE_SAPLING = BLOCKS.register("yellow_potted_spruce_sapling", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, SPRUCE_SAPLING_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_SPRUCE_SAPLING_SUPPLIER = () -> YELLOW_POTTED_SPRUCE_SAPLING.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_WHITE_TULIP = BLOCKS.register("yellow_potted_white_tulip", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, WHITE_TULIP_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_WHITE_TULIP_SUPPLIER = () -> YELLOW_POTTED_WHITE_TULIP.get();
    public static final RegistryObject<FlowerPotBlock> YELLOW_POTTED_WITHER_ROSE = BLOCKS.register("yellow_potted_wither_rose", () -> new FlowerPotBlock(
                        YELLOW_FLOWER_POT_SUPPLIER, WITHER_ROSE_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
    public static final Supplier<FlowerPotBlock> YELLOW_POTTED_WITHER_ROSE_SUPPLIER = () -> YELLOW_POTTED_WITHER_ROSE.get();

Ich dachte, ich könnte mit einem for-loop überall da, wo jetzt "YELLOW" oder "yellow" steht nacheinander die farben automatisch in der entsprechenden groß und kleinschreibung einsetzen lassen.
 
Zuletzt bearbeitet:

White_Fox

Top Contributor
Sag doch gleich daß es um MineCraft geht...ich dachte erst du baust selber ein Spiel. Von MiceCraft hab ich allerdings keine Ahnung, trotzdem ein Versuch: Kannst du nicht eine public static final ArrayList<RegistryObject<FlowerPotBlock>> flowerpots; anlegen?
Oder, wie ich finde etwas besser in der Handhabe, eine HashMap<Color, HashMap<Plant ,RegistryObject>> flowerpots;

Color und Plant würde ich als Enumeration anlegen. Dann könntest du recht einfach mit z.B. flowerpots.get(RED).get(MUSHROOM) auf ein Element zugreifen.
Aber über lauter einzelne Membervariablen kannst du nicht einfach iterieren, das ginge nur über Reflexion. Aber das ist auch nicht gerade einfacher.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich dachte, ich könnte mit einem for-loop überall da, wo jetzt "YELLOW" oder "yellow" steht nacheinander die farben automatisch in der entsprechenden groß und kleinschreibung einsetzen lassen.
Na, das geht natürlich nicht, aber @White_Fox's Vorschlag kannst du trotzdem aufgreifen.

Speicher die Daten, die zusammen gehören (wenn ich das richtig sehe Name und den Supplier für den Inhalt) in einer geeigneten Datenstruktur und lauf mit 'ner Schleife drüber.
 

Drachenbauer

Aktives Mitglied
Diese sachen stehen direkt in der Klasse, ohne konstruktor oder so.

Ich bin mir nicht sicher, ob es auch klappt, wenn ich die Inhalte erst in einem
Java:
static
{
    
}
hinzufüge
 

Drachenbauer

Aktives Mitglied
Ach ja die Supplier dienen dazu, den bepflanzten Töpfen mitzuteilen, zu welchem leeren topf sie gehören.
Dazu muss der supplier für den leeren Topf nach diesem selbst und vor den bepflanzten entstehen.
Diie bepflanzten bekommen ebenfals supplier, da später eine Methode vom leeren Topf für jeden bepflanzten aufgerufen wird, die deren supplier abspeichert und so auch die Verbinfung in entgegengesetzter Richtung schafft.

Das heißt, ich muss wohl die leeren Töpfe zuerst einzeln behandeln.
 

mrBrown

Super-Moderator
Mitarbeiter
Spricht ja nichts gegen (auch wenn Bidirektionale Beziehungen mit Suppliern dabei etwas merkwürdig klingt).
 

Drachenbauer

Aktives Mitglied
So funktioniert die im offizielen Spiel enthaltene FlowerPotBlock klasse eben.

Noch was:
Wenn ich in einer ArrayList den befehl "Arrays.asList()" benutze (in den klammern hinter "new ArrayList<>") und da dann etwas reinschreibe, mit Kommas zwischen den einzelnen Elementen, landen diese Elemente dann in dieser Reihenfolge in der ArrayList?
 

Drachenbauer

Aktives Mitglied
Anscheinend wird durch die verwendung des
Java:
static
{
    
}
irgendwas verzögert.
denn jetzt bekomme ich einen Fehler "RegistryObject not bresent".
 

Drachenbauer

Aktives Mitglied
Es scheint, alsob die registrierung in diesem Spiel nichts registrieren kann, was sich im
Java:
static
{
    
}
befindet.

Wie kann ich dann außerhalb davon mit diesen Loops arbeiten?
 

Drachenbauer

Aktives Mitglied
Hier ist mein Projekt:
https://github.com/Drachenbauer/ColoredFlowerPotsMod

Ich habe gerage gehört, dass man in diesem Spiel keine Sachen in einem static initialiser registrirt werden sollen, da das anscheinend probleme macht.
Gibt es eine Möglichkeit, den Teil mit den For-loops und so direkt da einzubauen, wo das Feld erzeugt wird?
Java:
public static final RegistryObject<FlowerPotBlock>[] EMPTY_FLOWER_POTS =
Irgendetwas, das ich hier hinter das "=" setzen kann, und wo ich dann den Inhalt von dem static initialiser reinpacken kann?

Ich habe gerade das hier gefunden:
1
2
String array[] = new String[] {
"Toyota", "Mercedes", "BMW", "Volkswagen", "Skoda" };
Das hat geschweifte Klammern.
Wieso bekomme ich dann einen Fehler im code angezeigt, wenn ich versuche, da einen for-loop reinzupacken?
 
Zuletzt bearbeitet:

temi

Top Contributor
Warum kannst du nicht etwas in dieser Art machen?

Java:
public final List<RegistryObject<FlowerPotBlock>> flowerPots = new ArrayList<>();

// befüllen der Liste, evtl. auch in einer Schleife
flowerPots.add(new BLOCKS.register("yellow_flower_pot", () -> new FlowerPotBlock(null, AIR_SUPPLIER,Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
 

Drachenbauer

Aktives Mitglied
1. Das Spiel verbietet mir, einen static initialiser zu benutzen.
2. Ich kann keine for-loops direkt in den Klassen-Body packen.
3. Wenn ich die for-loops in eine neue Methode packe, wüsste ich nicht, wo ich sie aufrufen soll.

Also bleibt nur, einen Weg zu finden, das direkt bei der Initialisierung des Arrays oder der Liste zu tun.
Irgendwer sagte, ich könnte das mit einer lambda expression regeln.
Aber ich finde einfach keine Anleitung für eine lambda expression, wo for-loops oder ähnliches reinpassen
 

mrBrown

Super-Moderator
Mitarbeiter
1. Das Spiel verbietet mir, einen static initialiser zu benutzen.
Dann verbietet es dir auch, statische Variablen zu nutzen - die werden nämlich immer im static initializer initialisiert.


Ich habe gerade das hier gefunden:
1
2String array[] = new String[] {
"Toyota", "Mercedes", "BMW", "Volkswagen", "Skoda" }; Das hat geschweifte Klammern.
Wieso bekomme ich dann einen Fehler im code angezeigt, wenn ich versuche, da einen for-loop reinzupacken?
Weil das geschweifte Klammern sind, mit denen ein Array initialisiert wird.


Irgendwer sagte, ich könnte das mit einer lambda expression regeln.
Nein, das ist Unsinn.



Ich habe absolut keine Ahnung von Minecraft, aber garantiert gibt es für das Plugin/den Mod selbst eine initialisierunge-Methode, in der du dann den nötigen Code ausführen kannst - ganz ohne static.
 

Drachenbauer

Aktives Mitglied
Ich kann Klassen-Felder mit dem Static modifyer erstellen.
aber das hier macht die probleme:
Java:
static
{

}

Gibt es denn keine Möglichkeit, die Liste oder das array ditekt beim initialisieren mit hilfe von for-loops zu füllen, ohne dafür etwas in eine extra methode oder so zu schreiben?

Das spiel registriert die Blöcke normalerweise so:
Java:
    public static final RegistryObject<FlowerPotBlock> YELLOW_FLOWER_POT = BLOCKS.register("yellow_flower_pot", () -> new FlowerPotBlock(
                        null, AIR_SUPPLIER, Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
direkt im Klassen-Body.
Es scheint die Blöcke nur registrieren zu können, wenn die Anweisung dafür direkt in einem solchen Klassen-Feld steht, aber nicht , wenn sie in dem static-ding steht.

Deshalb suche ich ja einen Weg, das direkt in einer enteprechenden Zeile für ein Arrey oder eine Liste zu regeln, die z.B. so beginnt:
Java:
public static final RegistryObject<FlowerPotBlock>[] EMPTY_FLOWER_POTS =
Dort irgendwie einen for-loop einzubauen, der für jedes Element der liste das ausführt, was im oberen Beispiel hinter dem "=" steht.
Ich habe eine Liste von Farben und eine Liste von Pflanzen, die angeben, wie oft fer loop ausgeführt wird und Informationen zum befüllen der enthaltenen Anweisung beisteuern.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich kann Klassen-Felder mit dem Static modifyer erstellen.
aber das hier macht die probleme:
Java:
static
{
 
}
static int i = 1; ist das selbe wie
Java:
static int i;
static
{
 i = 1;
}
Wenn letzteres nicht erlaubt ist, ist ersteres es auch nicht.

Gibt es denn keine Möglichkeit, die Liste oder das array ditekt beim initialisieren mit hilfe von for-loops zu füllen, ohne dafür etwas in eine extra methode oder so zu schreiben?
Nein, das geht nur mit einer Methode.



Wie gesagt: das Framework wird entsprechende Methode dafür bieten. In deinem Fall ginge mindestens den Konstruktor von ColoredFlowerPots, vielleicht auch setup in der Klasse.
 

Drachenbauer

Aktives Mitglied
Aus irgendeinem grund funktioniert es mit feldern, wie in meinem oberen Beispiel, aber nicht so:
Java:
private static final Supplier<Block> AIR_SUPPLIER = () -> Blocks.AIR;
 
    public static final ArrayList<String> COLORS = new ArrayList<String>(Arrays.asList("black",
                                                                                       "blue",
                                                                                       "brown",
                                                                                       "cyan",
                                                                                       "gray",
                                                                                       "green",
                                                                                       "light_blue",
                                                                                       "light_gray",
                                                                                       "lime",
                                                                                       "magenta",
                                                                                       "orange",
                                                                                       "pink",
                                                                                       "purple",
                                                                                       "red",
                                                                                       "white",
                                                                                       "yellow"));
 
    public static final ArrayList<Supplier<Block>> PLANT_SUPPLIERS = new ArrayList<Supplier<Block>>(Arrays.asList(() -> Blocks.ACACIA_SAPLING,
                                                                                                                  () -> Blocks.ALLIUM,
                                                                                                                  () -> Blocks.AZURE_BLUET,
                                                                                                                  () -> Blocks.BAMBOO,
                                                                                                                  () -> Blocks.BIRCH_SAPLING,
                                                                                                                  () -> Blocks.BLUE_ORCHID,
                                                                                                                  () -> Blocks.BROWN_MUSHROOM,
                                                                                                                  () -> Blocks.CACTUS,
                                                                                                                  () -> Blocks.CORNFLOWER,
                                                                                                                  () -> Blocks.DANDELION,
                                                                                                                  () -> Blocks.DARK_OAK_SAPLING,
                                                                                                                  () -> Blocks.DEAD_BUSH,
                                                                                                                  () -> Blocks.FERN,
                                                                                                                  () -> Blocks.JUNGLE_SAPLING,
                                                                                                                  () -> Blocks.LILY_OF_THE_VALLEY,
                                                                                                                  () -> Blocks.OAK_SAPLING,
                                                                                                                  () -> Blocks.ORANGE_TULIP,
                                                                                                                  () -> Blocks.OXEYE_DAISY,
                                                                                                                  () -> Blocks.PINK_TULIP,
                                                                                                                  () -> Blocks.POPPY,
                                                                                                                  () -> Blocks.RED_MUSHROOM,
                                                                                                                  () -> Blocks.RED_TULIP,
                                                                                                                  () -> Blocks.SPRUCE_SAPLING,
                                                                                                                  () -> Blocks.WHITE_TULIP,
                                                                                                                  () -> Blocks.WITHER_ROSE));
 
    public static final RegistryObject<FlowerPotBlock>[] EMPTY_FLOWER_POTS = new RegistryObject[COLORS.size() + 1];
    public static final RegistryObject<FlowerPotBlock>[] FULL_FLOWER_POTS = new RegistryObject[COLORS.size() * PLANT_SUPPLIERS.size() + 1];
 
    private static int i;
    private static int j;
 
    static
    {
        i = 0;
     
        for(String color : COLORS)
        {
            EMPTY_FLOWER_POTS[i] = BLOCKS.register(color + "_flower_pot", () -> new FlowerPotBlock(null, AIR_SUPPLIER,
                                   Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
         
            j = 0;
         
            for(Supplier<Block> plant_supplier : PLANT_SUPPLIERS)
            {
                String plant = plant_supplier.get().getRegistryName().getPath();
             
                FULL_FLOWER_POTS[j] = BLOCKS.register(color + "_potted_" + plant, () -> new FlowerPotBlock(EMPTY_FLOWER_POTS[i], plant_supplier,
                                      Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
             
                j++;
            }
         
            i++;
        }
    }

Dann bekomme ich Fehler, wo ich in anderen Klassen auf die Einträge der Liste zugreifen will.

Ich habe gerade festgestellt, dass das jetzt passiert, wenn auf die bepflanzten Töpfe zugegriffen werden soll, die im inneren for-loop stehen.
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Java:
Dann bekomme ich Fehler, wo ich in anderen Klassen auf die Einträge der Liste zugreifen will.
Was für Fehler?

du kannst natürlich bei der Zuweisung direkt eine Funktion schreiben, anstatt den static-Block zu nutzen. Aber wenn der statische Block nicht funktioniert, liegt der Fehler eher woanders.
 

Drachenbauer

Aktives Mitglied
z.b. hier:
Java:
    public static void renderCutoutPlantTextures()
    {
        for (RegistryObject<FlowerPotBlock> full_flower_pot : ColoredFlowerPotsBlocks.getFullPots())
        {
            if(! full_flower_pot.getId().getPath().contains("cactus"))
            {
                RenderTypeLookup.setRenderLayer(full_flower_pot.get(), RenderType.getCutout());
            }
        }
    }
Für die Zeile mit dem if bekomme ich eine java.lang.NullPointerException.
Da findet es anscheinend keine id-Bezeichnung, die es auf auf das Wort "cactus" überprüfen könnte.

Und dass es das problem nur mit den bepflanzten Töpfen gibt, habe ich hier gemerkt:
Code:
    public static void addPlantsToPots()
    {
        for (String color : ColoredFlowerPotsBlocks.COLORS)
        {
            for (RegistryObject<FlowerPotBlock> empty_pot : ColoredFlowerPotsBlocks.EMPTY_FLOWER_POTS)
            {
                if (empty_pot.getId().getPath().contains(color))
                {
                    for (RegistryObject<FlowerPotBlock> full_pot : ColoredFlowerPotsBlocks.getFullPots())
                    {
                        if(full_pot.getId().getPath().contains(color))
                        {
                            for (Supplier<Block> plant : ColoredFlowerPotsBlocks.PLANT_SUPPLIERS)
                            {
                                if(full_pot.getId().getPath().contains(plant.get().getRegistryName().getPath()))
                                {
                                     empty_pot.get().addPlant(plant.get().getRegistryName(), full_pot);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
An "if (empty_pot.getId().getPath().contains(color))", wo es um die leeren Töpfe geht, kommt es problemlos vorbei.
Aber bei " if(full_pot.getId().getPath().contains(color))" gibt es den fehler.
Auch als ich in der Zrile darüber direkt auf das Array verwiesen habe, anstatt den selbst geschriebenen getter zu benutzen (wie auch bei den leeren Töpfen zusehen).
 

Drachenbauer

Aktives Mitglied
Auch als ich in der Zrile darüber direkt auf das Array verwiesen habe, anstatt den selbst geschriebenen getter zu benutzen (wie auch bei den leeren Töpfen zusehen).
In dem stück text habe ich gerade einen Tippfehler gefunden (es sollte "Zeile" heißen).
Jetzt kann ich aber den Post nicht mehr bearbeiten...
Was mache ich jetzt?

Übrigens komischer weise kann ich woanders auf die id-Namen der bepflanzten Töpfe zugreifen.
Wieso dann nicht an diesen beiden Stellen?
 

Drachenbauer

Aktives Mitglied
Ich habe jetzt das hier versucht:
Java:
    public static final String[] COLORS = {"black",
                                           "blue",
                                           "brown",
                                           "cyan",
                                           "gray",
                                           "green",
                                           "light_blue",
                                           "light_gray",
                                           "lime",
                                           "magenta",
                                           "orange",
                                           "pink",
                                           "purple",
                                           "red",
                                           "white",
                                           "yellow"};
    
    @SuppressWarnings("rawtypes")
    public static final Supplier[] PLANT_SUPPLIERS = {() -> Blocks.ACACIA_SAPLING,
                                                      () -> Blocks.ALLIUM,
                                                      () -> Blocks.AZURE_BLUET,
                                                      () -> Blocks.BAMBOO,
                                                      () -> Blocks.BIRCH_SAPLING,
                                                      () -> Blocks.BLUE_ORCHID,
                                                      () -> Blocks.BROWN_MUSHROOM,
                                                      () -> Blocks.CACTUS,
                                                      () -> Blocks.CORNFLOWER,
                                                      () -> Blocks.DANDELION,
                                                      () -> Blocks.DARK_OAK_SAPLING,
                                                      () -> Blocks.DEAD_BUSH,
                                                      () -> Blocks.FERN,
                                                      () -> Blocks.JUNGLE_SAPLING,
                                                      () -> Blocks.LILY_OF_THE_VALLEY,
                                                      () -> Blocks.OAK_SAPLING,
                                                      () -> Blocks.ORANGE_TULIP,
                                                      () -> Blocks.OXEYE_DAISY,
                                                      () -> Blocks.PINK_TULIP,
                                                      () -> Blocks.POPPY,
                                                      () -> Blocks.RED_MUSHROOM,
                                                      () -> Blocks.RED_TULIP,
                                                      () -> Blocks.SPRUCE_SAPLING,
                                                      () -> Blocks.WHITE_TULIP,
                                                      () -> Blocks.WITHER_ROSE};
    
    public static final RegistryObject<FlowerPotBlock>[] EMPTY_FLOWER_POTS = new RegistryObject[COLORS.length];
    public static final RegistryObject<FlowerPotBlock>[] FULL_FLOWER_POTS = new RegistryObject[COLORS.length * PLANT_SUPPLIERS.length];
    
    private static int i = 0;
    private static int j = 0;
    
    static
    {
        for(String color : COLORS)
        {
            EMPTY_FLOWER_POTS[i] = BLOCKS.register(color + "_flower_pot", () -> new FlowerPotBlock(null, AIR_SUPPLIER,
                                   Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
            
            for(Supplier<Block> plant_supplier : PLANT_SUPPLIERS)
            {
                String plant = plant_supplier.get().getRegistryName().getPath();
                
                FULL_FLOWER_POTS[j] = BLOCKS.register(color + "_potted_" + plant, () -> new FlowerPotBlock(EMPTY_FLOWER_POTS[i], plant_supplier,
                                      Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0f).notSolid()));
                
                j++;
            }
            
            i++;
        }
    }
Aber jetzt bekomme ich
java.lang.ArrayIndexOutOfBoundsException: 16
in der Zeile, wo das Array der vollen Töpfe einen Eintrag erhält.

Wie kommt denn das?

Das Array der leeren Töpfe müste eine Länge von 16 haben, da Länge von dem String-Array mit den Farben übernommen.
Das Array der vollen Töpfe müsste eine Länge von 400 haben, da ich hier die Länge der beiden vorgefertigten Arrays multipliziere (16 Farben x 25 Pflanzen).
Und die Zahlen i und j werden immer nur dann um 1 erhöht, wenn bereits ein Eintrag zum Array hinzugefügt wurde.
Also, wenn i den Wert 16 erreicht, wird anschließend nichts mehr getan, da dann alle Farb-Namen abgearbeitet sind..
 

Drachenbauer

Aktives Mitglied
Die 16 ist nicht die Zeile, sondern der gefundene Wert, der zu anscheinend groß für ein Array ist.
Ich habe schon gesagt, dass es die Zeile im code ist, wo das Array der vollen Töpfe einen Eintrag bekommt.
 

Drachenbauer

Aktives Mitglied
Ich habe es gerade mal mit konsolen outputs laufen gelassen und festgestellt, dass der Fehler kommt, nachdem alle Inhalte erstellt sind, die in die Arrays sollen.

Ich wundere mich, was es dann noch versucht...
 

Drachenbauer

Aktives Mitglied
Ich habe die Integer Werte jetzt beim vergrößern in einem if-Block verpackt, der verhindert, dass die Werte nach dem letzten Durchlauf zum Schluss nochmal steigen.
Java:
if (i < COLORS.length - 1)
{
    i++;
}
Jetzt klappt es.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
T Menge an Elementen aus einer LinkedList Allgemeine Java-Themen 6
L Menge der Buchstaben eines Textes zählen Allgemeine Java-Themen 3
J Die Menge einer Zahl im Binärbaum zählen Allgemeine Java-Themen 7
X Vector in Intervall-Menge umwandeln Allgemeine Java-Themen 4
J Konstrukt um alle Paare und Tripel einer Punkte-Menge bilden Allgemeine Java-Themen 12
Ark Visualisierung der Julia-Menge / Fraktale Allgemeine Java-Themen 2
D Mittelwert einer Menge von Doubles berechnen Allgemeine Java-Themen 3
R Menge an Bytes eines OutputStreams ermitteln. Allgemeine Java-Themen 6
J Unbestimmte Menge Objekte erstellen und "verwalten&quot Allgemeine Java-Themen 5
M Unsicher, ob das Code richtig ist Allgemeine Java-Themen 4
MarvinsDepression Unbekanntes Zeichen in fremden Code wirft Fragen auf Allgemeine Java-Themen 4
schemil053 Methoden Code-Verbesserung Allgemeine Java-Themen 2
D Webarchive (war): Code verschleiern Allgemeine Java-Themen 7
D Compiler-Fehler child process exited with code 1 Allgemeine Java-Themen 1
Queenman Interface Mein Microsoft Visual Studio Code zeigt komische Dinge & Menüs an Allgemeine Java-Themen 9
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
berserkerdq2 Versteht jemand, was diese beiden Zahlen bei dem IJVM Code zu bedeuten haben? Allgemeine Java-Themen 10
OnDemand Releaseversion Tag in Code Allgemeine Java-Themen 5
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
F Code auslagern Allgemeine Java-Themen 5
D VBA Code mit Java ausführen möglich? Allgemeine Java-Themen 10
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
JordenJost Unverständlicher Java code? Allgemeine Java-Themen 21
V Hilfe mit Java Code Allgemeine Java-Themen 4
S Processing Java Code verstehen Allgemeine Java-Themen 4
A code wird nicht ausgeführt Allgemeine Java-Themen 3
B Bitte um Code Erklärung Allgemeine Java-Themen 5
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
N Regulären Ausdruck in normalen Java-Code umwandeln Allgemeine Java-Themen 12
OnDemand Clean Code oder Allgemeine Java-Themen 5
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
J Simple Date Format Alternativen bitte um Code Allgemeine Java-Themen 14
AGW in Java-Code plötzlich ein paar Wörter in Rot Allgemeine Java-Themen 2
L Best Practice Auslagerung von Code = Performance Optimierung? Allgemeine Java-Themen 4
H Precompilierten code ansehen Allgemeine Java-Themen 3
R Wo müsste ich im Code eine Änderung vornehmen? Allgemeine Java-Themen 6
L Ausgabe von in Echtzeit ausgeführten Code Allgemeine Java-Themen 9
Thallius Warum ist dieser Code OS abhängig? Allgemeine Java-Themen 10
S Code Erklärung Allgemeine Java-Themen 21
B Pausem im Code Allgemeine Java-Themen 2
T Java-Quiz Code Fehler Allgemeine Java-Themen 10
L Eclipse Java Code ausführen Allgemeine Java-Themen 18
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
F Code in Klassen bringen Allgemeine Java-Themen 4
S Gibt es eigentlich Java Source Code Interpreter..? Allgemeine Java-Themen 13
J JUnit - Auslassen von Code Allgemeine Java-Themen 25
F Klassen Spaghetti Code Vermeidung Allgemeine Java-Themen 16
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
J Code Page characters darstellen Allgemeine Java-Themen 12
J wie sollte man sinnvoll seinen Code aufteilen Allgemeine Java-Themen 6
I Python Code in Java Code Allgemeine Java-Themen 9
M Java (GUI) Code verdoppeln oder anzeige mehrmals anzeigen? Allgemeine Java-Themen 8
N Wie öffne ich einen runtergeladadenen Code in IntelliJ Allgemeine Java-Themen 3
R Fehler im Code Allgemeine Java-Themen 1
R Fehler im Code Allgemeine Java-Themen 3
O Standard library nativer C code Allgemeine Java-Themen 1
R Wo ist mein Fehler in diesem Code Allgemeine Java-Themen 7
S Java Editor Bekomme bei der Code-Vervollständigung die Zeichen &#8203; Allgemeine Java-Themen 3
N Morse Code decoder Allgemeine Java-Themen 9
O Erste Schritte Benzinverbrauch Code Hilfe Allgemeine Java-Themen 3
S Eclipse exit code 805306369 Allgemeine Java-Themen 1
Pataraca Vererbung Code einbinden Allgemeine Java-Themen 3
Developer_X Website HTML Code von HTTPS URL laden Allgemeine Java-Themen 0
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
S Code 'innerhalb' des synchronen Bereichs einer BlockingQueue ausfuehren..? Allgemeine Java-Themen 7
F Verständlichkeitsproblem bei Java Code?! Allgemeine Java-Themen 2
G Eclipse Eclipse: Unreachable code Allgemeine Java-Themen 16
P Java Android Code in IOS compilieren? Allgemeine Java-Themen 9
C Code vereinfachen Allgemeine Java-Themen 2
T Hilfe bei Code Allgemeine Java-Themen 3
R Java-Code für folgene Aufgabe? Allgemeine Java-Themen 8
Prafy Best Practice Code Refaktorisierung Allgemeine Java-Themen 7
WetWer Was bedeutet/macht ein Exit-Code Allgemeine Java-Themen 1
D Code für bereitgestellte Methoden Allgemeine Java-Themen 1
perlenfischer1984 HTML Code decodieren Allgemeine Java-Themen 2
C ASCII-Code in Java Allgemeine Java-Themen 1
J Java-Code in DLL packen Allgemeine Java-Themen 5
J LWJGL 3 Error Code 1282 Allgemeine Java-Themen 4
0 Code startet nicht (Keine Warnung/Fehlermeldung) Allgemeine Java-Themen 4
A Frage zu meinem Code Allgemeine Java-Themen 2
B Code generierung Velocity Templates Telosys Allgemeine Java-Themen 1
E Fehlermeldung vor dem Programm code Allgemeine Java-Themen 1
B JAVA - mehrere Clienten gleichzeitig starten. Nicht bei Code! Allgemeine Java-Themen 3
Fischkralle Ausführen von fremden Code Allgemeine Java-Themen 14
wolfgang63 Code snipped Software Allgemeine Java-Themen 1
L Eclipse Editieren des Code templates für Override methods Allgemeine Java-Themen 2
J Java code "plugin" fähig machen Allgemeine Java-Themen 4
alderwaran .jar Code Signing, User-Keystore und Fragen dazu Allgemeine Java-Themen 0
Thallius Wie verstecke ich meinen private Key am besten im Code? Allgemeine Java-Themen 10
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
B NullPointerException - Aber kein Fehler im Code Allgemeine Java-Themen 4
N HTTP response code: 403 Allgemeine Java-Themen 3
D Code bitte mit 19 stelligen Zahlen kompatibel machen Allgemeine Java-Themen 5
D Java Compiler code referencen Allgemeine Java-Themen 0
B Fehler im Java-Code Allgemeine Java-Themen 4
A PHP-Code zu Java-Code Allgemeine Java-Themen 5
M Code läuft unter windows aber nicht unter Linux Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben