【问题标题】:Anonymous class and outter private field匿名类和外部私有字段
【发布时间】:2014-12-06 10:04:50
【问题描述】:

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

【问题讨论】:

  • 你试过了吗?编译器是怎么说的?
  • “然后将匿名类的实例分配给外部类的私有字段”-> 我看不到您在示例中这样做。您在“functionOne()”中使用了一个新的局部变量

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


【解决方案1】:
 public void fuctionOne(){
    Swingworker doSomething = new SwingWorker<int, Void>(){
        protected int DoInBackground(){...

您在这里定义和初始化一个局部变量,而不是分配给Outer 类的成员。

如果你想初始化OuterdoSomething成员,做

 public void fuctionOne(){
    doSomething = new SwingWorker<int, Void>(){
        protected int DoInBackground(){...

通常,您不必在构造函数中初始化类的所有成员。如果您不初始化它们,它们将获得默认值(在引用类型的情况下为null)。您只需确保在实际使用它们之前对其进行初始化。

【讨论】:

  • 谢谢!对不起,我没有得到区别。将它分配给 Outer 类的私有字段是什么情况?
  • @user4056620 正如我所写的,完全没问题。
  • 啊,我明白了!谢谢老兄。
【解决方案2】:

是的,这是完全合法的。在考虑这些访问规则时,需要牢记以下几点:

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

【讨论】:

  • 谢谢!所以我这样做的方式是使 doSomething 成为局部变量。但是对于在这种情况下像 SwingWorker 这样的内部类,它可以是一个私有类变量,因为我们可能需要在其他类中创建一个 Outer 的实例?
  • 是的,当然。您的代码中有一个实例字段和一个局部变量。如果你想在实例字段中删除局部变量。
【解决方案3】:

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

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

public class Outer{
  private SwingWorker doSomething;

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

如果你想让这个更清楚,你可以随时使用

this.doSomething = ... ;

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

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

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

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

【讨论】:

  • 很好解释。加上文字颜色提示真的很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 2021-06-14
  • 2012-01-15
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多