有没有办法在JAVA中设置以下构造:
详细说明: 我正在使用ORMLite,我需要在反序列化后刷新我的模型的ForeignCollections。为此,我需要从模型中引用我的DAO,这是我不想要的。
所以,我提出了以下概念:
在以下界面的每个模型中保留一个静态字段:
public interface SerializableObserver {
void onAfterDeserialization(Object object);
}
在我阅读完所有ivars后我private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException
的实现中我正在调用onAfterDeserialization
- 静态字段的方法我在模型中持有。
所以我正在寻找的是某种方式使整个方法更加通用,所以我不必为所有20个模型实现这种行为。 最后,这将是一个Android-App。所以没有花哨的Java-8的东西。
答案 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)
如果不了解细节,我可以提供以下内容: 使用接口来定义常用的行为,然后使用通用的抽象基类来定义公共结构。