Pendapat saya mungkin kontroversial, tapi ya, saya pikir pasti ada situasi di mana saya akan menggunakan gaya seperti ini. Namun, "hanya untuk mengurangi ruang lingkup variabel" bukan argumen yang valid, karena itulah yang sudah Anda lakukan. Dan melakukan sesuatu hanya untuk melakukannya bukan alasan yang sah. Perhatikan juga bahwa penjelasan ini tidak memiliki arti jika tim Anda telah memutuskan apakah sintaksis semacam ini konvensional atau tidak.
Saya terutama seorang programmer C #, tetapi saya telah mendengarnya di Jawa, mengembalikan kata sandi sebagai char[]
yang memungkinkan Anda untuk mengurangi waktu kata sandi akan tinggal di memori. Dalam contoh ini, itu tidak akan membantu, karena pengumpul sampah diizinkan untuk mengumpulkan array dari saat itu tidak digunakan, jadi tidak masalah jika kata sandi meninggalkan ruang lingkup. Saya tidak berdebat apakah layak untuk menghapus array setelah Anda selesai dengan itu, tetapi dalam kasus ini, jika Anda ingin melakukannya, pelingkupan variabel masuk akal:
{
char[] password = getPassword();
try{
keyStore.load(new FileInputStream(keyStoreLocation), password);
keyManager.init(keyStore, password);
}finally{
Arrays.fill(password, '\0');
}
}
Ini sangat mirip dengan coba-dengan-sumber daya , karena ini lingkup sumber daya dan melakukan finalisasi setelah Anda selesai. Sekali lagi harap dicatat bahwa saya tidak berdebat untuk menangani kata sandi dengan cara ini, hanya saja jika Anda memutuskan untuk melakukannya, gaya ini masuk akal.
Alasan untuk ini adalah bahwa variabel tidak lagi valid. Anda telah membuatnya, menggunakannya, dan membatalkan statusnya untuk tidak mengandung informasi yang berarti. Tidak masuk akal untuk menggunakan variabel setelah blok ini, jadi masuk akal untuk lingkup itu.
Contoh lain yang bisa saya pikirkan adalah ketika Anda memiliki dua variabel yang memiliki nama dan makna yang serupa, tetapi Anda bekerja dengan satu dan kemudian dengan yang lain, dan Anda ingin memisahkannya. Saya telah menulis kode ini dalam 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);
}
Anda dapat berpendapat bahwa saya dapat mendeklarasikan ILGenerator il;
di bagian atas metode, tetapi saya juga tidak ingin menggunakan kembali variabel untuk objek yang berbeda (pendekatan yang agak fungsional). Dalam hal ini, blok memudahkan untuk memisahkan pekerjaan yang dilakukan, baik secara sintaksis maupun visual. Ia juga memberi tahu bahwa setelah blok, saya selesai il
dan tidak ada yang mengaksesnya.
Argumen terhadap contoh ini menggunakan metode. Mungkin ya, tetapi dalam kasus ini, kodenya tidak terlalu panjang, dan memisahkannya ke dalam metode yang berbeda juga perlu untuk meneruskan semua variabel yang digunakan dalam kode.