1 回答

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個(gè)贊
此功能沒有合理的用法。如果我在代碼審查中看到這一點(diǎn),我會(huì)強(qiáng)迫作者重構(gòu)它。
有時(shí),Java 規(guī)范允許您在理智的生產(chǎn)代碼中編寫不應(yīng)該做的事情,對(duì)我來說,這只是一個(gè)例子。
讓我們嘗試推導(dǎo)出利用此功能的代碼片段。
我們可以abstract在靜態(tài)初始化塊中使用關(guān)鍵字。這只能在定義類時(shí)通過聲明類本身abstract以及可選的一些方法來完成。
此類在初始化塊外部不可見,因此我們可以推斷我們將在內(nèi)部使用它。abstract都是關(guān)于創(chuàng)建實(shí)例或定義實(shí)例方法。因此,只有當(dāng)我們計(jì)劃創(chuàng)建抽象類的實(shí)例時(shí)它才有用。
現(xiàn)在,這個(gè)類是抽象的,所以為了能夠創(chuàng)建實(shí)例,我們至少需要一個(gè)子類。
如果我們只有一個(gè)子類,為什么要將其功能拆分為一個(gè)抽象父類和一個(gè)子類?那會(huì)不必要地復(fù)雜,所以我們可以假設(shè)我們有多個(gè)子類。
因此,要在abstract靜態(tài)初始化塊中對(duì)關(guān)鍵字進(jìn)行任何(至少是半理智的)使用,該塊必須定義一個(gè)抽象父類、多個(gè)子類,以及創(chuàng)建這些類的實(shí)例的代碼,例如以下最小示例:
static private int value;
static {
abstract class Abstract {
abstract int method1();
}
class Child1 extends Abstract {
int method1() {
return 1;
}
}
class Child2 extends Abstract {
int method1() {
return 2;
}
}
Abstract instance1 = new Child1();
Abstract instance2 = new Child2();
value = instance1.method1() + instance2.method1();
}
恕我直言,使用靜態(tài)初始化器應(yīng)該是個(gè)例外,這樣的怪物要求重構(gòu),例如將類從初始化塊中移出以成為普通的嵌套類,或者甚至更好,將它們移到自己的文件中。
這種抽象初始化器模式與重構(gòu)版本不同的唯一方面是類的可見性。您的可見性僅限于static { ... }塊內(nèi)。但是,如果您的課程如此復(fù)雜和冗長,以至于您擔(dān)心在您的static { ... }街區(qū)之外誤用,那么無論如何您都失敗了......
添加回答
舉報(bào)