Immutable View auf StringBuffer?

kirdie

Bekanntes Mitglied
TLDR: Gibt es in der Standard-API eine Möglichkeit, einen Immutable View auf einen StringBuffer zu erstellen?

Ausführlich: In meinem Programm kann der Nutzer mit einer drop down Liste eine Sprache auswählen und auch später noch ändern. Ein anderer Teil des Programms nutzt diese Sprache nun zur Anzeige. Daher habe ich mich für einen StringBuffer entschieden. Um jedoch zu vermeiden, dass der Anzeigeteil die Sprache ändert, würde ich gerne einen Immutable View übergeben. Ist das möglich?
 
M

maki

Gast
Die "immutable view eines StringBuffers" nennt sich: String

StringBuffer ist übrigens der vorläufer von StringBuilder (letzterer ist nciht syncronisiert), aber normalerweise nutzt man String.
 

kirdie

Bekanntes Mitglied
Na String ist eben kein Immutable View, denn folgendes kann ein String eben nicht:

Java:
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class Main
{
	public static void main(String[] args)
	{
		StringBuffer sb = new StringBuffer();
		sb.append("Hallo Welt");
		String s = sb.toString();
		sb.delete(0, sb.length());
		sb.append("Hallo Schmelt");
		System.out.println(s);

		List<String> list = new LinkedList<String>();
		list.add("Hallo Welt");
		List<String> unmodifiableList = Collections.unmodifiableList(list);
		list.clear();
		list.add("Hallo Schmelt");
		System.out.println(unmodifiableList);
	}
}

Output:
Java:
Hallo Welt
[Hallo Schmelt]
 
S

SlaterB

Gast
dein Beispiel zeigt, dass String s den Inhalt "Hallo Welt" aus dem StringBuilder vor der Änderung zu 'Hallo Schmelt' gerettet hat,
klingt eher positiv?

und dass Collections.unmodifiableList() nicht die darunterliegende Liste von Änderungen schützt, wenn auf diese normal zugegriffen wird,
was weder mit String und schon gar nicht mit StringBuilder allzu viel zu tun hat,

was du am Programm auszusetzen hast und eigentlich erwartest verrätst du nicht, tolle Sache..
 
Zuletzt bearbeitet von einem Moderator:

fastjack

Top Contributor
Ich verstehe jetzt auch nicht gerade den Zusammenhang zwischen dem String und der Collection. Natürlich ist der String immutable. Außerdem sagt die API der Collectionsklasse in Bezug auf diese Methode, das Funktionen, die auf der resultierenden Liste manipulieren eine Exception werfen, was in diesem Beispiel auch gut vorgeführt wird.

Da es um Sprachressourcen geht, schau dir doch mal Locales und das ResourceBundle aus dem Standard-Java an.
 
Zuletzt bearbeitet:

kirdie

Bekanntes Mitglied
was du am Programm auszusetzen hast und eigentlich erwartest verrätst du nicht, tolle Sache..
Doch, das schreibe ich doch ganz am Anfang.

In meinem Programm kann der Nutzer mit einer drop down Liste eine Sprache auswählen und auch später noch ändern. Ein anderer Teil des Programms nutzt diese Sprache nun zur Anzeige

Aber ich schreibe es noch mal ganz ausführlich:

Es gibt eine Variable "languageTag", die die Sprache des Programms enthält, also z.B. "en", "de", "us" und so weiter.
Durch eine drop down Liste ist diese Sprache auswähl- und änderbar.

Ein anderer Teil des Programmes zeigt jetzt je nach der ausgewählten Sprache unterschiedliche Sachen an, z.B. wenn die Sprache "en" ist "Munich" und ansonsten "München", diese Daten sind aber nicht vorgespeichert sondern werden aus dem Semantic Web geholt (deshalb geht auch sowas wie locales da nicht weil ich die Daten ja erst abrufe).

Wenn ich jetzt den Anzeigeteil instanziiere, dann übergebe ich die Sprache. Aber das geht nicht mit einem String, weil sich die Sprache ja ändert.
Java:
Anzeige anzeige = new Anzeige(sprache);

Wenn ich aber Anzeige einen StringBuffer übergebe, dann kann die Klasse Anzeige aber theoretisch die Sprache ändern, aber das darf sie natürlich nicht, deshalb geht ein StringBuffer auch nicht.
Was ich also brauche ist ein "immutable view" (d.h. die Sicht ist unveränderlich, das Objekt nicht), was ich nicht brauche ist ein unveränderliches Objekt.

Doch doch, nur das er eben seinen Wert nie ändert ;)
IMHO ist deine Nutzung des StringBuffers nicht im Sinne des Erfinders..

