Wenn der Client auf das öffentliche Feld in Ihrer Frage zugreifen könnte, bevor ihm ein Wert zugewiesen wurde (d. H. Ohne den Konstruktor aufzurufen), liegt ein offensichtliches Problem vor. Insbesondere konnte dieses Feld keinen erwarteten/richtigen Wert haben, wenn ein Client versuchte, darauf zuzugreifen. Wie jedoch in den Kommentaren ausgeführt wurde, haben Sie Test.MY_INT
nicht mit einem static
Bezeichner deklariert, so dass es im Wesentlichen unmöglich ist, den Wert dieser Konstante abzurufen, ohne zuerst den Konstruktor aufzurufen.
Daher erscheint es (in Bezug auf die Unveränderlichkeit) sinnvoll zu tun, was Sie tun. In Bezug auf "guten Code" sind Sie jedoch (wie andere gesagt haben) gezwungen, sich selbst und Ihre Kunden ausdrücklich auf diesen Wert namentlich zu beziehen. Wenn Sie jedoch einen Getter verwenden und den Namen MY_INT
ändern müssen, während Sie den Zweck der Konstanten beibehalten, sind weder Sie noch Ihr Client gezwungen, etwas zu ändern, das über die Implementierung in Test
hinausgeht.
Um genauer zu sein, stelle ich Ihre Klasse mit einem Getter und privatisierten Konstante.
public class Test {
private final int MY_INT;
public Test(int myInt) {
MY_INT = myInt;
}
public int getAssignedIntValue() {
return MY_INT;
}
}
ich die zugewiesene ganzzahligen Wert wie so erhalten würde:
Test test = new Test(1);
// with your class
test.MY_INT;
// with the above class
test.getAssignedIntValue();
Nun, sage ich MY_INT
-myInt
anzupassen Namenskonventionen umbenennen. In beiden Fällen muss ich alle Vorkommen von MY_INT
in der Test
Klasse ändern. Aber der Unterschied zwischen den beiden Implementierungen wird deutlich, wenn ich den Wert mit dem neuen konstanten Namen bekommen muß:
// if this is the old code from above
Test test = new Test(1);
// I need to change this to test.myInt, or I get an ERROR!
test.MY_INT;
// since I didn't change the name of the getter, all is well
test.getAssignedIntValue();
Hinweis: Dies ist zwar eine akzeptable Antwort gewesen sein mag, ist es nicht unbedingt die am besten zutreffende Argumentation . Bitte beachten Sie this answer für Überlegungen in einem allgemeineren Kontext gegeben.
Sie haben keine Getter/Setter in Ihnen Code, nur Konstruktor, so dass Sie im Grunde erstellen unveränderlichen Objekt, das ist gut –
@pbabcdefp es ist endgültig –
Sorry. Temporäres Gehirnfrost. –