私はfor
- loopsをいじり、delphiのwith
キーワードを思い出して、次のパターン(IntelliJ IDEAでライブテンプレートとして定義されています)を思い付きました。
for ($TYPE$ $VAR$ = $VALUE$; $VAR$ != null; $VAR$ = null) {
$END$
}
生産的なコードで使用する必要がありますか?これらの1文字の変数のような一時的なショートカット変数をラムダで作成したり、ループを処理したりするのに便利だと思います。さらに、ブロックで使用する変数が最初にnull
かどうかをチェックします。 swingアプリケーションで以下のケースを検討してください:
// init `+1` button
for (JButton b = new JButton("+1"); b != null; add(b), b = null) {
b.setForeground(Color.WHITE);
b.setBackground(Color.BLACK);
b.setBorder(BorderFactory.createRaisedBevelBorder());
// ...
b.addActionListener(e -> {
switch (JOptionPane.showConfirmDialog(null, "Are you sure voting +1?")) {
case JOptionPane.OK_OPTION:
// ...
break;
default:
// ...
break;
}
});
}
これはアンチパターンではありません。これは、一般的に使用されている手法であり、何らかの問題があるためです。このコードは、「一般的に使用される」基準を満たしていません。
ただし、問題があります。ここにいくつかの問題があります:
new
は決してnullを返しません。)あなたがしていることは、コードを難読化することであり、それを明確にすることではありません。この「ループ」は一度しか実行されないことを理解するには、多くの努力が必要です。代わりに、ステートメントブロックを使用して変数のスコープを制限できます。
{
JButton b = new JButton("+1");
b.setForeground(Color.WHITE);
...
}
ラムダを使用している場合は、静的with
関数を定義して、次のように使用することもできます。
with(new JButton("+1"), b -> {
b.setForeground(Color.WHITE);
...
});
これは少しわかりやすいかもしれませんが、同じエラーを発生させる単純なブロックと比較すると、新しいエラーが発生する可能性がないため、多くの間接参照です。