为什么我要将私有构造函数与静态嵌套 class 结合起来?

Why would I combine a private constructor with a static nested class?

我目前正在深入研究 Java classes 的可访问性。虽然 define classes 有多种可能性,但我想知道下面示例的用例。

基本上,AnotherClass 的构造函数是私有的。然而,AnotherClass 有一个 static 嵌套 class,可以在 PublicClass class.

中访问

这只是我出于好奇想出的东西,但由于它确实有效,我想知道,为什么我会使用这样的东西?

例子

public class PublicClass {  
    public PublicClass() {
        AnotherClass.AnotherInnerClass innerClass = new AnotherClass.AnotherInnerClass();
        innerClass.anotherTest();
    }
}


class AnotherClass{
    /**
     * Private constructor - class cannot be instantiated within PublicClass.
     */
    private AnotherClass(){

    }

    /**
     * Static inner class - can still be accessed within package.
     */
    static class AnotherInnerClass{
        public void anotherTest(){
            System.out.println("Called another test.");
        }
    }
}

注意那些class在同一个文件中。

输出

Called another test.

AnotherInnerClass可以使用AnotherClass的私有构造函数。这用于 Builder pattern 中的示例,类似于以下内容:

public class Foo {  
    public Foo() {
        Bar.Builder barBuilder = new Bar.Builder();
        Bar bar = barBuilder.build();
    }
}


public class Bar{
    private Bar(..){

    }

    static class Builder{
        public Bar build(){
            return new Bar(..);
        }
    }
}