namae
を書き換えても、"こんにちは" + namae + "さん"
が自動的に計算され直される訳ではありません。
text[0] = "こんにちは" + namae + "さん"
のようにして、書き換える必要があります。
(2015/01/09 12:48 のコメントに対する回答)
text[0] = "こんにちは" + namae + "さん"
を実行した時にtext[0]
に格納されるのは式ではなく、計算結果です。
それを再代入することによって再評価されるわけではありません。
再評価させるようにするには、ちょっとした仕掛けが必要です。
※もしかしたら、誰かがこれと同じようなライブラリーを作っているかもしれませんが、調べていません。
lang
1// ReactiveString.java
2public final class ReactiveString {
3
4 private final String formatString;
5 private ObjectReference valueHolder;
6
7 public ReactiveString(String formatString, ObjectReference initValue) {
8 this.formatString = formatString;
9 this.valueHolder = initValue;
10 }
11
12 @Override
13 public String toString() {
14 return String.format(formatString, valueHolder.value);
15 }
16
17}
18
19// ObjectReference.java
20public final class ObjectReference {
21
22 Object value;
23
24 public ObjectReference(Object value) {
25 this.value = value;
26 }
27
28}
29
30
31// 使い方
32
33ObjectReference ref = new ObjectReference("John");
34ReactiveString[] texts = { // ちょっと修正:省略記法にしました
35 new ReactiveString("こんにちは、%sさん", ref),
36 new ReactiveString("さようなら、%sさん", ref)
37};
38for (ReactiveString v : texts) {
39 System.out.println(v);
40 // こんにちは、Johnさん
41 // さようなら、Johnさん
42}
43ref.value = "Jane";
44for (ReactiveString v : texts) {
45 System.out.println(v);
46 // こんにちは、Janeさん
47 // さようなら、Janeさん
48}
(追記)
初期化のところはこういう風にしても良いです。
lang
1// Java5以上8未満
2
3// (略)
4String[] textFormats = { "こんにちは%sさん", "さようなら%sさん" };
5final int n = textFormats.length;
6ReactiveString[] texts = new ReactiveString[n];
7for (int i = 0; i < n; i++) {
8 texts[i] = new ReactiveString(textFormats[i], ref);
9}
10// (略)
(2015/01/09 22:42 のコメントに対する回答)
「一つ一つnewしてReactiveString配列に要素を追加して、初期化している」というご質問の答えは、Yesです。
ご質問の意図とあっているかどうか分かりませんが、
実は、"こんにちは" + namae + "さん"
というコードも、new StringBuilder("こんにちは").append().append("さん").toString()
と書くのとほぼ同じ処理になります。(このような機能を、構文糖、もしくはシンタックスシュガーといいます。)
それと、再評価させるようにする必要が無い場合の方法も書いておきます。
lang
1
2 // (略)
3
4 String namae = "abc";
5 String[] text = { "こんにちは%sさん", "さようなら%sさん" };
6 private TextView textmessage;
7
8 // (略)
9
10 public void textShow() {
11 textmessage.setText(String.format(text[0], namae));
12 }
13
14 // (略)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/01/09 03:48
2015/01/09 13:42
2015/01/09 15:53
2015/01/09 23:59
2015/01/10 00:45