匿名类和外部私有字段

时间:2014-10-11 09:01:21

标签: java swing field inner-classes anonymous-class

在方法中定义新的匿名类是否合法,然后将实例分配给外部类私有字段,如下面的代码中所述?我正在学习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 

3 个答案:

答案 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)

是的,这完全合法。在考虑这些访问规则时,需要记住几件事:

  1. 就目前情况而言,正如Eran所指出的那样,你有一个局部变量doSomething正在遮蔽你的场实例。您需要避免这种情况,否则您根本不会设置字段实例。
  2. 内部类可以访问外部类具有的所有内容,包括其private方法和字段。任何private只能在定义它的类中访问,但关键是内部类在外部类中。
  3. 内部类也可以访问在其外部定义的局部变量(只要它们在范围内),但必须声明它们final

答案 2 :(得分:1)

作为一般规则:如果编译,则允许。是的,允许将匿名类实例分配给私有字段。

但是在您的代码中,您没有为该字段分配任何内容。您需要按如下方式更正代码

public class Outer{
  private SwingWorker doSomething;

  public void functionOne(){
    //SwingWorker doSomething = ...;//incorrect
    doSomething = ...;//correct
  }
}

如果您想更清楚,可以随时使用

this.doSomething = ... ;

虽然一般情况下,IDE会通过调整文本颜色向您显示局部变量和字段之间的区别。

现在的问题是,这是一件好事。

  • 创建课程时,该字段的值为null
  • 您有一个公共方法,可以为字段分配值,可以在任何可能的时间调用该字段。您无法控制何时调用该方法。
  • 您可能有另一个(公共)方法将使用该字段。这意味着该方法必须能够处理null值,或者将变量实例化为默认值。

因此,您最终会得到一个具有公共方法的类,必须按特定顺序调用该类才能使类正常工作/按预期方式运行。这通常不是最好的设计选项,因为它很容易忘记排序并意外地以错误的顺序调用方法。