6

代码风格很差,但有时不可避免。这是一个极端的例子。所以Java:限制嵌套类?

  1. 是否有一些嵌套类的限制?
  2. 它们是否等同?
  3. 你如何处理这种情况?创建图书馆?

代码

new FileObject().new Format().new Words().new Some().new Continue someThing; 

((((new FileObject()).new Format()).new Words()).new Some()).new Continue someThing; 
+6

它总是可以避免的 – Bozho 2010-05-02 08:39:46

+1

这是否提供的代码在语法上是正确的? – nmr 2012-02-15 00:14:37

+0

在某些代码生成环境中这是不可避免的。在设计不佳的模式文件中使用Jaxb时,我碰到了深度限制(幸运的是,我可以编辑它)。 – Spina 2012-08-15 14:06:28

回答

5

代码风格很差,但有时不可避免。

该声明的第二部分显然是虚假的。始终可以避免在实现级别使用嵌套类。

我能想到不明智设计理由嵌套命名类多个级别,和匿名类超过3或4级。 (我记得使用在非常复杂的回调Eclipse RCP应用程序3或4级匿名内部类的一次。但是,这是真的不正常了,现在回想起来,这是一个坏主意。)

1)嵌套类有一些限制吗?

理论上,限制是对完全限定类名的64K限制。在实践中,限制是常识。

2)它们是否相等?

他们?如果您问嵌套类是否与非嵌套类相同,那么对所有实际意图而言,答案都是肯定的。你可以用嵌套类做的唯一事情是你不能用常规类来做的事情,那就是共享声明为private的东西。解决方法是放松您对私人包的访问。

3)你如何处理这种情况?创建图书馆?

我不知道你在说什么情况。模块化由多个类组成的Java程序的正常方式是使用Java包而不是类嵌套。这是你所缺少的吗?

3

你给的例子都是非静态内部类。 (您需要一个包含类的对象来实例化嵌套类。)很少使用嵌套的非静态类。通常,您可以使用静态嵌套类或具有默认(包)范围的非嵌套类。

4

在字节码级别,不存在嵌套类的事情 - 编译器将它们变成单独的顶级类,它们可以通过综合访问器方法访问父类的方法。

嵌套深度没有明确限制。最相关的隐式限制是生成的.class文件的名称,该文件复制包含层次结构,即FileObject$Format$Words$Some$Continue.class。这将最终运行到文件名长度限制,这取决于文件系统。

+0

好的答案,但我认为访问器方法只有在嵌套类中的方法不是包私有时才会创建。 – helpermethod 2010-05-02 09:53:18

+0

@helpermethod - 这是不正确的。访问没有区别。也许你正在考虑“静态”。 – 2014-10-30 13:19:49

2

Inner Classes and Enclosing Instances(在langage规范中)中,嵌套类是一种静态内部类。

所以我想你的情况是内在的,不是嵌套的。因为我不喜欢新的Toto()。new Foo()...你获得一个foo对象,但是toto对象在哪里?

对于嵌套,我做了新的Toto.Foo.Bar.Other.And.So.On()。

5

太阳JVM具有65536个字节 编码为使用字符串一个完全限定类名 限制改性 UTF-8如在“类文件 格式”规范说明。它来自'u2' 容量(16位) - 来自常量池'CONSTANT_Utf8_info'结构的'长度'的类型 用于存储类 文件中的类名称。

maximum length for a java class name

此外,罐子格式(基于ZIP)具有最大文件名长度也64K。 (Wikipedia, ZIP, File headers

因此,类嵌套的限制是当名称达到64k时,但我认为您的理智可能在此之前就已达到极限!

+0

我的意思是说文件名的长度,这就是问题实质上是什么 - 类名可以多久。 zip格式将文件名限制为64k(不包括文件内容)。 – mdma 2014-10-30 20:10:13