21日の日記を読み返していたら、わけのわからないことを書いていることに気付く。眠りながら書くもんじゃありませんな。最初と最後に実行したいだけなら単に


... // 最初だけの処理
for (Object obj in a) {
...
}
... // 最後だけの処理
と書けばよいじゃないか。えらく、あっさりと解決……という話ではなくて、21日の日記で本当に書きたかったのは、「最初とか最後“以外”の処理」をどう書けばよいかという話だったのである。例えば、複数の文字をCSVのように途中はカンマ区切りにしたい場合には、

StringBuffer sb = new StringBuffer();
for (int i = 0; i < a.length; i++) {
sb.append(a[i]);
if (i != (a.length - 1)) {
sb.append(',');
}
}
と書かなければならないわけだが、私にはこの書き方がとても気持ちわるく思えるのである。まあ、この場合は、ループ内の処理が一行しかないから

StringBuffer sb = new StringBuffer();
for (int i = 0; i < a.length - 1; i++) {
sb.append(a[i]);
sb.append(',');
}
sb.append(a[a.length - 1]);
とでも書けばよいのだが、ループ内の処理が長い場合はそうもいかない。しかも、内部イテレータ的な書き方の場合にはこういう書き方はできない。いろいろ考えたのだが、こういうのはどうだろうか。

StringBuffer sb = new StringBuffer();
for (String str in a) {
sb.append(str);
if (!:loop.isLast()) {
sb.append(',');
}
}
ようするに、ループ中では現在の状態を持つ:loopオブジェクトが生成されるのである。ループの度にオブジェクトが生成されるのは馬鹿馬鹿しい気もするが、実際には各スレッドごとにひとつだけオブジェクトが生成されていれば使いまわせるのでパフォーマンスがそれほど悪化するこということもあるまい。

新耳袋 第八夜」を購入。はっきり言って今回はカスです。てゆうか、もうネタ切れですか。あとがきで著者達がいろいろと言い訳しているが、そういう問題じゃないと思うぞ。