首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAVA:多类+公共接口中的静态字段

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

Stack Overflow用户
提问于 2017-07-01 21:00:44
回答 2查看 361关注 0票数 0

是否有方法在JAVA中设置以下构造:

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

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

因此,我提出了以下概念:

  • 在以下接口的每个模型中保留一个静态字段: 公共接口SerializableObserver { void onAfterDeserialization(对象对象);}
  • private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException的实现中,在阅读了所有ivars之后,我调用了模型中所保存的静态字段的onAfterDeserialization-Method。
代码语言:javascript
复制
- In the Dao, I'm setting the static field of the model. So when the deserialization is finished, a method in my Dao is called. Where i can finally refresh the ForeignCollection so it's still valid after deserialization. 

所以我要找的是某种方法,使整个方法更加通用,所以,我不需要为我的20个模型实现这种行为。最后,这将是一个安卓应用程序。所以没有花哨的Java-8的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-02 08:43:06

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

DeserializerMap:

代码语言:javascript
复制
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 );
    }

}

模型类:

代码语言:javascript
复制
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 );
    }
}

“模型”接口只是扩展了可序列化的,并在DeserializerMap中使用,但是您可以摆脱这个接口,在DeserializerMap中使用Class<? extends Object>而不是Class<? extends Model>

型号:

代码语言:javascript
复制
public interface Model extends Serializable{
}

DAO类:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-07-02 08:16:35

在不了解细节的情况下,我可以提供以下内容:使用Interface来定义常见的行为,然后使用一个通用抽象基类来定义公共结构,这是您应该考虑的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44865368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档