第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

繞過(guò)java中靜態(tài)方法的早期綁定

繞過(guò)java中靜態(tài)方法的早期綁定

至尊寶的傳說(shuō) 2024-01-05 09:59:01
我有一個(gè) AbstractBaseRepository。我所有的存儲(chǔ)庫(kù)都從這個(gè)類擴(kuò)展。我創(chuàng)建了另一個(gè)類 RepositoryFactory 來(lái)創(chuàng)建 Repository 的任何實(shí)例。由于靜態(tài)方法的早期綁定,我面臨問(wèn)題。public abstract class AbstractBaseRepository {    public static <T extends AbstractBaseRepository> T getNewInstance(EntityManagerFactory entityManagerFactory) {        throw new RuntimeException("Override and provide valid initialization");    }    ...}public class RepositoryFactory {    public static <T extends AbstractBaseRepository>  T getRepository(Class<T> cls) {               return T.getNewInstance(entityManagerFactory);    }    ...}一個(gè)示例子類public class DeviceModelRepo extends AbstractBaseRepository {    public static DeviceModelRepo getNewInstance(EntityManagerFactory entityManagerFactory) {        return new DeviceModelRepo(entityManagerFactory);    }    ...}每當(dāng)我使用 AbstractBaseRepository 的有效子類調(diào)用 getRepository() 時(shí),都會(huì)引發(fā)運(yùn)行時(shí)異常。這是由于靜態(tài)方法的早期綁定造成的。在編譯時(shí), getNewInstance 與 AbstractBaseRepository 綁定,而不是在運(yùn)行時(shí)與類的實(shí)際類型綁定。有什么好的解決辦法嗎?
查看完整描述

2 回答

?
茅侃侃

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊

我的第一個(gè)建議是使用 Spring。獲取使用某個(gè)接口創(chuàng)建的所有 bean 的列表非常容易。

另外,如果您將 Repository 實(shí)例視為一種“插件”,您可能會(huì)看到 Java 的 ServiceLoader 類如何提供幫助。

另外,另一種方法是在工廠中使用 switch 語(yǔ)句并為每種情況創(chuàng)建實(shí)例,而不是在 Repository 子類上使用靜態(tài)方法。

最后,我不推薦反射解決方案,但有一些方法可以根據(jù)類的名稱加載類并反射性地創(chuàng)建新實(shí)例。

但重寫靜態(tài)方法是不可能的。


查看完整回答
反對(duì) 回復(fù) 2024-01-05
?
撒科打諢

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊

通過(guò)查看您的代碼,我了解到您希望擁有 AbstractBaseRepository 的不同實(shí)現(xiàn),例如 DeviceModelRepo。然后你需要一個(gè)工廠類來(lái)創(chuàng)建AbstractBaseRepository的具體實(shí)現(xiàn)的實(shí)例。這里的主要問(wèn)題是您嘗試覆蓋永遠(yuǎn)無(wú)法覆蓋的靜態(tài)方法,但子類將隱藏父實(shí)現(xiàn)。請(qǐng)不要使用靜態(tài)方法進(jìn)行覆蓋。您可以按如下所示更改您的實(shí)施,此問(wèn)題將得到解決。


public abstract class AbstractBaseRepository {

    public AbstractBaseRepository(EntityManagerFactory entityManagerFactory){

        ...

    }

    //removed method getNewInstance(EntityManagerFactory entityManagerFactory) 

    ...

}

然后是子類的下面的實(shí)現(xiàn)。


public class DeviceModelRepo extends AbstractBaseRepository {


    public DeviceModelRepo(EntityManagerFactory entityManagerFactory) {

        super(entityManagerFactory);

        ...

    }

    //removed method getNewInstance(EntityManagerFactory entityManagerFactory) 

    ...

}

現(xiàn)在我為您提供工廠類的兩個(gè)實(shí)現(xiàn)。一是每個(gè)實(shí)現(xiàn)都有不同的方法,例如 getDeviceModelRepository()。另一種解決方案是使用反射并通過(guò)傳遞實(shí)現(xiàn)存儲(chǔ)庫(kù)類來(lái)獲取存儲(chǔ)庫(kù)實(shí)例。


public class RepositoryFactory {

    //Solution-1, create separate method for each of repository like below

    public static AbstractBaseRepository getDeviceModelRepository() {       

        return new DeviceModelRepo(entityManagerFactory);

    }

    //Solution-2, use reflection to get instance of specific implementation

    //of AbstractBaseRepository

    public static <T extends AbstractBaseRepository> T 

        getRepository(Class<T> repoClass) throws Exception{


        return repoClass.getConstructor(EntityManagerFactory.class)

            .newInstance(entityManagerFactory);

    }

    ...

}

使用反射解決方案,您可以獲得存儲(chǔ)庫(kù)實(shí)例,如下所示。


RepositoryFactory.getRepository(DeviceModelRepo.class)


查看完整回答
反對(duì) 回復(fù) 2024-01-05
  • 2 回答
  • 0 關(guān)注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)