在方法中定义新的匿名类是否合法,然后将实例分配给外部类私有字段,如下面的代码中所述?我正在学习Java,并试图了解这背后的原因。谢谢!
public class Outer{
private int id;
private String name;
private SwingWorker doSomething; //Is it ok not to include it in the constructor?
public Outer (int id, String name){
//constructor, but didn't include the instance doSomething
}
public void fuctionOne(){
Swingworker doSomething =new SwingWorker<int, Void>(){
protected int DoInBackground(){
...........// created an anonymous class and override methods
答案 0 :(得分:2)
public void fuctionOne(){
Swingworker doSomething = new SwingWorker<int, Void>(){
protected int DoInBackground(){...
您在这里定义和初始化局部变量,而不是分配给Outer
类的成员。
如果您要初始化doSomething
的{{1}}成员,请执行
Outer
通常,您不必在构造函数中初始化类的所有成员。如果不初始化它们,它们将获得默认值(在引用类型的情况下为 public void fuctionOne(){
doSomething = new SwingWorker<int, Void>(){
protected int DoInBackground(){...
)。您只需确保在实际使用它们之前对其进行初始化。
答案 1 :(得分:1)
是的,这完全合法。在考虑这些访问规则时,需要记住几件事:
doSomething
正在遮蔽你的场实例。您需要避免这种情况,否则您根本不会设置字段实例。private
方法和字段。任何private
只能在定义它的类中访问,但关键是内部类是在外部类中。final
。答案 2 :(得分:1)
作为一般规则:如果编译,则允许。是的,允许将匿名类实例分配给私有字段。
但是在您的代码中,您没有为该字段分配任何内容。您需要按如下方式更正代码
public class Outer{
private SwingWorker doSomething;
public void functionOne(){
//SwingWorker doSomething = ...;//incorrect
doSomething = ...;//correct
}
}
如果您想更清楚,可以随时使用
this.doSomething = ... ;
虽然一般情况下,IDE会通过调整文本颜色向您显示局部变量和字段之间的区别。
现在的问题是,这是一件好事。
null
null
值,或者将变量实例化为默认值。因此,您最终会得到一个具有公共方法的类,必须按特定顺序调用该类才能使类正常工作/按预期方式运行。这通常不是最好的设计选项,因为它很容易忘记排序并意外地以错误的顺序调用方法。