Sellable Menu Kit-Feld ändert sich, wenn zwei oder mehr Referenzen der Klasse erstellt werden (mit GitHub)

9

Ich habe in letzter Zeit einen seltsamen Bug in meinem Spigot / Bukkit-Plugin erlebt, was völlig sinnlos ist. Bitte beachten Sie, dass diese Frage aufgrund der Tatsache, dass das Projekt, an dem ich gerade arbeite, ziemlich umfangreich ist, und da der Quellcode Klassen enthält, die hier nicht enthalten sind, werde ich mein Bestes geben, um mein Problem zu beschreiben / p>

In Minecraft können Sie mithilfe der Bukkit-API grafische Menüs (GUI) erstellen, in denen Sie Elemente in bestimmten Slots platzieren können. Wenn Sie darauf klicken, können Sie Ihre Funktionalität anpassen.

In meinem Fall habe ich die Basisklasse Menu erstellt, die grundlegende Methoden für die Erstellung eines solchen Menüs enthält. Dann wird das PurchaseMenu , das die Menu-Klasse erweitert, verwendet, um Funktionen an bestimmten Positionen auszulösen, um eine Transaktion für ein Produkt zu simulieren, die aus dem Menü angeklickt werden kann.

Im Detail enthält das Menü, das ich enthalten werde, "Kit" -Anzeigen (wie Spielklassen), wenn ein Linksklick das Display ist, das der Spieler kaufen kann, oder wenn er bereits gekauft wurde, Der Spieler wird nur dieses Kit zur Verwendung auswählen. Wenn ein Rechtsklick auf dem Display angezeigt wird, kann der Spieler das Set um bis zu 3 erhöhen.

In beiden Fällen muss ein Transaktionsmenü aufgerufen werden, um das angeklickte Kit zu kaufen oder aufzurüsten. Mein Entwurf ist wirklich geradlinig, indem ich das angeklickte Kit aus dem Konstruktor für jede PurchaseMenu -Klasse übergebe.

Das Problem bei all dem oben ist, dass das Kit korrekt vom Konstruktor übergeben wird, aber das Kit, das gerade gekauft oder auf den neuesten Stand gebracht wird, ist ein zufälliges (offensichtlich nicht, aber hat noch keine Beweise gefunden) und das passiert normalerweise nach einigen Versuchen.

Mein Design:

  • Jede Menu-Klasse enthält zwei Methoden. InventoryClick wird aufgerufen, wenn auf eine Menüanzeige geklickt (interagiert) wird. InventoryConstruct wird aufgerufen, wenn ein Menü erstellt (geöffnet) wird.
  • Die Purchase Menu-Klasse enthält auch zwei Methoden. PurchaseProduct wird aufgerufen, wenn eine Anzeige erfolgreich gekauft wurde. PrePaymentChecks ist notwendig checks die vor dem Kauf ausgeführt werden müssen.

Meine Fragen:

  • Wie packe ich dieses Problem und speichere das richtige Kit in einem privaten Feld der Klasse?
  • Wie kann ich mein Design (Ansatz) in bestimmten Projekten verbessern, um solche Probleme zu vermeiden?

Jede Form von Hilfe ist willkommen, ich hoffe, ich habe mein Problem im Detail beschrieben, wenn Sie weiteren Quellcode benötigen, schreiben Sie bitte einen Kommentar unten.

Aktualisieren

Da die Frage mehr als 30k Zeichen umfasst, habe ich das gesamte Projekt in ein Git-Repository hochgeladen.

Ссылка

Menu.java : Ссылка

PurchaseMenu.java : Ссылка

BattleOptionsMenu.java : Ссылка

PurchaseMenuKit.java : Ссылка

    
Biskotaki 27.03.2015, 22:01
quelle

1 Antwort

2

Versuchen Sie PurchaseMenu.object zu final zu ändern und sehen Sie, was die Ausgabe ist. Auch System.out.println() ist dein Freund.

Ich schlage nicht vor, dass Sie Object für Ihr Kit verwenden, da es möglicherweise das Objekt ändert, wenn Sie object auf sellableKit setzen. Machen Sie eine Schnittstelle mit dem Namen Sellable<T> , so dass Sie den Typ (genannt Strong Typing) mit:

erzwingen können %Vor%

Diese Felder auch als endgültig festzulegen, ist eine gute Übung, da es nicht so aussieht, dass Sie diese Felder nach der Objekterstellung festlegen und jemand sofort wissen lässt, dass sich diese Objekte niemals ändern werden. Es sollte auch die Situation aufklären, da ein endgültiges Objekt nicht geändert werden kann.

Sie sollten das private Kit kit; -Feld von BuyKitOwnershipMenu entfernen, da Sie gerade eine Kopie des Objekts erstellt haben. Ihre PurchaseProduct() -Methode kann in

geändert werden %Vor%

Seit Kit ist jetzt geschützt und in der Superklasse.

    
Link TheProgrammer 04.04.2015 13:58
quelle

Tags und Links