【问题标题】:Nested/Inner class in external file外部文件中的嵌套/内部类
【发布时间】:2011-09-07 07:18:10
【问题描述】:

我有一个类MyClass 和一个内部类MyNestedClass,如下所示:

public class MyClass {
  ...
  public class MyNestedClass {
    ...
  }
}

这两节课都很长。因此,我想将它们分成两个不同的文件,而不破坏层次结构。这是因为嵌套类不应该对使用 MyClass 的程序员可见。

有没有办法做到这一点?

【问题讨论】:

标签: java file external nested-class


【解决方案1】:

是的,使用级联跳线。级联跳线是在其他任何地方定义的抽象和非静态内部类。

MyClass.java

public class MyClass {
  public abstract class CascadeJumper {}
}

我的嵌套类

private class MyNestedClass extends MyClass.CascadeJumper {
  MyNestedClass(MyClass dollarOne) {
    dollarOne.super(); // yes, is possible!
  }
}

问候

【讨论】:

  • 我不明白这是怎么工作的。从MyNestedClass,您仍然只能访问MyClass 的公共方法和字段,就像从任何其他类一样。
  • @Alphaaa 不,您可以访问私有字段、私有枚举、私有类和私有方法、私有构造函数,以及来自MyClassMyNestedClass 的所有内容!试试看!
  • 我做到了,而你不能。事实上,即使是普通的内部类也不能这样:docstore.mik.ua/orelly/java-ent/jnut/ch03_13.htm。 Java 编译器实际上通过生成包私有方法来转换对外部类的私有字段的访问,并将任何直接字段访问替换为对这些生成的方法之一的调用。所有类实际上都是顶级的。
  • 这不起作用,虽然它看起来很酷。私有属性意味着它们只能从类中访问。当我的嵌套类是外部的时,它不起作用。这可能仅在我将计算外部类的必要属性引用为抽象嵌套超类的受保护属性时才有效。
【解决方案2】:

我认为您有一个上帝对象或类似的东西,请考虑重构您的代码

http://en.wikipedia.org/wiki/God_object

【讨论】:

  • 谢谢。这个评论让我意识到我应该重做我的工作。 :)
  • PS,其实不是。 :) 我只是看到我需要对我的班级负责。
【解决方案3】:

您可以创建在两者中扩展的抽象基类。

但是,如果这些类很大,您最好重新评估您的类设计,看看是否可以重构为每个代表一个关注点的类。

【讨论】:

    【解决方案4】:

    inner 类的对象保持对paren 类对象的隐式引用。 如果 nested 类不是 static(它是内部的),则不能。但是如果嵌套类不需要直接访问父类的实例并且不需要访问私有字段,那么应该可以重构,将内部类移出并not将其声明为public (出那个包是不能访问的)。

    【讨论】:

      【解决方案5】:

      您可以将内部类包设为私有,这意味着它只能从完全相同的包中的其他类访问。这对于标准 JDK 包中的隐藏类(如 java.langjava.util)也经常进行。

      在 pkg/MyClass.java 中

      public class MyClass {
        ...
      }
      

      在 pkg/MyHiddenClass.java 中

      class MyHiddenClass {
      
        final MyClass outer;
      
        MyHiddenClass( MyClass outer )
        {
            this.outer = outer;
        }
        ...
      }
      

      现在,当您想要访问外部类的方法或变量时,您需要在它们前面加上 outer.,但是当对外部实例的引用由编译器综合创建时,您将获得基本相同的功能。

      【讨论】:

      • 不过,从技术上讲,这仍然不是内部类。
      • MyClass 的私有属性不能从 MyHiddenClass 评估,MyHiddenClass 是受保护的,而不是私有的。
      【解决方案6】:

      没有。 Java 源代码不能跨多个文件拆分。您需要一个类似于 C# 中的分部类的构造,而 Java 没有。

      【讨论】:

        猜你喜欢
        • 2014-02-11
        • 2013-01-14
        • 2014-10-30
        • 1970-01-01
        • 2020-01-29
        • 1970-01-01
        • 1970-01-01
        • 2017-08-27
        • 1970-01-01
        相关资源
        最近更新 更多