Apa perbedaan antara inisialisasi dalam satu static
blok:
public class staticTest {
static String s;
static int n;
static double d;
static {
s = "I'm static";
n = 500;
d = 4000.0001;
}
...
Dan inisialisasi statis individu:
public class staticTest {
static String s = "I'm static";
static int n = 500;
static double d = 4000.0001;
....
java
static-initialization
Adam Matan
sumber
sumber
Jawaban:
Blok inisialisasi statis memungkinkan inisialisasi yang lebih kompleks, misalnya menggunakan kondisional:
static double a; static { if (SomeCondition) { a = 0; } else { a = 1; } }
Atau jika lebih dari sekadar konstruksi diperlukan: saat menggunakan pembuat untuk membuat instance Anda, penanganan pengecualian atau pekerjaan selain membuat bidang statis diperlukan.
Blok inisialisasi statis juga berjalan setelah penginisialisasi statis sebaris, jadi berikut ini valid:
static double a; static double b = 1; static { a = b * 4; // Evaluates to 4 }
sumber
Penggunaan tipikal:
private final static Set<String> SET = new HashSet<String>(); static { SET.add("value1"); SET.add("value2"); SET.add("value3"); }
Bagaimana Anda melakukannya tanpa penginisialisasi statis?
sumber
SET
dan menggunakan variabel penginisialisasi (private final static Set<String> SET = createValueSet()
). Bagaimana jika Anda memiliki 5 set dan 2 peta, apakah Anda akan membuang semuanya ke dalam satustatic
blok?Anda dapat menggunakan blok try / catch di dalam
static{}
seperti di bawah ini:MyCode{ static Scanner input = new Scanner(System.in); static boolean flag = true; static int B = input.nextInt(); static int H = input.nextInt(); static{ try{ if(B <= 0 || H <= 0){ flag = false; throw new Exception("Breadth and height must be positive"); } }catch(Exception e){ System.out.println(e); } } }
PS: Disebut dari ini !
sumber
Penanganan pengecualian selama inisialisasi adalah alasan lain. Sebagai contoh:
static URL url; static { try { url = new URL("https://blahblah.com"); } catch (MalformedURLException mue) { //log exception or handle otherwise } }
Ini berguna untuk konstruktor yang secara mengganggu menampilkan pengecualian yang dicentang, seperti di atas, atau logika inisialisasi yang lebih kompleks yang mungkin rentan terhadap pengecualian.
sumber
Terkadang Anda ingin melakukan lebih dari sekadar menetapkan nilai ke variabel statis. Karena Anda tidak bisa meletakkan pernyataan arbitrer di badan kelas, Anda bisa menggunakan blok penginisialisasi statis.
sumber
Dalam contoh Anda, tidak ada perbedaan; tetapi seringkali nilai awal lebih kompleks daripada yang diekspresikan dengan nyaman dalam ekspresi tunggal (misalnya, itu adalah
List<String>
yang isinya paling baik diekspresikan denganfor
-loop; atau ituMethod
mungkin tidak ada, jadi diperlukan penangan pengecualian), dan / atau bidang statis perlu disetel dalam urutan tertentu.sumber
static
blok dapat digunakan untuk menginisialisasi contoh tunggal , untuk mencegah penggunaan metode tersinkronisasigetInstance()
.sumber
Secara teknis, Anda bisa lolos tanpanya. Beberapa lebih memilih kode inisialisasi multiline untuk menggunakan metode statis. Saya cukup senang menggunakan penginisialisasi statis untuk inisialisasi multistatement yang relatif sederhana.
Tentu saja, saya hampir selalu membuat statika saya
final
dan menunjuk ke objek yang tidak dapat dimodifikasi.sumber
Kata kunci statis (apakah itu variabel atau blok) adalah milik kelas. Jadi ketika kelas dipanggil, variabel atau blok ini dijalankan. Jadi sebagian besar inisialisasi akan dilakukan dengan bantuan kata kunci statis. Karena ini adalah milik kelas itu sendiri, kelas tersebut dapat langsung mengaksesnya, tanpa membuat instance kelas.
Contoh:
class Shoe { int size; String colour; static String brand = "Nike"; public Shoe(int size, String colour) { super(); this.size = size; this.colour = colour; } void displayShoe() { System.out.printf("%-2d %-8s %s %n",size,colour, brand); } public static void main(String args[]) { Shoe s1 = new Shoe(7, "Blue"); Shoe s2 = new Shoe(8, "White"); System.out.println("================="); s1.displayShoe(); s2.displayShoe(); System.out.println("================="); } }
sumber
Kami menggunakan konstruktor untuk menginisialisasi variabel instan kami (variabel non-statis, variabel milik objek, bukan kelas).
Jika Anda ingin menginisialisasi variabel kelas (variabel statis) dan ingin melakukannya tanpa membuat objek (konstruktor hanya dapat dipanggil saat membuat objek), Anda memerlukan blok statis.
static Scanner input = new Scanner(System.in); static int widht; static int height; static { widht = input.nextInt(); input.nextLine(); height = input.nextInt(); input.close(); if ((widht < 0) || (height < 0)) { System.out.println("java.lang.Exception: Width and height must be positive"); } else { System.out.println("widht * height = " + widht * height); } }
sumber
System.out.println("B * H");
sangat tidak berguna. Dan jawabannya sendiri sangat tidak jelas. OP tidak menyebutkan konstruktor atau variabel instan.Blok kode statis memungkinkan untuk menginisialisasi field dengan lebih dari sekedar instuction, menginisialisasi field dalam urutan deklarasi yang berbeda dan juga dapat digunakan untuk inisialisasi bersyarat.
Lebih spesifik,
static final String ab = a+b; static final String a = "Hello,"; static final String b = ", world";
tidak akan berfungsi karena a dan b dideklarasikan setelah ab.
Namun saya bisa menggunakan init statis. blokir untuk mengatasi ini.
static final String ab; static final String a; static final String b; static { b = ", world"; a = "Hello"; ab = a + b; } static final String ab; static final String a; static final String b; static { b = (...) ? ", world" : ", universe"; a = "Hello"; ab = a + b; }
sumber
ab
deklarasi Anda di bawah deklarasib
.Blok inisialisasi statis berguna jika Anda ingin menginisialisasi jenis statis kelas yang ditentukan, sebelum kelas pertama digunakan. Penggunaan selanjutnya tidak akan memanggil blok inisialisasi statis apa pun. Ini kebalikan langsung dari penginisialisasi instance, yang menginisialisasi anggota instance.
sumber
Ketika Anda ingin mengevaluasi ekspresi tertentu saat waktu pemuatan kelas maka Anda dapat menggunakan blok statis tetapi ingat:
sumber