声明一个类并将其一次性内联分配的语法是什么?
编辑:我已经更新了我的问题 - 我需要通过将一些变量传递给构造函数来自定义已实现方法的行为。即
Foo foo = new Foo(int a) implements Bar {
int a;
public Foo() {
this.a = a;
}
// Bar's method
void xyz() {
if (this.a == ... ) ...
}
};
答案 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 == ... ) ...
}
}