JAVA:多个类中的静态字段+公共接口

时间:2017-07-01 21:00:44

标签: java interface architecture static

有没有办法在JAVA中设置以下构造:

  • 具有通用接口或基类
  • 具有由公共接口
  • 声明的静态公共字段
  • 实现公共接口的每个模型都应该有自己的静态字段(不是所有模型的一个共享实例)

详细说明: 我正在使用ORMLite,我需要在反序列化后刷新我的模型的ForeignCollections。为此,我需要从模型中引用我的DAO,这是我不想要的。

所以,我提出了以下概念:

  • 在以下界面的每个模型中保留一个静态字段:

    public interface SerializableObserver {
      void onAfterDeserialization(Object object);
    }
    
  • 在我阅读完所有ivars后我private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException的实现中我正在调用onAfterDeserialization - 静态字段的方法我在模型中持有。

    • 在Dao中,我设置了模型的静态字段。因此,当反序列化完成时,我的Dao中的方法被调用。我最终可以刷新ForeignCollection,以便在反序列化后它仍然有效。

所以我正在寻找的是某种方式使整个方法更加通用,所以我不必为所有20个模型实现这种行为。 最后,这将是一个Android-App。所以没有花哨的Java-8的东西。

2 个答案:

答案 0 :(得分:1)

我会使用另一个将Model类映射到SerializableObserver实现的类。 例如,

DeserializerMap:

public enum DeserializerMap {

    INSTANCE;

    private Map<Class<? extends Model>, SerializableObserver> modelObserverMap = new HashMap<>();

    public void registerSerializableObserver(Class<? extends Model> modelClass, SerializableObserver serializableObserver) {
        modelObserverMap.put( modelClass, serializableObserver );
    }

    public void deregisterSerializableObserver(Class<? extends Model> modelClass) {
        modelObserverMap.remove( modelClass );
    }

    public SerializableObserver getSerializableObserver(Class<? extends Model> modelClass){
        return modelObserverMap.get( modelClass );
    }

}

模特课:

public class ModelClass implements Model{

    private int id;

    public ModelClass(int id) {
        this.id = id;
    }

    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException{
        ois.defaultReadObject();
        DeserializerMap.INSTANCE.getSerializableObserver( this.getClass() ).
                onAfterDeserialization( this );
    }
}

&#34;模型&#34;接口只是扩展Serializable并在DeserializerMap中使用,但你可以摆脱界面并在DeserializerMap中使用Class<? extends Object>而不是Class<? extends Model>

型号:

public interface Model extends Serializable{
}

DAO班级:

public class DAOClass {

    public DAOClass(){
        SerializableObserver serializableObserver = new SerializableObserver() {
            @Override
            public void onAfterDeserialization(Object object) {
                System.out.println("After deserialization");
                anotherMethod();
            }
        };
        DeserializerMap.INSTANCE.registerSerializableObserver( ModelClass.class, serializableObserver );
    }

    public void anotherMethod(){
        System.out.println("another method");
    }
}

如果你不想做除了调用DAOClass方法之外的任何事情,那么你可以使用DAOClass类映射ModelClass,但我建议使用DAO只是为了与持久性系统进行通信并在主类中注册映射,不在DAOClass构造函数中。

答案 1 :(得分:0)

如果不了解细节,我可以提供以下内容: 使用接口来定义常用的行为,然后使用通用的抽象基类来定义公共结构。