我遇到了如下情况:
Class C1 {
public static void main(String[] args) {
Object o = // new object of some class
delegate(new C2() { // C2 is an abstract class or interface
public void delegateLogic() {
Object my_o = o; // refrences main's local variable
// huge method body
// object o local to main is required here
}
});
}
private void delegate(C2 c2) {
// method body
}
}
delegateLogic()的主体变得非常大。对于代码可维护性:
- 我想从C2创建一个具体的类,并保持它在外面,同时仍然有一种方法在主方法中使用对象o。
- 同样,C2的实例应该是可序列化的,不幸的是对象0不是可序列化的。因此,我不想通过在构造函数中传递对象o来创建C2中的成员对象。
任何想法?
如果C2成为一个外部类,那么它必须以某种形式将0的引用传递给它,以便在delegateLogic
中使用它。您实际上只有3个选项来进入C2实例:
- 在构造函数 中传递
- 使用setter方法
- 直接将其作为参数传递给
delegateLogic
你选择哪一个取决于很多事情。
注意,在类的成员变量中存储对0的引用并不强制您序列化该引用。
如果您希望C2能够被序列化,只需将o声明为transient。然而,您需要接受这样一个事实:如果0被序列化/反序列化,它将为空,除非您设法以某种方式手动序列化它。
public class X extends C2 {
private transient Object o;
public X(Object o) {
this.o = o;
}
public void delegateLogic() {
Object my_o = o; // refrences main's local variable
// huge method body
// object o local to main is required here
}
}