Java:带匿名class出门
Java: Take anonymous class outside
我的情况如下:
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 创建一个具体的 class 并将其保存在外部,同时仍然可以在 main 方法中使用对象 o。
- 此外,C2 的实例应该是可序列化的,不幸的是对象 o 是不可序列化的。所以,我不想通过在构造函数中传递对象 o 在 C2 中创建成员对象。
有什么想法吗?
如果你想让C2能够被序列化,只要将o声明为transient即可。但是,您需要接受这样一个事实,即 o 如果得到 serialized/deserialized 则将为空,除非您设法以某种方式手动序列化它。
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 成为外部 class,那么它必须以某种形式将对 o 的引用传递给它,以便在 delegateLogic
中使用它。您实际上只有 3 个选项可以让 o 进入您的 C2 实例:
- 在构造函数中传递它
- 使用setter方法
- 直接将其作为参数传递给
delegateLogic
您选择哪一个取决于很多因素。
请注意,在 class 的成员变量中存储对 o 的引用不会强制您序列化该引用。
我的情况如下:
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 创建一个具体的 class 并将其保存在外部,同时仍然可以在 main 方法中使用对象 o。
- 此外,C2 的实例应该是可序列化的,不幸的是对象 o 是不可序列化的。所以,我不想通过在构造函数中传递对象 o 在 C2 中创建成员对象。
有什么想法吗?
如果你想让C2能够被序列化,只要将o声明为transient即可。但是,您需要接受这样一个事实,即 o 如果得到 serialized/deserialized 则将为空,除非您设法以某种方式手动序列化它。
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 成为外部 class,那么它必须以某种形式将对 o 的引用传递给它,以便在 delegateLogic
中使用它。您实际上只有 3 个选项可以让 o 进入您的 C2 实例:
- 在构造函数中传递它
- 使用setter方法
- 直接将其作为参数传递给
delegateLogic
您选择哪一个取决于很多因素。
请注意,在 class 的成员变量中存储对 o 的引用不会强制您序列化该引用。