2011-04-04 101 views
0

我有一個抽象類,它具有創建該類的新實例的共享方法。我不想創建實際的抽象類的新實例(反正你不能這樣做),而是實現實現子類。從java中的類中實例化同一類的對象

爲了做到這一點,我這樣做:

constructor = this.getClass().getConstructor(String.class,String.class); 
        Object[] params = new Object[2]; 
        params[0] = "one"; 
        params[1]= "two"; 

        Object piece = constructor.newInstance(params); 

有沒有做到這一點

+0

5系似乎並不認爲羅嗦... – bdares 2011-04-04 01:20:27

+0

除非你正在尋找DI框架,比如Spring或Weld,我不認爲有更好的方法來做到這一點。構造函數特定於實現類,不能通過接口進行概括。如果你不喜歡這種模式,我可以建議你創建一個返回抽象類型的「newInstance」方法。這會將子類帶入用於實例化的接口契約。 – SplinterReality 2011-04-04 01:23:16

+0

@bdares - 他被排除在異常處理之外... – 2011-04-04 01:27:38

回答

4

雖然你可以寫你一點點更少的代碼做什麼,少羅嗦的方式,我認爲你應該考慮一個更清潔的方式。你可以創建一個抽象方法來擴展類必須實現來構造一個新的實例。這將保證總是有一個安全的構造函數來調用,並且沒有實例化異常來處理。它會是這個樣子的你的情況:

public abstract class AbstractClass { 
    protected abstract AbstractClass newInstance(String str1, String str2); 

    public void foo() { 
     Object piece = newInstance("one", "two"); 
    } 
} 

public class MyClass extends AbstractClass { 
    protected AbstractClass newInstance(String str1, String str2) { 
     return new MyClass(str1, str2); 
    } 
} 
+1

+1 - 在這種情況下,清潔劑意味着更快,更脆弱。 – 2011-04-04 01:28:54

2

我可能會寫

constructor = this.getClass().getConstructor(String.class,String.class); 
Object piece = constructor.newInstance(new String[] {"one", "two"});