Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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_Design Patterns_Anonymous Class - Fatal编程技术网

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创建一个具体的类,并将其保留在外部,同时仍然可以在主方法中使用object o
  • 另外,C2的实例应该是可序列化的,不幸的是对象o不可序列化。因此,我不想通过在构造函数中传递对象o来在C2中创建成员对象

  • 有什么想法吗?

    如果您希望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实例:

  • 在构造函数中传递它
  • 使用setter方法
  • 将其作为参数直接传递给
    delegateLogic
  • 你选择哪一个取决于很多事情


    请注意,在类的成员变量中存储对o的引用并不强制您序列化该引用。

    如果您想使此可序列化,您必须找到某种方法以可序列化的形式至少捕获
    o
    的相关部分。此外,我无法控制类的定义(可能的类)你能把o变成一个静态字段吗?关于你的第2点,把对o的引用传递给构造函数不会影响C2的可序列化性。决定你想考虑C2的可序列化状态是完全由你决定的。如果您确定o是暂时的,那么在序列化过程中不要将它流出来。如果现有的匿名
    C2
    实例也不可序列化(因为它已经包含对
    o
    的隐式引用),那么当您将其移到外部时,在这方面不会有任何更改。