Java 中构造函数和静态工厂方法的区别
每当我们创建一个对象时,都会执行一些代码来执行该对象的初始化。这段代码只不过是一个构造函数,因此构造函数的主要目的是执行对象的初始化,而不是创建对象。让我们来看一下编写构造函数的基本规则。它们如下:
- 类的名称和构造函数的名称必须相同。
- 返回类型概念不适用于构造函数,甚至无效。错误的是,如果我们试图为构造函数声明返回类型,那么我们不会得到编译时错误,因为编译器把它当作一个方法。
- 构造函数唯一适用的修饰符是公共、私有、受保护和默认。如果我们试图使用任何其他修饰符,我们会得到一个编译时错误,这里不允许使用修饰符名称。
默认构造函数
编译器负责生成默认构造函数,但不负责生成 JVM。如果我们不编写任何构造函数,那么只有编译器会生成默认构造函数,也就是说,如果我们编写至少一个构造函数,那么 java 中的每个类都可以包含一个构造函数,它可以是编译器生成的默认构造函数,也可以是程序员显式提供的自定义构造函数,但不能同时包含两者。
默认构造函数的原型如下:
- 它总是一个无参数的构造函数
- 默认构造函数的访问修饰符与类的访问修饰符完全相同。
- 它只包含一行 super(),是对超类构造函数的无参数调用。
静态工厂方法
通过使用类名,如果我们调用一个方法,如果该方法返回相同的类对象,那么这种类型的方法称为静态工厂方法。静态工厂方法是返回本机类实例的方法。与构造函数不同,静态工厂方法有明确代码的名称。在静态工厂方法中,我们不需要在每次调用时创建一个新的对象,也就是说,如果需要,对象可以被缓存和重用。我们也可以返回它们返回类型的子类型。
每个构造函数内部的第一行应该是 super() 或者 this() 如果我们没有写任何东西,那么编译器将总是放置 super()
示例:
Java 语言(一种计算机语言,尤用于创建网站)
// Java Program to showcase Difference Between
// Constructor and Static Factory method
// Importing all utility classes from
// java.util package
// Importing all input output classes
import java.io.*;
import java.util.*;
// Main class
// To find out complex number
public final class GFG {
// Method 1
// Static factory method returns an object of this
// class.
public static GFG valueOf(float real, float imaginary)
{
return new GFG(real, imaginary);
}
// Caller cannot see this private constructor.The only
// way to build a GFG is by calling the static factory
// method.
// Constructor
private GFG(float real, float imaginary)
{
// This keyword refers to current object itself
this.real = real;
this.imaginary = imaginary;
}
private float real;
private float imaginary;
// Method 2
// Main driver method
public static void main(String[] args)
{
// Creating an object of GFG and
// calling an static factory method valueOf()
GFG n = GFG.valueOf(2, 4);
// Print and display the complex number
System.out.println(n.real + "+" + n.imaginary
+ "i");
}
}
输出:
因此,从上面的文章中,我们可以清楚地得出它们之间的区别如下:
| 构造器 | 静态工厂方法 | | --- | --- | | 构造函数没有有意义的名称,所以它们总是被限制在标准的命名约定中 | 静态工厂方法可以有一个有意义的名字,因此我们可以明确地表达这个方法的作用。 | | 构造函数不能有任何返回类型,甚至不能是 void。 | 静态工厂方法可以返回实现方法的相同类型、子类型以及原语。 | | 在构造函数内部,我们只能执行对象的初始化。 | 除了初始化之外,在静态工厂方法中,如果我们想要为每个对象创建执行任何活动,比如为每个对象创建增加计数值,我们可以在静态工厂方法中这样做。 | | 构造函数总是在堆中创建一个新对象,因此不可能从构造函数返回类的缓存实例。 | 但是工厂方法可以利用缓存,即我们可以从工厂方法返回不可变类的相同实例,而不是总是创建一个新对象。 | | 每个构造函数中的第一行应该是 super()或 this() | 但是在工厂方法内部,第一行不一定必须是 super()或 this() |版权属于:月萌API www.moonapi.com,转载请注明出处