2011-06-02 54 views
31

嵌套/内I类有一个类MyClass和一个内部类MyNestedClass这样的:在外部文件

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

两个类都非常长。正因为如此,我想用两个不同的文件将它们分开,而不会破坏层次结构。这是因为使用MyClass的程序员不应该看到嵌套类。

有没有办法做到这一点?

+0

类似的问题的http://计算器。com/questions/2764234/partial-classes-partial-class-file – Terrance 2011-06-02 18:42:28

+0

我有一个类似的问题,并在这里解决它:http://stackoverflow.com/q/27284667/1190665 至少这是我想出的最好的。 – John 2014-12-04 01:34:03

回答

20

您可以将内部类包私有化,这意味着它只能从完全相同包中的其他类访问。对于标准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.前缀他们的外部类的方法或变量但是当您对外部实例的引用由编译器合成创建时,您将获得与之前基本相同的功能。

+0

谢谢,是这样。 – Alp 2011-06-03 10:06:27

+7

虽然这在技术上并不是内在的一类。 – AJMansfield 2013-04-18 11:13:09

+5

'MyClass'的私有属性将不能从MyHiddenClass中进行评估,并且MyHiddenClass受到保护,而不是私有属性。 – SparK 2013-10-16 17:22:22

6

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

+0

是否有另一种方法可以让程序员隐藏课程? – Alp 2011-06-02 18:41:22

+0

当然,请参阅下面的答案。 – retrodrone 2011-06-02 18:43:59

4

对象内部类保持隐式引用paren类的对象。 如果嵌套类不是static(它是内部的),你不能。但是,如果嵌套类不需要直接访问父类的实例并且不需要访问私有字段,那么应该可以重构,将内部类移出并执行而不是将其声明为公共(在该包之外无法访问)。

+0

感谢解释 – Alp 2011-06-03 09:54:05

1

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

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

2

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

MyClass.java

public class MyClass { 
    public abstract class CascadeJumper {} 
} 

MyNestedClass.java

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

问候

+0

我不明白这是如何工作的。从'MyNestedClass'中,您将只能访问MyClass的公共方法和字段,与其他任何类一样。 – Alphaaa 2016-11-22 10:07:56

+0

@Alphaaa Nope,你可以访问私有字段,私有枚举,私有类和私有方法,私有构造函数,只需从'MyNestedClass'中的'MyClass'的所有内容!尝试一下! – 2016-11-22 18:02:12

+0

我做了,你不能。实际上,即使正常的内部类也不能根据这个:http://docstore.mik.ua/orelly/java-ent/jnut/ch03_13.htm。 java编译器实际上通过生成包私有方法将访问转换为外部类的私有字段,并通过调用其中一个生成的方法来替代任何直接字段访问。所有课程实际上都是顶级课程。 – user2219808 2017-02-26 13:59:39