2009-11-23 95 views
8

Kushal Paudyal在Java中询问how deep you can nest inner classes。共识是,虽然语言本身没有限制,但底层操作系统和文件系统可能会有所限制。嵌套Java内部类超过一个级别是否合理?

你有没有发现两层或多层嵌套的内部类有帮助的情况?

更新(11/28):如果你考虑枚举类,嵌套的第二个层次是有意义的。在最近的一些重构过程中,我简要地拥有了一个外部类(一个HTTP客户端),一个内部类(内存中的缓存)以及内部类内部的一个枚举类(用于缓存驱逐策略)。这似乎没问题,但对@Thorbjørn来说,我继续从HTTP客户端类中提取缓存类和内部枚举。

回答

4

不,我没有。

一个类中的一类标准的例子是建造,在那里你有一个子类,以帮助创造赋予了很多可能的配置方法,适当的实例。

就我个人而言,我会考虑更复杂的嵌套类的情况下需要重构代码的一个很好的例子。

+0

我倾向于同意。 – 2009-11-23 22:09:54

+0

请注意,我不考虑匿名课程。如果您需要“轻松”访问外部变量,则这是一种必要的痛苦。然而,我强烈认为另一个匿名类是代码味道。 – 2009-11-24 09:25:17

3

我还没有亲自遇到多个证明有必要的情况。我可以预见一个可能证明有用的情况。不过,我想象不止两个。

我想象的例子是Java GUI代码。在某些情况下,将一个类嵌套在已嵌套的ActionListener中可能会很有用。

1

好的 - 有时候这是有效的。我刚刚做了几分钟前。

例如,在一些测试代码,我写的,我想建立一些样板是处理运行多个可调用。创建可调用代码块的多个实例所需的样板文件。在这个例子中,我创建了一个工厂实例以传递到threadedTest,并且该工厂创建了新的可调用对象。

@Test public void testXXXXXXXX() throws Throwable { 
    threadedTest(new CallableFactory() { 
     @Override public Callable<Request> create() { 
      return new Callable<Request>() { 
       // might have state 
       @Override public Request call() throws Exception { 
        // do the steps for this test 
        return ...; 
       }}; 
     }}); 
} 

比创建两个只创建另一个类的新类更简洁。当然,直到你习惯的样式这里的可读性点球,但...

如果结合这与模板的方法来控制交易或数据库连接/关闭,这可能最终会深三。 (我有这样的一些代码,如果你这样做,确保你在你的评论写一个虚拟样品,并解释结构井)

+1

这些是匿名的内部类,不是嵌套的内部类。这两个概念在http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html – 2009-11-23 23:33:31

+0

中的处理方式不同。上面的代码很容易就是嵌套类,尽管我不想写它方式;) – 2009-11-30 22:29:40

+1

他们可以,但他们不是。 – 2011-06-04 11:14:13

2

如果你从一些数据生成代码,嵌套类可以是避免名称冲突的好方法。

2

我看到使用嵌套类的层数。

有一个名为串联(惠普)的传统机器,原来运行COBOL/C的代码。有一些后来的“补丁”也启用了运行java的机器。 COBOL的变量结构自然是多层次的(即使是5个层次也是常见的情况),所以为了让Java调用COBOL服务器,java类也被多层次化,以简化它们之间的数据转换。

我同意这是一个非常罕见的情况,但无论如何...

2

我知道我在回收旧线程,但它是新的给我:)

我们使用多层次的为我们的POJO的反序列化JSON(杰克逊)。这里是JSON,我们可以从一个RESTful Web服务得到一个很小的例子(由):

{ success: true, response: { 
    sales: { item: "123", sales: 3, returns: 1 }, 
    inventory: { item: "567", qty: 100 } 
    } 
} 

我们曾经有过设立类似的POJO:

public class Json1 { 
    private boolean success; 
    private JsonResponse response; 
} 
public class Json1Response { 
    private JsonResponseSales sales; 
    private JsonResponseInventory inventory; 
} 
public class Json1ResponseSales { 
    private String item; 
    private int sales; 
    private int returned; 
} 
public class Json1ResponseInventory { 
    private String item; 
    private int qty; 
} 

我们有很多的这些,并为我们可能提出的每个Web服务请求提供一个POJO。这种布局给了我们一些小问题:

  1. 请注意,这一个,相对简单的例子给了我们四个类文件来跟上。现在再乘以100秒,然后是“难度系数”为3,以说明大多数JSON比这更混乱。成千上万的文件。

  2. 字段名称在整个地方重复使用,并且根据哪个Web服务,相同的字段名称可能具有不同的内容。 (试想一下,数量可能会回来从一个web服务的字符串,从另一个诠释,再乘上100秒)。

因为这些东西捆绑在一起的父/子关系,我们决定一起去这个布局来代替。

public class Json1 { 
    private boolean success; 
    private JsonResponse response; 

    public class Json1Response { 
    private JsonResponseSales sales; 
    private JsonResponseInventory inventory; 

    public class Json1ResponseSales { 
     private String item; 
     private int sales; 
     private int returned; 
    } 

    public class Json1ResponseInventory { 
     private String item; 
     private int qty; 
    } 
    } 
} 

在这种情况下,我嵌套了两个深,但它可能更多。也许最多四层。