是否可以通过.THIS关键字指向匿名类?

时间:2016-03-11 08:24:00

标签: java this anonymous-class

SSCCE:

public class Test {
    public Test() {
        new Anonymous1() {
            void validate() {
                new Anonymous2() {
                    int calculate() {
                        return Math.abs(Anonymous1.this.getValue()); // compilation error - Anonymous1 is not an enclosing class
                    }
                };
            }
        };
    }
}

abstract class Anonymous1 {
    abstract void validate();

    int getValue() {
        return 0;
    }
}

abstract class Anonymous2 {
    abstract int calculate();
}

我知道它看起来很复杂且无法使用,但我只是想知道是否可以使用Anonymous1指针或其他任何方式从Anonymous2指向.this类。< / p>

1 个答案:

答案 0 :(得分:4)

你需要在课堂上这样做。

public Test() {
    new Anonymous1() {
        void validate() {
            final Object this1 = this;
            new Anonymous2() {
                int calculate() {
                    return Math.abs(this1.getValue()); 
                }
            }
        }
    }
}

甚至更好,首先提取您需要的东西并在Java 8中有效地使用最终添加。

public Test() {
    new Anonymous1() {
        void validate() {
            int value = getValue();
            new Anonymous2() {
                int calculate() {
                    return Math.abs(value); 
                }
            }
        }
    }
}

如果Anonymous1Anonymous2是接口,则可以在Java 8中使用lambdas。

public Test() {
   Anonymous1 a = () -> {
      int v = getValue();
      Anonymous2 = a2 = () -> Math.abs(v);
   };

}