2015-03-03 47 views
2

是否可以動態添加到由對象實現的接口列表中(因此instanceof返回true並且強制轉換不會失敗)?在運行時更改對象的實現接口

我有一組對象,其類型需要在運行時動態更改。隨着狀態的改變,更多的方法/屬性變得有效。目前,這是以「蠻力」的方式完成的......所有成員都暴露出來,在錯誤的時間調用錯誤的是一個錯誤。理想情況下,我想使用靜態類型,並將這些對象傳遞給需要特定接口的方法。對象實現的接口集合只會增加,所以舊的引用將保持有效。

在運行時是否可以使用內置反射或通過第三方字節碼操作來更改對象的實現接口?

+4

我不是100%確定你正在嘗試做什麼,請詳細說明。無論哪種方式,反射或'instanceof'的使用是一種代碼異味,並且表示您的代碼應該需要重構。可能有一種設計模式可以滿足你的需求。 – amit 2015-03-03 09:09:01

+4

靜態類型意味着編譯時執行,這與您希望類型在運行時更改的要求不一致。 – 2015-03-03 09:10:06

+1

@amit,「代碼味道」可能會或可能不會表明一個不好的解決方案(否則這將是一個語法錯誤)。在運行時使用'instanceof'來推斷對象的類型是有原因的。 – 2015-03-03 09:10:49

回答

2

您可以使用Proxy,但如評論所示 - 這幾乎總是不是最佳選擇。

你會更好地製作你的對象爲多方面。

interface Interface1 { 

    String getI1(); 
} 

interface Interface2 { 

    String getI2(); 
} 

class Multifaceted { 

    String i1; 
    String i2; 

    private final Interface1 asInterface1 = new Interface1() { 

     @Override 
     public String getI1() { 
      return i1; 
     } 

    }; 

    private final Interface2 asInterface2 = new Interface2() { 

     @Override 
     public String getI2() { 
      return i2; 
     } 

    }; 

    public Interface1 asInterface1() { 
     if (i1 == null) { 
      throw new InvalidStateException("I am not ready to be one of these yet!"); 
     } 
     return asInterface1; 
    } 

    public Interface2 asInterface2() { 
     return asInterface2; 
    } 

}