StringBuffer sind doch veränderliche Strings oder? Und genau das habe ich ja.

P.S.: Achso, um nochmal das Beispiel zu erklären. Das Verhalten von der Liste ist mein Wunschverhalten. Das ist auch Absicht, dass ich die Liste ändere und das durchgeht, nur brauch ich eben keine Liste sondern einen String.
 
Zuletzt bearbeitet:
M

maki

Gast
Du arbeitest gerade an Java vorbei, String sind immutable aus gutem Grunde, was du eigentlich willst ist ein Mechanismus der dafür sorgt, dass die Anzeige sich ändert wenn sich die Sprache ändert, schon mal "Listener" und MVC gehört?
Die JavaBeans spek bietet da etwas: PropertyChangeSupport
 

kirdie

Bekanntes Mitglied
Ich weiß, dass ich sowas auch mit Listenern machen kann aber ich möchte halt nicht 20+ Zeilen Code haben, wenn ich es auch mit einer Codezeile machen kann. Die Anzeige muss ja nicht sofort die Sprache umstellen, es reicht mir, wenn es beim nächsten Aufruf aktualisiert wird. Also du meinst, es wäre besser, das mit Listenern zu machen, als jetzt selbst einen Immutable View auf einen StringBuffer zu schreiben?
 

Wildcard

Top Contributor
Du machst es dir vielleicht kompliziert...
Was wäre so tragisch ein einer Language Klasse mit einer
Code:
String getLanguage()
Methode?
Wenn du Lust hast kannst du für deren Implementierung sogar einen StringBuilder als Member verwenden, auch wenn das reichlich sinnlos ist...
 

kirdie

Bekanntes Mitglied
@Wildcard: Ich schreibe lieber eine Klasse mit allgemeiner Funktionalität, die ich dann mehrfach verwenden kann, als für jeden Spezialfall eine extra Klasse mit nur einer Variablen drin zu haben. So ein Immutable View hätte ja auch noch weitere Verwendungszwecke, während eine "Language" - Klasse nur genau den einen hätte.
 

Wildcard

Top Contributor
Dann nenne sie ImmutableStringView anstatt Language. Die Funktionalität bleibt die gleiche.
Wenn man keine echten Problem hat sucht man sich welche :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Klasse Immutable Allgemeine Java-Themen 14
Landei immutable Collections Allgemeine Java-Themen 27
J Immutable mit Interfaces möglich? Allgemeine Java-Themen 2
J immutable HashMaps und clone() Allgemeine Java-Themen 3
meez immutable final? Allgemeine Java-Themen 23
A Immutable Objects ? Allgemeine Java-Themen 8
B View communication eclipse Allgemeine Java-Themen 17
H Model-View-Controller Fail? Allgemeine Java-Themen 31
M Model View Controller Entwurfsmuster! Allgemeine Java-Themen 11
Crashbreaker RCP-View Image öffnen und darstellen Allgemeine Java-Themen 7
B A newer version of Java is needed to view the application. Allgemeine Java-Themen 17
J Model View Controller Architektur Allgemeine Java-Themen 6
T Pattern: Passive View Allgemeine Java-Themen 2
B MVC: controller in unabhängigen thread von der view starten (gui friert ein) Allgemeine Java-Themen 5
G Trennung View und Control Allgemeine Java-Themen 3
M Frage zur View Klasse des MVC Prinzip Allgemeine Java-Themen 3
L Doppelte eintraege im Stringbuffer löschen Allgemeine Java-Themen 4
127.0.0.1 StringBuffer leere Zeile löschen Allgemeine Java-Themen 8
S AWT StringBuffer macht nicht, was ich erwarte Allgemeine Java-Themen 2
T String vs StringBuilder vs StringBuffer Allgemeine Java-Themen 8
V Stringbuffer/builder leeren Allgemeine Java-Themen 2
neurox Stringbuffer -> MimeBodyPart Allgemeine Java-Themen 5
P StringBuffer, StringBuilder und StringWriter Allgemeine Java-Themen 4
T Performance String-Operationen und StringBuffer (1.4und 1.5) Allgemeine Java-Themen 18
G Zeilenweise aus einem StringBuffer lesen Allgemeine Java-Themen 4
B Inhalt von StringBuffer löschen Allgemeine Java-Themen 14
D Inputstream aus StringBuffer Allgemeine Java-Themen 3
M Regex und StringBuffer: Problem mit TAB-Codierung Allgemeine Java-Themen 3
A StringBuffer manipulation Klausur Allgemeine Java-Themen 2
T Kleine Verständnisfrage zu Stringbuffer Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben