亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

一次實例化一堆類的正確方法

一次實例化一堆類的正確方法

慕妹3146593 2022-11-30 10:54:32
我有一個類,我需要在其中實例化Main.java一堆其他類說C1.java......。C50.java我想不出一種優雅的方法來在主類中實例化這 50 個類。如果我只是將所有實例化代碼放在一個地方,它看起來會非常擁擠和丑陋。今天我有50類要實例化,明天這個計數可以增加到100,然后這種情況會變得更糟。您能否建議一種優雅的方法來實例化所有這些類,而不會使 Main 類充滿實例化代碼。我不知道有任何設計模式可以做到這一點。我正在考慮創建一個需要實例化的類數組,并使用反射來實例化它們。
查看完整描述

2 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

答案取決于課程的用途。但是,如果您不介意以實例化類的無序集合結束,可以使用Reflections庫,我想在代碼行問題上也是一個簡短的方法:


// find out all the classes implementing MyInterface

Set<Class<? extends MyInterface>> subTypes = reflections.getSubTypesOf(MyInterface.class);


// iterate those classes and instntinate them

List<MyInterface> objects = new ArrayList<>();

for (Class<? extends MyInterface> clazz: subtypes) {

    objects.add(clazz.newInstance());

}

無論如何,整個設計都應該重新考慮。


查看完整回答
反對 回復 2022-11-30
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

推薦的解決方案是使用服務加載器架構。

實例化所有已注冊的實現MyInterface可以簡單地完成

for(MyInterface my: ServiceLoader.load(MyInterface.class)) {
    /* do something with <my> */
    }

為了使這項工作有效,僅實現接口是不夠的,必須將這些實現聲明為服務提供者,要么通過META-INF/services/jar 文件中的條目(如鏈接類文檔中所述),要么通過providesJava 模塊聲明中的聲明,當使用 Java 9 或更新版本。

這樣做的好處不僅是更高的性能,與使用反射庫搜索整個類路徑相比,它還確保在將來使用 Java 的模塊系統時建立必要的訪問權限。

另請參閱Java 9 版本的類文檔。


查看完整回答
反對 回復 2022-11-30
  • 2 回答
  • 0 關注
  • 86 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號