为什么在类中有公共静态类

时间:2012-08-22 16:57:29

标签: java nested-class

我正在阅读一些代码,我看到了这个:

public class A {
    public A(SomeObject obj) {
      //Do something
    }
    //Some stuff
  public static class B {
    //Some other stuff
  }
}

我想知道,因为即使内部类是public,为什么要将它作为嵌套而不是单独的类? 另外,我可以在这里执行此操作:new A.B(SomeObject)?我觉得这会破坏静态类的目的,但我也看到了这个实现,所以想知道。

6 个答案:

答案 0 :(得分:18)

  

我想知道,因为即使内部类是公开的,为什么将它作为嵌套而不是单独的类?

要问谁上课,这真的是个问题。它可以允许外部类充当“迷你命名空间” - 如果嵌套类在外部类的上下文中有用,那么它似乎是合理的。它表明两个阶级之间故意紧密耦合。我经常在构建器模式的上下文中看到这个:

Foo foo = new Foo.Builder().setBar(10).build();

在这里,让Foo.Builder嵌套在Foo内而不是作为一个可能被称为FooBuilder的同伴类是有意义的。

请注意,与仅不相关的类相比,它还提供了一些可见性差异。

  

另外,我可以在此处执行此操作:new A.B(SomeObject)

不,因为B没有带SomeObject参数的构造函数 - 只有A(在您给出的示例中)。

  

我觉得这违背了静态类的目的

你应该尝试完全你认为静态类的目的是什么,以及以什么方式破坏了这个目的。目前,这个陈述过于含糊,无法进行实际讨论。

答案 1 :(得分:5)

你会有一个像这样的内部类

  • 你可以保留一个只存在的类来支持封装的外层类。
  • 您希望能够访问外部类的private成员或其他嵌套类。
  • 你想要一个带有静态字段的嵌套类(我知道这个弱的原因;)
  • 你有一个非常通用名称的类,如LockSync,你不希望它与同一个包中的类所使用的同名的其他类混合。
  

我可以在这里这样做:新的A.B(SomeObject)?

你可以。

  

我觉得这违背了静态类的目的

需要习惯,但一旦你开始,你可能会有麻烦不把你的整个程序变成一个file.java;)

答案 2 :(得分:2)

我很想知道,即使内部类是公开的,为什么要将它作为嵌套而不是单独的类?

看一下这个主题:Why strange naming convention of "AlertDialog.Builder" instead of "AlertDialogBuilder" in Android

另外,我可以在这里这样做:新的A.B(SomeObject)?

(更新)不,你不能这样做,因为B没有要求SomeObject的构造函数。

我希望这会有所帮助。

答案 3 :(得分:2)

1。 static inner班级称为Top-Level班级。

2。static class 直接访问至其外部类静态方法和变量。

3。您需要从外部以这种方式初始化static Inner class ...

    A a = new A();
    A.B b = new A.B();

4。 new A.B(SomeObject) 无效 ...因为您没有{{1的构造函数作为参数......

5. 但是当Inner类是非静态的,那么它有对Outer类的隐式引用。

6。外部和内部类可以扩展到不同的类

7。 SomeObject可以使用内部类以不同或相同的方式实施多次

答案 4 :(得分:2)

此模式经常与构建器模式一起使用。它不仅清楚了类和它的构建器之间的关系,而且还隐藏了丑陋的构建器/工厂,使构建器更具可读性。例如,如果您需要构建的对象具有可选属性而非可选属性。

public class AnObject {
   public static class AnObjectBuilder {

       private AnObject anObject;

       private AnObjectBuilder() {
       }

       private void newAnObjectWithMandatory(String someMandatoryField, ...) {
           anObject = new AnObject(someMandatoryField,...)
       }

       public AnObjectBuilder withSomeOptionalField(String opt) {
           ...
       }
   }

   public static AnObjectBuilder fooObject() {
        return (new AnObjectBuilder()).newAnObjectWithMandatory("foo")
   }

   public static AnObjectBuilder barObject() {
        return (new AnObjectBuilder()).newAnObjectWithMandatory("bar")
   }
}

这样客户端代码必须首先调用AnObjectBuilder类上的静态方法,然后使用可选的构建器方法:

AnObject.fooObject("foo").withSomeOptionalField("xxx").build();,但未创建构建器对象。

非常易读:)

答案 5 :(得分:0)

  

我很想知道,即使内心阶级是公开的,为什么还要这样做   嵌套而不是单独的类?

允许的简单原因是包装方便。

Static nested class in Java, why?

http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

是的,你可以做新的A.B(SomeObject)。但你不必接受我的话,试一试。