Vergleichen von 2 Objekten

Hallo.
ich möchte gerne 2 Objekte auf deren Inhalt überprüfen, ob sie
gleich sind oder nicht. Es handelt sich um Objekte, die als Obj.Var File,Properties und ein Stringobjekt beinhalten.
Ich habe schon angefangen, die .equals-Methode zu überschreiben, jedoch weiss ich nun nicht, welche die Eleganteste Art wäre, den Inhalt zu vergleichen.

Da ich diesen Vergleich mache, um herauszustellen, ob ich das Objekt mit dem geprüften Inhalt in eine Datei schreiben kann oder nicht, gibt es auch vielleicht ein Pattern dazu? Letztlich geht es darum eine Datei zu überschreiben und dabei feststellen, ob sie sich bereits (bzw. das Obj., das diese Datei repräsentiert) geändert hat oder nicht.

Danke und Gruss,
Fabian

Moin

ich möchte gerne 2 Objekte auf deren Inhalt überprüfen, ob sie
gleich sind oder nicht.

Es gibt die equals-Gleichheit und die ==-Gleichheit. Um welche gehts ?

Ich habe schon angefangen, die .equals-Methode zu
überschreiben, jedoch weiss ich nun nicht, welche die
Eleganteste Art wäre, den Inhalt zu vergleichen.

public boolean equals(Object O){
 try {
 if (O instanceof DIESE\_KLASSE){
 DIESE\_KLASSE O2 = (DIESE\_KLASSE) O;
 if (file.equals (O2.file)){
 if (string.equals (O2.string)){
 ....
 return true;
 }
 }
 }
 return false;
 }catch (Exception E){
 return false;
 }
}

Hallo Pumpkin,
danke für Deine Antwort auf meine Frage.
Ich versuche folgendes zu implementieren:
Ich lese den Inhalt 1000er Dateien in meine Objekte ein.
Meine Klasse (und somit die Instanzen dieser Klasse - also meine Objekte),
die diese „Dateien“ repräsentieren soll besteht aus einem File, Properties und String Variable:

public class MyFile
{
 Properties p;
 File f;
 String Id;

 ...
 }

Nun kann ich direkt über meine Objekte aus dem Speicher browsen ohne
Dateizugriffe zu haben.
Nun, wenn ich ein Objekt manipuliere und in die Datei zurückschreiben
möchte, will ich prüfen, ob die Datei sich in der zwischenzeit (viell. von einem anderen
User) geändert hat oder nicht. Somit lese ich meine „aktuelle“ Datei in ein temporäres
Objekt „MyFile“ ein und möchte nun dieses Objekt mit dem existierenden Objekt aus meinem
Speicher inhaltlich auf Gleichheit prüfen. Der Pseudocode würde in etwa so aussehen

[...]
MyFile tmpFile = load(File);
If (MyObjekt.equals(tmpFile)) then writeIntoFile(MyObjekt) // hier geht es um inhaltliche Gleichheit. das bedeutet ist der Inhalt MyObjekt.p == der Inhalt tmpFile.p? usw.
else ( System.out.println("Datei wurde verändert. Bitte Datei neu laden und dann die Änderungen vornehmen"):wink:

Ich hoffe, ich konnte damit mein Problem etwas genauer definieren.
Danke und Gruss,
Fabian

Hallo Fabian,

File und String überschreiben equals() und Properties erbt equals von Hashtable. Daher ist es einfach für deine Klasse eine equals() Methode zu implementieren.

Mehr zu equals:
http://www.geocities.com/technofundo/tech/java/equal…

Mein Vorschlag

public boolean equals(Object obj)
{
 if (obj == null)
 {
 return false;
 }

 if (this == obj)
 {
 return true;
 }

 if (obj instanceof MyObject)
 {
 MyObject mo = (MyObject)obj;
 if (this.file.equals(obj.file)
 && this.properties.equals(obj.properties)
 && this.id.equals(obj.id))
 {
 return true;
 }
 }
 return false;
}

Gruss, Simon

Moin

Ich versuche folgendes zu implementieren:
Ich lese den Inhalt 1000er Dateien in meine Objekte ein.

ähmm… Wieviel Speicher verbraucht das und viel lange dauert das einlesen… ? Aber nagut, das ist ein anderes Problem.

Nun, wenn ich ein Objekt manipuliere und in die Datei
zurückschreiben
möchte, will ich prüfen, ob die Datei sich in der zwischenzeit
(viell. von einem anderen
User) geändert hat oder nicht.

Du bekommst ein Locking-Problem. Wenn der andere User auch gerade am Testen ist ob er zurückschreiben soll oder nicht, kann dabei alles mögliche rauskommen. Jenachdem unter welchem OS das ganze läuft kann u.U.

java.nio.FileChannel.lock()

helfen, muss aber nicht.

Somit lese ich meine „aktuelle“
Datei in ein temporäres
Objekt „MyFile“ ein und möchte nun dieses Objekt mit dem
existierenden Objekt aus meinem
Speicher inhaltlich auf Gleichheit prüfen.

D.h. die Properties sollen „gleich“ sein. Kein Problem:

public void equals (Object O){
  try {
    if (!((MyFile)O).Id.equals(id)){
     return false;
    }
    Properties orginal = p;
    Properties copy = ((MyFile)O).p;
    if (orginal.size() == copy.size()){
      Enumeration E = orginal.keys();
      while (E.hasMoreElements()){
        Object key = E.nextElement();
        Object O = orginal.get(key);
        Object O2 = copy.get(key);
        if (!O.equals(O2)){
          return false;
        }
      }
      return true;
    } else {
      return false;
    }
  } catch (Exception E){
    retrun false;
  }
}

An sich kann auch Properties.equals helfen:

Compares the specified object with this map for equality. Returns true if the given object is also a map and the two Maps represent the same mappings. More formally, two maps t1 and t2 represent the same mappings if t1.entrySet().equals(t2.entrySet()). This ensures that the equals method works properly across different implementations of the Map interface.

Allerdings bin ich mir da nicht ganz sicher.

hier geht es um inhaltliche Gleichheit. das bedeutet ist der
Inhalt MyObjekt.p == der Inhalt tmpFile.p? usw.

„falsch“. Inhaltliche Gleichheit wird unter java immer mit .equals() bestimmt. Wenn du da irgendwo „==“ schreibst wird das nix.

else ( System.out.println(„Datei wurde verändert. Bitte Datei
neu laden und dann die Änderungen vornehmen“):wink:

Wozu ? Du kanns dir ja merken was vom User geändert wurde und dann selektiv nur die Daten überschrieben.

cu

An sich kann auch Properties.equals helfen:
Allerdings bin ich mir da nicht ganz sicher.

Doch das funktioniert wunderbar!

„falsch“. Inhaltliche Gleichheit wird unter java immer mit
.equals() bestimmt. Wenn du da irgendwo „==“ schreibst wird
das nix.

Doch bei primitiven Datentypen!
== vergleicht bei Objekten die Referenz. Daher ist ein Objekt == wenn es dieselbe Referenz auf das selbe Objekt ist.
Dies sollte bei der equals()-Methode immer geprüft werden.

Gruss, Simon

Hallo Fabian,

ein alternativer Ansatz: Versionszähler.
Du stattest deine Objekte bzw. Dateien mit einem Ganzzahl-Attribut aus, das bei jedem Schreibvorgang hochgezählt wird. Beim Lesen merkst du dir den aktuellen Zählerstand, vor dem Zurückschreiben musst du dann nur noch prüfen, ob der gemerkte und der aktuelle Zählerstand identisch sind.

Servus
Tom