Java:将匿名类带到外部
我的情况如下:Java:将匿名类带到外部,java,design-patterns,anonymous-class,Java,Design Patterns,Anonymous Class,我的情况如下: 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() {
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声明为瞬态。但是,您需要接受这样一个事实:如果o被序列化/反序列化,那么它将为null,除非您设法以某种方式手动序列化它
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
}
}
如果C2成为一个外部类,那么它必须以某种形式将对o的引用传递给它,以便在
delegateLogic
中使用它。实际上,只有3个选项可以将o引入C2实例:
delegateLogic
请注意,在类的成员变量中存储对o的引用并不强制您序列化该引用。如果您想使此可序列化,您必须找到某种方法以可序列化的形式至少捕获
o
的相关部分。此外,我无法控制类的定义(可能的类)你能把o变成一个静态字段吗?关于你的第2点,把对o的引用传递给构造函数不会影响C2的可序列化性。决定你想考虑C2的可序列化状态是完全由你决定的。如果您确定o是暂时的,那么在序列化过程中不要将它流出来。如果现有的匿名C2
实例也不可序列化(因为它已经包含对o
的隐式引用),那么当您将其移到外部时,在这方面不会有任何更改。