Java 中的私有构造函数
构造函数是类中最重要的部分之一,因为它是第一个执行的部分,它使我们能够在类中的任何内容之前传递需要初始化的参数。
通常,我们创建一个带有 public 修饰符的构造函数,以便可以在任何函数中创建对象,但是在某些情况下我们希望将其设为私有,这就是我们将在以下部分中看到的内容。
在 Java 中定义私有构造函数
在本节中,我们尝试使用私有构造函数创建一个类的对象。
该程序有两个类,ExampleClass2
和 AnotherClass
。AnotherClass
有一个带有私有修饰符和 print
语句的构造函数。
当我们在 ExampleClass2
类中创建此类的对象时,我们会收到一条错误消息,指出 AnotherClass
具有私有访问权限。
它限制了对构造函数的访问,并且在某些方面很有用,我们将在本教程的下一部分中看到。
public class ExampleClass2 {
public static void main(String[] args) {
AnotherClass anotherClass = new AnotherClass();
}
}
class AnotherClass {
private AnotherClass() {
System.out.println("This is a private constructor.");
}
}
输出:
java: AnotherClass() has private access in com.tutorial.AnotherClass
在 Java 中使用单例模式的私有构造函数
我们使用单例模式在整个程序中只创建一个类实例。由于几乎可以从项目中的任何地方访问公共构造函数,我们使用私有构造函数。
我们使用私有构造函数创建一个类 AnotherClass
,该构造函数在下面的程序中显示一条消息。我们需要一个返回类实例的函数,因此我们创建了一个名为 getInstance()
的函数,该函数是公共且静态的,可以在不创建对象的情况下调用。
在 getInstance()
方法中,我们返回 new AnotherClass()
并将返回类型设置为 AnotherClass
。我们创建另一个函数来测试我们是否可以调用实例的方法。
现在我们调用返回 AnotherClass
实例的 getInstance()
函数,并使用该实例调用 dummyMethod()
。
public class ExampleClass2 {
public static void main(String[] args) {
AnotherClass anotherClass = AnotherClass.getInstance();
anotherClass.dummyMethod();
}
}
class AnotherClass {
private AnotherClass() {
System.out.println("This is a private constructor.");
}
public static AnotherClass getInstance() {
return new AnotherClass();
}
public void dummyMethod() {
System.out.println("This is just a dummy method");
}
}
输出:
This is a private constructor.
This is just a dummy method
在 Java 中使用构建器模式的私有构造器
私有构造函数的另一个用例是我们在程序中使用构建器模式。我们在下面的代码中创建了一个具有三个类变量 firstName
、lastName
和 age
的 User
类。
我们在构造函数中初始化所有这些变量并使构造函数私有。
我们还制作了一种打印值的方法。我们创建一个名为 BuilderClass
的内部类来在 User
类中构建对象。
BuilderClass
是公共的,因为另一个类可以访问它。
我们在 BuilderClass
类中创建三个变量来设置 User
类的变量。我们创建 setter 方法来设置值,然后将值返回 this
。
我们通过创建 buildObject()
方法返回带有值的对象,该方法返回带有已设置的新值的 User
对象。
现在在 ExampleClass2
类中,我们得到 BuilderClass()
类,因为它是公共的。然后,我们使用 UserBuilder
对象使用它的 setter 方法设置值,然后调用返回 User
对象的 buildObject()
方法。
我们通过调用 getUserDetails()
函数来打印这些值。
public class ExampleClass2 {
public static void main(String[] args) {
User.BuilderClass userBuilder = new User.BuilderClass();
User getUser = userBuilder.setFirstName("Micheal").setLastName("Fisk").setAge(26).buildObject();
getUser.getUserDetails();
}
}
class User {
private final String firstName;
private final String lastName;
private final int age;
private User(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public void getUserDetails() {
System.out.println("First Name: " + firstName);
System.out.println("Last Name: " + lastName);
System.out.println("Age: " + age);
}
public static class BuilderClass {
private String firstName;
private String lastName;
private int age;
BuilderClass setFirstName(String firstName) {
this.firstName = firstName;
return this;
}
BuilderClass setLastName(String lastName) {
this.lastName = lastName;
return this;
}
BuilderClass setAge(int age) {
this.age = age;
return this;
}
public User buildObject() {
return new User(firstName, lastName, age);
}
}
}
输出:
First Name: Micheal
Last Name: Fisk
Age: 26
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn