2016-04-15 17 views
-3

Ich habe einen Java Class Point. Um schnell auf den Punkt (0, 0) zugreifen zu können, stelle ich eine Konstante dafür zur Verfügung.Warum können Werte eines endgültigen Objekts geändert werden?

public class Point{ 
    //... 
    public static final Point NULLPOINT=new Point(0, 0); 
    //... 
} 

Doch diese Point.NULLPOINT.setX (x) noch funktioniert und ändert die NULLPOINT zu (x, 0). Gibt es einen Weg dies zu verhindern? Ich dachte, Final würde das verhindern, aber anscheinend habe ich seine Macht überschätzt.

+5

Sie ändern nicht die Objektreferenz, aber ihre internen Eigenschaften – MadProgrammer

+4

Das "final" -Tag bedeutet, dass die Variable NULLPOINT nicht so zurückgesetzt werden kann, dass sie auf einen anderen Punkt zeigt, nicht dass der Inhalt von NULLPOINT nicht geändert werden kann. – FredK

Antwort

2

final garantiert, dass sich die Referenz nicht ändert, d. H. Sie können kein weiteres Objekt Point der Referenz NULLPOINT zuweisen. Trotzdem können Sie den Objektzustand ändern. Wenn Sie sicherstellen müssen, dass NULLPOINT den Status nicht ändert, sollten Sie Point Klasse unveränderlich machen: Entfernen Sie zum Beispiel Setter.

+0

Ich denke, es wäre klarer, wenn Sie sagen, dass die "Referenz" endgültig ist, nicht den Inhalt bei dieser Referenz. –

0

Da alle Objektvariablen in Java Verweise auf Objekte sind, bedeutet NULLPOINT final, dass niemand ändern kann, auf welchen Punkt NULLPOINT sich bezieht. Die Klasse java.awt.Point ist änderbar, aber es gibt einige Dinge, die Sie tun können, um einen ähnlichen Effekt zu erzielen.

Zuerst können Sie die Werte NULL_X und NULL_Y deklarieren und die x- und y-Werte aller anderen Punkte mit denen vergleichen. Zweitens können Sie eine ImmutablePoint-Klasse mit allen Methoden implementieren, die Sie für NULLPOINT benötigen, die keine Setter haben. Drittens könnten Sie eine Nullpunkt() -Funktion schreiben, die einen neuen Punkt bei (0,0) zurückgibt.

Alle diese Optionen haben ihre Vor- und Nachteile in Bezug auf Leistung und Benutzerfreundlichkeit.

+0

Die ImmutablePoint-Lösung scheint in Ordnung zu sein, ist es da, um von Point aus reinzulassen und alle Setter zu deaktivieren, ohne sie zu überschreiben (eine Möglichkeit, sie vom Willen auszuschließen, wenn Sie wissen, was ich sagen will)? – user3284214

+0

Ich glaube, dass ein leeres Überschreiben der einzige Weg ist, dies zu tun, und das ist eine hässliche Lösung. Außerdem sind die x- und y-Felder von Point öffentlich, so dass sie auch ohne diese Methoden geändert werden könnten. – GaiusOctavian