java内联类声明和分配

时间:2015-10-22 16:27:30

标签: java

声明一个类并将其一次性内联分配的语法是什么?

编辑:我已经更新了我的问题 - 我需要通过将一些变量传递给构造函数来自定义已实现方法的行为。

Foo foo = new Foo(int a) implements Bar {
     int a;

     public Foo() {
        this.a = a;
     }

     // Bar's method
     void xyz() {
         if (this.a == ... ) ...
     }
};

2 个答案:

答案 0 :(得分:5)

您所描述的是 anonymous class ,因此在声明变量时您无法使用该名称,因为官方它没有名称。 (在封面下,作为实现细节,它确实如此。)

要声明变量,通常使用接口或基类,实现/子类化作为类型,例如:

Bar foo = new Bar() {
    @Override
    void someRelevantMethod() {
        // ...
    }
};

重新评论:

  

我需要将params传递给Bar,因此我需要Fo中的构造函数

然后你需要使用 inner class 而不是匿名的,因为匿名类can't have an explicit constructor

但是你可能需要一个构造函数,因为:

  • 匿名类可以访问其封闭实例的实例字段。

  • 匿名类关闭您创建它们的范围内的final个变量。

因此,例如,如果您用来修改基类的行为的变量不会更改,只需在封闭范围内声明它们final,给它们值,并在实现中使用这些值。或者,如果它们发生变化,但它们是封闭类中的实例字段,则直接使用它们。

但是如果值发生变化并且无法从封闭类的实例字段中获得,那么您将需要内部类(甚至可能是static nested class或独立类)。

答案 1 :(得分:1)

可以做您需要做的事情。你不能按照你认为应该这样做的方式去做。 (经典XY问题。)

可以访问Bar中重写方法中的值,您只能使用由构造函数初始化的实例变量来执行此操作。

就这样做:

final int aInFoo = a;
Bar foo = new Bar {
    // Bar's method
    void xyz() {
        if (aInFoo == ... ) ...
    }
};

或者,如果您a的价值可以在Foo内更改,请尝试这样:

final int aInFoo = a;
Bar foo = Bar {
    int a1 = aInFoo;

    // Bar's method
    void xyz() {
        if (this.a1 == ... ) ...
    }
};

但是如果你得到那么复杂的话,你最好不要使用一个命名的类,也许是一个命名的内部类,而不是一个匿名类。怎么做?

Foo foo = new Foo(a);

// later in the same file...
class Foo implements Bar {
    int a;
    Foo(int a) {
        this.a = a;
    }

    // Bar's method
    void xyz() {
        if (this.a == ... ) ...
    }
}