Umgebungsvariable Objekte "gekoppelt"

@SupressWarnings()

Aktives Mitglied
Projektvorstellung: http://www.java-forum.org/thema/mein-eigenes-dorfbauspiel.173149/
Aktueller Stand des Projekts: komplette Überarbeitung aller Klassen hinsichtlich des Stils und der Funktionalität

Ich habe bei dem Versuch die eigentliche Dorf-"Hauptklasse" "Village" ( siehe aktuelle Version https://github.com/ToK-Gameteam/Time-of-Kings ) zu überarbeiten folgenden Fehler:

In der Methode:
Java:
  private Location checkLocation( Location location ){
     Location checkLocation = location;
     checkLocationOutOfField( checkLocation );
     boolean locationUnique = false;
     do{
       boolean locationChanged = false;
       for( int building = 0; building < 66; ++building ){
         if( buildings[building] != null){
           while( buildings[building].getLocation().equals(checkLocation) ){
             System.err.println("An dieser Stelle steht bereits ein Gebaeude.");
             System.out.println("Neue X-Koordinate (1 bis 40):");
             checkLocation.setLocationX(enterInt());
             System.out.println("Neue Y-Koordinate (1 bis 40):");
             checkLocation.setLocationY(enterInt());
             checkLocationOutOfField( checkLocation );
             locationChanged = true;
           }
         }
       }
       if( !locationChanged ){
         locationUnique = true;
       }   
     }while( !locationUnique );
     return checkLocation;
  }

Bei dieser Methode soll eine eingegebene Position mit denen verglichen werden, die bereits stehende Gebäude haben. Beim Laufen eines Testprogrammes, bei dem zuerst ein Sägewerk gebaut und anschließend bewegt wird, mit dem Debugger getestet (weil nicht funktioniert), ergab sich, das die Position des Sägewerks ebenfalls geändert hat, als die überprüfte Position geändert wurde. Als ersten Lösungsansatz habe ich versucht, die Position durch eine andere, in der Methode definierten zu ersetzen, weil die Position des Sägewerks ja direkt übergeben wird. Dies hat allerdings nicht geklappt. Hat jemand eine Idee woran diese Koppelung liegt?

Danke für jede Hilfe
@SupressWarnings
 

JCODA

Top Contributor
Die Zuweisung "Location checkLocation = location;" tut nicht das, was du denkst. Sie erzeugt eine neue Referenz auf das selbe Objekt.
Du musst intern eine neue Location erstellen, hierfür musst du irgendwo "new" benutzen. Manchmal bietet es sich an eine "copy()"-Methode bereitzustellen, diese gibt eine neue Instanz mit gleichen Werten zurück.
 

@SupressWarnings()

Aktives Mitglied
@JCODA vielen Dank für die schnelle Antwort, nach zwei Anpassungen funktioniert es jetzt.

Java:
  public Location(int locationX, int locationY){
     this.locationX = locationX;
     this.locationY = locationY;
   }

   public Location( Location location ){
     this.locationX = location.getLocationX();
     this.locationY = location.getLocationY();
   }
(zweiter Konstruktor)

Java:
  private Location checkLocation( Location location ){
     Location checkLocation = new Location( location );
     checkLocationOutOfField( checkLocation );
     boolean locationUnique = false;
     do{
       boolean locationChanged = false;
       for( int building = 0; building < 66; ++building ){
         if( buildings[building] != null){
           while( buildings[building].getLocation().equals(checkLocation) ){
             System.err.println("An dieser Stelle steht bereits ein Gebaeude.");
             System.out.println("Neue X-Koordinate (1 bis 40):");
             checkLocation.setLocationX(enterInt());
             System.out.println("Neue Y-Koordinate (1 bis 40):");
             checkLocation.setLocationY(enterInt());
             checkLocationOutOfField( checkLocation );
             locationChanged = true;
           }
         }
       }
       if( !locationChanged ){
         locationUnique = true;
       }
     }while( !locationUnique );
     return checkLocation;
   }
(veränderter Konstruktor)
 

JCODA

Top Contributor
Noch ein kleiner Tipp:
Wenn deine Gebäude eine geometrische Anordnung haben, könnte es Sinn ergeben, wenn du sie in einem zwei-dimmensionalen Array speicherst, dann kannst du viel leichert überprüfen, ob an der jeweiligen Stelle schon ein Gebäude steht. Falls du das Array eher als Liste haben möchtest, dann benutze Listen, das sind Ansammlungen, die erstmal keine fixierte Größe haben, und somit sich automatisch an die benötigte Größe anpassen, so kannst du z.B. die "null-Checks" vermeiden, die du zwischen den beiden Schleifen machst.
 

thecain

Top Contributor
Allgemeine Tipps:
von einem checkLocation würde ich ein boolean als Antwort erwarten.
Das ist dann auch viel besser Testbar und du musst kein neues Objekt erstellen. Wenn du dann noch das 2Dimensionale Array wie von @JCODA verwendest, kannst du den Code auf ein paar Zeilen reduzieren.
 

Bitfehler

Bekanntes Mitglied
Verständnisfrage:
Der Name deiner Methode checkLocationOutOfField deutet auf eine Prüfung hin, ob die Location außerhalb eines Rasters ist. Ich würde da eine Rückgabe in Form von true/false erwarten. Bei dir scheint es keine Rückgabe zu geben oder du verarbeitest diese nicht. Wenn die neue Position außerhalb des Feldes ist, kannst du evtl die Methode checkLocation abbrechen und brauchst du den Rest nicht mehr zu durchlaufen, da eine Position außerhalb wohl ungültig sein dürfte.
 

@SupressWarnings()

Aktives Mitglied
@JCODA
Das hatte ich auch schon überlegt, allerdings müsste ich dann ein Array erstellen, das zweidimensional ist UND das bereits bestehende Gebäude-Array benutzen, da ich z. B. die Methoden zum Bauen / Verbessern über einen String, der den Array-Index bestimmt, aufrufe und die Suche in dem zweidimensionalen Array ebenfalls wieder diese null-Abfragen dabeihätte. Da ich eine bestimmte Anzahl an Gebäuden habe, die eine feste Reihenfolge in dem Gebäude-Array haben, würde meiner Meinung nach eine Liste keinen Sinn ergeben.

@thecain & @Bitfehler
CheckLocation ist bisher eine Hilfsfunktion, später wird sie für die GUI passend umgebaut. Noch gibt sie die verbesserte Position zurück. Auch checkLocationOutOfField() verändert die Position wie checkLocation().

Danke an alle für die Tipps
@SupressWarnings()
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
schegga_B javax.crypto - Cipher Objekte - Sevice Provider matching? Allgemeine Java-Themen 1
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
L Objekte in Set nicht gefunden Allgemeine Java-Themen 13
Avalon Data Transfer Objekte aus Datenbank erstellen Allgemeine Java-Themen 8
G Objekte mit Strings Aufrufen Allgemeine Java-Themen 8
H Objekte speichern und laden Allgemeine Java-Themen 10
H Objekte speichern und laden Allgemeine Java-Themen 1
MiMa Referenz auf Objekte und deren Inhalte Allgemeine Java-Themen 12
W Objekte reproduzieren Allgemeine Java-Themen 2
W Objekte per Reflexion instanziieren Allgemeine Java-Themen 7
W Unittest - Objekte simulieren Allgemeine Java-Themen 7
T OOP Objekte mit Erweiterung Initialisieren Allgemeine Java-Themen 6
O Erste Schritte Objekte als Datenelemente Allgemeine Java-Themen 14
J Equals Mock Objekte Allgemeine Java-Themen 5
J Mockito - Objekte miteinander vergleichen (equals) Allgemeine Java-Themen 6
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
J Java Objekte = null, Garbagecollector Allgemeine Java-Themen 12
F Listen - Mehrere Objekte Allgemeine Java-Themen 1
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
F Objekte erzeugen Allgemeine Java-Themen 1
E Threads ThreadPoolExecutor remove mit callable Objekte Allgemeine Java-Themen 3
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
E OOP Objekte und Methoden Allgemeine Java-Themen 1
S Algorithmus um Objekte auf einer Flaeche mit gleichem Abstand anzuordnen..? Allgemeine Java-Themen 20
C Objekte in Array List speichern? Allgemeine Java-Themen 1
OnDemand Objekte speichern Allgemeine Java-Themen 8
B Objekte anhand von Properties file Allgemeine Java-Themen 41
U Tiefe Objekte schreiben Allgemeine Java-Themen 1
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
E 3D Objekte in 2D Bild finden Allgemeine Java-Themen 5
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
F FileOutput/Input Objekte Allgemeine Java-Themen 6
OnDemand Objekte serialisieren Allgemeine Java-Themen 3
J unterschiedliche Objekte, selbe getter und setter Allgemeine Java-Themen 15
L Lib gesucht: Java-Objekte mit JSON Allgemeine Java-Themen 2
U Set erklären dass objekte gleich sind Allgemeine Java-Themen 12
E Best Practice Verdammt große Objekte Allgemeine Java-Themen 10
B Mehrere Objekte verschlüsselt serialisieren Allgemeine Java-Themen 6
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
N Objekte an eine andere Applikation übergeben Allgemeine Java-Themen 3
N 2 Objekte zu einer Gruppe zusammenfügen Allgemeine Java-Themen 7
M Instanzierte Objekte in XML Dokument speichern Allgemeine Java-Themen 3
B Verschiedene Objekte in Abhängigkeit eines Typs instanziieren. Allgemeine Java-Themen 17
K Input/Output Im Programm instanzierte Objekte Speichern und laden Allgemeine Java-Themen 3
S OOP Objekte als Return-Werte: Einen Klon zurückgeben oder Instanz auf das Feld? Allgemeine Java-Themen 10
H Objekte Serialisiert speichern Allgemeine Java-Themen 10
L MouseListener für viele Objekte erstellen Allgemeine Java-Themen 16
5 Objekte Sortieren lassen Allgemeine Java-Themen 7
N Objekte aus Array Inhalt erzeugen Allgemeine Java-Themen 8
L Input/Output Textdatei in Objekte überführen? Allgemeine Java-Themen 4
R Input/Output Objekte speichern ohne überschreiben Allgemeine Java-Themen 7
A Collections HashMap.containsKey findet keine immutablen Objekte Allgemeine Java-Themen 3
H Threads Thread stirbt aber Objekte in ihm leben weiter?! Allgemeine Java-Themen 9
M Java Objekte in XML mit JAXB Allgemeine Java-Themen 9
C Strings und JSON Objekte so klein wie möglich im Speicher ablegen Allgemeine Java-Themen 5
H COM-Objekte/ AktiveX Objekte Allgemeine Java-Themen 4
C Script für Website mit Objekte Ausblenden Allgemeine Java-Themen 3
M Txt einlesen & Objekte erzeugen Allgemeine Java-Themen 2
X Objekte aus TableModel serialisieren und deserialisieren Allgemeine Java-Themen 4
T ObjectInputStream - Arrayliste, die unbekannte Objekte enthält Allgemeine Java-Themen 9
B class dateien "einlesen" und objekte erzeugen Allgemeine Java-Themen 6
D Grafische Objekte zeichnen Allgemeine Java-Themen 4
A Wie zur Laufzeit auf Objekte zugreifen Allgemeine Java-Themen 7
F Referenzen auf Objekte Allgemeine Java-Themen 5
H Eclipse und Objekte Allgemeine Java-Themen 6
S Objekte die Objekte enthalten: Keine Vererbung Allgemeine Java-Themen 4
E Objekte in einer Liste suchen. Allgemeine Java-Themen 4
I Über eine Liste iterieren und Objekte löschen. Wie löst man das sauber? Allgemeine Java-Themen 5
I Pattern zum Erweitern existierender Objekte Allgemeine Java-Themen 4
N Dynamische Objekte / DB Allgemeine Java-Themen 5
J Objekte binär speichern Allgemeine Java-Themen 10
TiME-SPLiNTER Unbekannte Anzahl serialisierter Objekte lesen Allgemeine Java-Themen 2
V Objekte in Kategorien einteilen. Allgemeine Java-Themen 6
M 3D Objekte mit einer Linie Verbinden Allgemeine Java-Themen 3
F Wie zur Laufzeit ganz neue Objekte erzeugen? Allgemeine Java-Themen 5
A Dummy-Objekte für Webgui erzeugen Allgemeine Java-Themen 12
W Objekte speichern mit JFileChooser Allgemeine Java-Themen 8
D befehl auf mehrere objekte anwenden Allgemeine Java-Themen 7
L Objekte in Liste packen Allgemeine Java-Themen 2
S XML in Objekte wandeln. Euer Rat? Allgemeine Java-Themen 12
G Objekte serialisieren Allgemeine Java-Themen 2
L Parameter-Objekte verändern oder nicht? Allgemeine Java-Themen 6
D Objekte nur unter bestimmten Voraussetzungen erzeugen Allgemeine Java-Themen 4
S Objekte mit Arrays Allgemeine Java-Themen 9
F Objekte oder besser ID in Listen speichern? Allgemeine Java-Themen 2
S erzeugte objekte zählen Allgemeine Java-Themen 3
U auf Objekte mit variablem Namen zugreifen Allgemeine Java-Themen 4
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
Landei Objekte ohne Konstruktoraufruf erzeugen Allgemeine Java-Themen 7
E tiefe Kopie nicht serialisierbarer Objekte Allgemeine Java-Themen 3
J Speicherbedarf und persistente Objekte Allgemeine Java-Themen 4
J ArrayList Objekte anhand Propertywerte filtern Allgemeine Java-Themen 3
R Moeglichst viele Datumsstrings in Date Objekte konvertieren? Allgemeine Java-Themen 3
J Eindeutige ID für Objekte als Keys in TreeMap Allgemeine Java-Themen 12
G Unveränderbare Objekte Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben