Die String-Klasse bietet keine Methode zum Ändern des Inhalts eines Strings. Der Inhalt der Zeichenfolge, die von der Zeichenfolgeninstanz dargestellt wird, ändert sich nie. Aus diesem Grund müssen die Methoden der String-Klasse nicht synchronisiert werden. ** Unveränderlich ** bedeutet "unveränderlich" oder "unverändert". Im unveränderlichen Muster wird eine Klasse (** unveränderliche Klasse **) angezeigt, die garantiert, dass sich der Status der Instanz nicht ändert. Da keine ausschließliche Kontrolle erforderlich ist, kann bei guter Verwendung eine Leistungsverbesserung erwartet werden.
(Den gesamten Code finden Sie in diesem Handbuch.)
public final class Person {
private final String name;
private final String hobby;
public Person(String name, String hobby) {
this.name = name;
this.hobby = hobby;
}
public String getName() {
return name;
}
public String getHobby() {
return hobby;
}
}
In dieser Klasse kann der Wert des Feldes der Person-Klasse nur im Konstruktor festgelegt werden. Es gibt auch keine Methode, um den Wert des Feldes zu ändern. Sobald eine Instanz der Person-Klasse erstellt wurde, ändert sich der Wert des Felds daher nicht. Zu diesem Zeitpunkt ist die Person-Klasse auch dann sicher, wenn von mehreren Threads gleichzeitig auf sie zugegriffen wird. Keine der Methoden muss synchronisiert werden.
** Unveränderliche Rolle ** erscheint. Die Rolle "Unveränderlich" ist eine Klasse, die den Wert eines Felds nicht ändern kann und über keine Methode zum Ändern des Feldinhalts verfügt.
--Wenn sich der Status nach dem Erstellen der Instanz nicht ändert. Es ist die folgende Zeit. ** Das Feld ist endgültig, die Setter-Methode existiert nicht und die Instanz, auf die das Feld verweist, ändert sich nicht **.
Beachten Sie, dass die folgenden Klassen nicht unveränderlich sind.
public final class Hoge {
private final StringBuffer hoge;
public Hoge(String a, String b) {
this.hoge = new StringBuffer("a=" + a + ", b=" + b);
}
public StringBuffer getHoge() {
return hoge;
}
}
Die Instanz, die das von der getHoge-Methode erhaltene hoge-Feld hat, ist kein String, sondern eine Instanz von StringBuffer. Da die StringBuffer-Klasse über eine Methode zum Ändern des internen Status verfügt, kann der Inhalt des Hoge-Felds von außen neu geschrieben werden. Da das Hoge-Feld als endgültig deklariert wird, ändert sich der Wert des Felds selbst nicht, aber der Status der Instanz, auf die das Feld (als Zeiger betrachtet) zeigt, kann sich ändern.
Einige Java-Standardklassenbibliotheken verfügen über ein Paar veränderbarer und unveränderlicher Klassen. Zum Beispiel die Klassen StringBuffer und String. StringBuffer wird beim Umschreiben ordnungsgemäß synchronisiert. Andererseits verwendet die String-Klasse nicht Synchronized, sodass eine Hochgeschwindigkeitsreferenz möglich ist. Verwenden Sie StringBuffer, wenn Sie den Inhalt häufig ändern möchten, und verwenden Sie String, wenn Sie den Inhalt nicht ändern und nur darauf verweisen müssen.
Wenn die Synchronisierung unter der Annahme entfernt wird, dass es sich um ein unveränderliches Muster handelt, geht die Sicherheit der Klasse verloren, sobald die Unveränderlichkeit verloren geht. Daher sollte die Unveränderlichkeit in den Programmkommentaren und in der API-Dokumentation klar angegeben werden.
Beziehung Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multi-Thread-Edition) "(Teil 1) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithreaded Edition) "(Teil 2) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithread Edition) "(Teil 3)
Recommended Posts