View Full Version : [JAVA]Passaggio String per riferimento
Gilmour93
18-03-2015, 12:01
Ciao ragazzi,
sto creando un'app Android di una calcolatrice.
Il mio problema è il seguente: quando digito i tasti, richiamo una funzione (textchain) per concatenare delle stringhe, ma questa non esegue modifiche perché in Java gli oggetti String sono passati solo per copia.
Come posso risolvere il mio problema e creare un "finto" passaggio per riferimento?
B2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String s = (textdig.getText().toString());
textchain (s,"2");
textdig.setText(s);
}
});
public void textchain(String x, String y){
if (x.length()<12) {
x = x + y;
}
}
sottovento
18-03-2015, 12:45
Ciao ragazzi,
sto creando un'app Android di una calcolatrice.
Il mio problema è il seguente: quando digito i tasti, richiamo una funzione (textchain) per concatenare delle stringhe, ma questa non esegue modifiche perché in Java gli oggetti String sono passati solo per copia.
Come posso risolvere il mio problema e creare un "finto" passaggio per riferimento?
B2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String s = (textdig.getText().toString());
textchain (s,"2");
textdig.setText(s);
}
});
public void textchain(String x, String y){
if (x.length()<12) {
x = x + y;
}
}
In realta' le stringhe in java sono oggetti immutabili: una volta creati, non c'e' modo di cambiarne il valore.
Quando fai
x = x + y
stai creando una nuova stringa.
Il modo migliore per avere delle "stringhe" modificabili e' usare StringBuilder (o StringBuffer se l'oggetto in questione puo' essere aggiornato da piu' thread simultaneamente). La StringBuilder possiede i metodi append() che ti permettono di fare esattamente quello che vuoi fare, risparmiando codice e migliorando le prestazioni
Gilmour93
18-03-2015, 14:30
Sono riuscito a risolvere il problema con i tuoi consigli! Grazie mille sottovento! :D
P.S. Allego il codice nel caso qualcuno abbia il mio stesso problema! ;)
final StringBuffer s = new StringBuffer();
B1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
s.setLength(0);
s.append(textdig.getText().toString());
textchain(s,"1");
textdig.setText(s);
}
});
public void textchain (StringBuffer x, String y){
if (x.length()<12) {
x.append(y);
}
}
sottovento
18-03-2015, 16:51
Ciao
come mai usi StringBuffer invece di StringBuilder? Hai due o piu' thread che accedono a questo oggetto?
Gilmour93
19-03-2015, 14:25
Sinceramente, non conoscevo nessuna delle due librerie prima che me le menzionassi tu. Da come me ne hai parlato sembrava che StringBuffer fosse più generica, quindi ho cercato direttamente quella. Non so quali siano le differenze tra le due e i vari pro/contro.
[Kendall]
19-03-2015, 14:33
Sinceramente, non conoscevo nessuna delle due librerie prima che me le menzionassi tu. Da come me ne hai parlato sembrava che StringBuffer fosse più generica, quindi ho cercato direttamente quella. Non so quali siano le differenze tra le due e i vari pro/contro.
StringBuffer è sincronizzato, StringBuilder no.
Il consiglio quindi è di andare sulla classe StringBuilder, salvo sia proprio necessario avere un comportamento sincronizzato (cosa che tra l'altro puoi ottenere in maniera semplice anche con lo StringBuilder, tramite il costrutto "syncronized").
Gilmour93
19-03-2015, 14:41
Va bene, grazie dei chiarimenti. ;) Ho notato che le due classi si comportano allo stesso modo, quindi mi basta semplicemente sostituire StringBuffer con StringBuilder nel codice e lasciare tutto il resto invariato.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.