Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA:多个类中的静态字段+;公共接口_Java_Interface_Architecture_Static - Fatal编程技术网

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

JAVA:多个类中的静态字段+;公共接口,java,interface,architecture,static,Java,Interface,Architecture,Static,有没有办法在JAVA中设置以下构造: 具有公共接口或基类的 具有由公共接口声明的静态公共字段 实现公共接口的每个模型都应该有自己的静态字段(不是所有模型的一个共享实例) 详细说明: 我正在使用ORMLite,在反序列化之后,我需要刷新模型的外来集合。为此,我需要从模型中引用我的DAO,我不想这样做 因此,我提出了以下概念: 在以下接口的每个模型中保留一个静态字段: public interface SerializableObserver { void onAfterDeseriali

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

  • 具有公共接口或基类的
  • 具有由公共接口声明的静态公共字段
  • 实现公共接口的每个模型都应该有自己的静态字段(不是所有模型的一个共享实例)
详细说明: 我正在使用ORMLite,在反序列化之后,我需要刷新模型的外来集合。为此,我需要从模型中引用我的DAO,我不想这样做

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

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

    public interface SerializableObserver {
      void onAfterDeserialization(Object object);
    }
    
  • 在我的
    私有void readObject(java.io.ObjectInputStream stream)的实现中,在读取所有IVAR后抛出IOException、ClassNotFoundException
    ,我调用了模型中静态字段的
    反序列化后方法

    • 在Dao中,我正在设置模型的静态字段。因此,当反序列化完成时,将调用我的Dao中的方法。在这里,我可以最终刷新ForeignCollection,使其在反序列化后仍然有效
所以我要寻找的是某种方法,使整个方法更通用一些,这样,我就不必为我的20个模型都实现这种行为。
最后,这将是一个Android应用程序。所以没有什么特别的Java-8

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

< P>我将使用另一个类,它将模型类映射到串行化的观察者实现。 比如说,

反序列化映射:

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 );
    }

}

“Model”接口只是扩展了Serializable,并用于反序列化映射,但您只需去掉该接口并使用
ClassI就可以了。我不理解您的问题。虽然我觉得这有点有趣,但我们可以开始聊天吗?这就是我尝试过的。但据我所知,我不能为接口声明静态字段或方法。非常感谢,非常有用@Saschahard我在Upwork上发现了你的问题,你能接受一个建议吗?
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 );
    }
}
public interface Model extends Serializable{
}
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");
    }
}