Como respondido anteriormente aqui, as String
instâncias são imutáveis . StringBuffer
e StringBuilder
são mutáveis e adequados para esse fim, independentemente de você precisar ser seguro ou não.
Existe, no entanto, uma maneira de modificar uma String, mas eu nunca a recomendaria porque é insegura, não confiável e pode ser considerada trapaça: você pode usar a reflexão para modificar a char
matriz interna que o objeto String contém. O Reflection permite acessar campos e métodos normalmente ocultos no escopo atual (métodos ou campos particulares de outra classe ...).
public static void main(String[] args) {
String text = "This is a test";
try {
//String.value is the array of char (char[])
//that contains the text of the String
Field valueField = String.class.getDeclaredField("value");
//String.value is a private variable so it must be set as accessible
//to read and/or to modify its value
valueField.setAccessible(true);
//now we get the array the String instance is actually using
char[] value = (char[])valueField.get(text);
//The 13rd character is the "s" of the word "Test"
value[12]='x';
//We display the string which should be "This is a text"
System.out.println(text);
} catch (NoSuchFieldException | SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}