私の意見は議論の余地があるかもしれませんが、はい、確かに、この種のスタイルを使用する状況があると思います。ただし、「変数のスコープを縮小するだけ」は有効な引数ではありません。これは既に行っていることです。そして、それをするためだけに何かをするのは正当な理由ではありません。また、この種の構文が従来のものであるかどうかをチームが既に解決している場合、この説明には意味がないことに注意してください。
私は主にC#プログラマですが、Javaではパスワードをそのまま返すchar[]
ので、パスワードがメモリ内に留まる時間を短縮できます。この例では、ガベージコレクターは使用されていない時点から配列を収集することが許可されているため、役に立たないため、パスワードがスコープを離れても問題になりません。私はそれを使い終わった後に配列をクリアすることが実行可能かどうかを議論していませんが、この場合、あなたがそれをしたいなら、変数のスコープは意味があります:
{
char[] password = getPassword();
try{
keyStore.load(new FileInputStream(keyStoreLocation), password);
keyManager.init(keyStore, password);
}finally{
Arrays.fill(password, '\0');
}
}
これは、try-with-resourcesステートメントと実際に似ています。これは、リソースのスコープを決定し、完了後にリソースに対してファイナライズを実行するためです。繰り返しますが、私はこの方法でパスワードを処理することを主張していないことに注意してください。あなたがそうすることを決めた場合、このスタイルは合理的です。
これは、変数が無効になったためです。意味のある情報が含まれないように、作成し、使用し、状態を無効にしました。このブロックの後に変数を使用することは意味がないため、スコープを設定するのが妥当です。
私が考えることができるもう1つの例は、名前と意味が似ている2つの変数があり、一方を使用してからもう一方を使用し、それらを分離したい場合です。私はこのコードをC#で作成しました。
{
MethodBuilder m_ToString = tb.DefineMethod("ToString", MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final, typeofString, Type.EmptyTypes);
var il = m_ToString.GetILGenerator();
il.Emit(OpCodes.Ldstr, templateType.ToString()+":"+staticType.ToString());
il.Emit(OpCodes.Ret);
tb.DefineMethodOverride(m_ToString, m_Object_ToString);
}
{
PropertyBuilder p_Class = tb.DefineProperty("Class", PropertyAttributes.None, typeofType, Type.EmptyTypes);
MethodBuilder m_get_Class = tb.DefineMethod("get_Class", MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final, typeofType, Type.EmptyTypes);
var il = m_get_Class.GetILGenerator();
il.Emit(OpCodes.Ldtoken, staticType);
il.Emit(OpCodes.Call, m_Type_GetTypeFromHandle);
il.Emit(OpCodes.Ret);
p_Class.SetGetMethod(m_get_Class);
tb.DefineMethodOverride(m_get_Class, m_IPattern_get_Class);
}
ILGenerator il;
メソッドの先頭で単純に宣言できると主張することができますが、異なるオブジェクトに変数を再利用したくはありません(ちょっと機能的なアプローチ)。この場合、ブロックにより、実行されるジョブを構文的にも視覚的にも簡単に分離できます。また、ブロックの後、処理が完了しil
、何もアクセスすべきではないことを示しています。
この例に対する議論は、メソッドの使用です。たぶんそうかもしれませんが、この場合、コードはそれほど長くありません。また、コードを別のメソッドに分離するには、コードで使用されるすべての変数を渡す必要があります。