【问题标题】:Java: Creating an instance of a local inner classesJava:创建本地内部类的实例
【发布时间】:2011-01-02 18:04:54
【问题描述】:

下面是一些演示我的问题的玩具代码。第一个是编译的版本,第二个是不编译的版本。

示例1中,为了创建InnerClass的实例,我必须在InnerClass的类定义下创建实例。这是有道理的,因为在类定义之上,InnerClass 是不可见的。但是,为了简洁起见,我想在 foo() 的顶部创建和使用 InnerClass 的实例。有没有办法在实际类定义之前动态定义 InnerClass,这样我的代码可能看起来更像 example 2 但会是合法的 Java?

示例 1

public class OuterClass {
    public void foo() {
        class InnerClass {  

            public InnerClass() {
                // do nothing.
            }

        }

        InnerClass in = new InnerClass(); // Defined below, and compiles!

    }
}

示例 2

public class OuterClass {
    public void foo() {

        InnerClass in = new InnerClass(); // Defined above, does not compile!

        class InnerClass {  

            public InnerClass() {
                // do nothing.
            }

        }

    }
}

【问题讨论】:

  • java 版本 "1.5.0_26" Java(TM) 2 Runtime Environment, Standard Edition
  • 在使用之前定义类有什么问题?我看不出你对第二个例子有什么好处,即使它有效。
  • 第二个例子没有太大的优势。我正在尝试学习 Java 的来龙去脉,我只是好奇。

标签: java scope inner-classes


【解决方案1】:

从概念上讲,本地类声明是一个声明。在执行语句之前,该类不存在。当它声明的范围结束时,该类也会消失。通常,本地类可能会引用其他本地范围名称,因此执行顺序很重要。

void f()
{
  if(true) 
      throw new Error();

  class InnerClass
  { 
    ... 
  }
}

在这个例子中,InnerClass 声明语句永远不会到达,所以这个类永远不会存在。事先引用它是没有意义的。

在使用之前声明一些东西总是一个好主意。在 Java 中,类可以具有循环依赖关系,因此 Java 必须允许突然引用类 - 但如果可以避免,请不要这样做。

【讨论】:

    【解决方案2】:

    您可以在方法之外定义内部类,例如

    public class OuterClass {
        public void foo() {
    
            InnerClass in = new InnerClass(); // Defined above, does not compile!
    
    
        }
    
        class InnerClass {  
            public InnerClass() {
                // do nothing.
            }
        }
    }
    

    【讨论】:

    • 这不能回答我的问题。我希望班级成为本地内部班级。如果你把它移到方法之外,那么它就不再是本地的了。
    • @Charlotte :根本无法在类声明之前创建本地内部类实例。您唯一的选择是您的第一个示例或 Rob 的答案(我绝对更喜欢,因为最终代码会更整洁)。
    【解决方案3】:

    为了整洁,听起来工作量很大。这是一个使用匿名内部类的技巧,它允许您声明一个具有您尚未定义的功能的类的实例,这有点类似于您想要的。

    请注意,限制是您必须在更早的地方定义接口或重用现有接口,如 Runnable。这是一个例子:

    public class OuterClass {
        public void foo() {
            // Declaration
            Runnable anonymous;
    
            // Implementation
            anonymous = new Runnable() {
                public void run() {
                    // do nothing.
                }
            };
    
            // Execution
            anonymous.run();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 2017-03-03
      相关资源
      最近更新 更多