2012-11-28 12 views
0

我需要創建匿名的內部類型,這些內部類型構建起來非常昂貴,並且需要訪問其中的最終變量。問題是我需要創建其中的很多,唯一不同的是使用的最終變量不同(對象本身和類型)。如何重用javas匿名內部類如果他們採取不同的最終參數?

是否有可能以更可重複的方式做到這一點?

一個簡單的例子:

final Object aNeededParameter = "test"; 
Object expensiveToBuild = new ExpensiveInnerType() { 
    public void doSomething() { 
     aNeededParameter.toString(); 
    } 
}); 

我需要爲不同的對象expensiveToBuild的實例的同時,例如1L,新日期(), 「另一個類似的用例」

基本想法是在運行時爲具體類的不同序列化實例創建代理,並在首次使用時反序列化這些對象。我做了一個工作示例(鏈接在底部),但代理創建非常昂貴。

有一個ProxyFactory需要一個MethodHandler來通過字節碼增強來創建一個Proxy對象。 MethodHandler定義了一個方法

invoke(Object self, Method realMethod, Method proxyMethod, Object[] args) throws Throwable 

在我的情況下,這個方法需要訪問一個byte [],它包含代理構建的序列化對象。所以我必須創建一個新的MethodHandler併爲我想要代理的每個對象構建/編譯一個新的Proxy對象。

在原始對象的每個方法調用之前自動調用invoke方法,並簡單地檢查該對象是否初始化,如果不是,則對其進行反序列化。之後,它調用原始對象上的調用方法。

如果你想看到具體的用例看這裏:

Lazy deserializationproxy for java

回答

4

只是不要讓它匿名的。匿名類的重點在於你不希望重用它們。通過構造函數將必要的最終變量傳遞給類。

其他選項是允許doSomething採用參數而不是構造函數,如果您希望匿名類被實例化一次。你仍然需要使它不是匿名的,它將需要由父類擁有,但是這允許你只使用一個對象。這是否是好設計取決於具體情況。

+0

,並通過構造函數傳遞給該類必要的最後一個變量。 – Vulcan

+0

並使用泛型來處理不同類型 – Aubin

+0

我認爲創建一個匿名內部類的實例是他所關心的昂貴部分,而不是類的實際定義。 –

1

使匿名內部類的對象引用某個包裝類的實例(例如,包裝類的實例變量之一是類型對象,並根據需要更改該變量)。

1

你的意思

final Object[] param = { null }; 

Foo foo = new Foo() 
    void invoke() 
     use param[0] 

param[0] = objA; 
foo.invoke(); 

param[0] = objB; 
foo.invoke(); 
+0

@mklemenz鑑於此信息,我認爲您需要在原始問題中提供更多信息。 –

+0

@KurtKaylor更新了更多細節問題 – maklemenz

相關問題