强制不变性并在接口声明中创建实例

时间:2017-04-02 14:01:56

标签: java api oop interface

我有一个接口,其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移动到界面?

1 个答案:

答案 0 :(得分: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移出实例,您可以创建一个提供此服务的工厂。