2017-04-02 52 views
1

我有一個接口,它的API只是getter方法,從而確保實現接口的類在這方面是不可變的。
但是,如果我需要更新改變接口行爲的東西,我將如何聲明我的接口,以便它創建具體類的新實例?
現在我有這樣的事情:爲了清晰強制不變性並在接口聲明中創建實例

public interface Generator { 
     public int[] values(); 
     public float[] indications(); 
     //etc 
     public MyEnum type; 
    } 

    public class ConcreteClass implements Generator { 
     private ConcreteClass() { 
     } 
     public static ConcreteClass createInstance() { 

     } 
    }  

我已經被省略參數。
我該如何將createInstance移動到界面上?

回答

0

一個接口沒有被設計成具有實現。對於Java 8,您可以使用默認方法,但接口知道實現類將是一個糟糕的主意。一個接口應該保持抽象,不知道它的子類。

如果ConcreteClass是不可改變的,你應該將其記錄下來,並確保有副作用每種方法不適用當前對象的任何修改,而是創造ConcreteClass一個新的實例。

例如,假設你要提供方法來更新values場,你可以在ConcreteClass提供這種方法:

public ConcreteClass withValues(int[] values){ 
    // copy all existing properties from the original to the copy but values 
    ConcreteClass copy = new ConcreteClass(values, this.indications, this.type);  
    return copy; 
} 

如果你想真正從ConcreteClass搬出實例創建,您可以創建一個工廠,提供這項服務。

+0

我在考慮是否將'createInstance()'作爲接口聲明的一部分移動到一個好的設計方法或不是。我只會定義方法而不是實際的實現 – Jim

+0

在接口中添加一個抽象方法來創建一個新的實例,假設接口知道約束實現(如必填字段),並且這不是一個好主意,或者是因爲它的耦合實現的接口。只有相反纔是真的。 – davidxxx

+0

然後,當我說接口定義的東西是不可變的,這是不正確的嗎?因此,如果我添加一個setter,無關緊要? – Jim