为什么我要将私有构造函数与静态嵌套 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(..);
}
}
}
我目前正在深入研究 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(..);
}
}
}