使用新的vs创建对象

时间:2019-01-23 02:37:37

标签: java lombok

在执行任务期间,我看到其他开发人员,他们使用@AllArgsConstructor(access = AccessLevel.PRIVATE)创建了一个类,该类将类构造函数设为私有。然后,他们改为使用of创建一个对象。
使用newof创建之间有什么区别?

A a = new A();
A a =  A.of();


@AllArgsConstructor(access = AccessLevel.PRIVATE)
@EqualsAndHashCode
    public class A
    {
        @NonNull
        String data;

        public static A of() 
        {
            return new A();
        }

    }

2 个答案:

答案 0 :(得分:2)

随着时间的流逝,很明显,由于您没有在调用中命名参数,因此如果可选值的类型相同,则很难使用各种方法来创建对象。

一个(相当愚蠢的)示例是Person类,该类可能仅允许指定名字或姓氏。在这种情况下,以下构造函数将无法工作:

Person(String firstName, String lastName)

Person(String firstName)

Person(String lastName)

第一个很好,但是其他两个存在冲突,并且无法解决,因为您无法命名构造函数或参数。

使用静态工厂方法可以在必要时命名方法:

Person of(String firstName, String lastName)

Person ofFirstName(String firstName)

Person ofLastName(String lastName)

在不需要命名时使用常规of。仍然可以以重载构造函数的相同方式来重载,例如您可能还会:

Person of(String firstName, String lastName, int age)

尽管不经常用于类,但如果认为有必要,工厂方法也可能返回子类。

对于接口,这样的工厂方法对于实例化实现接口的对象非常方便,而不是将工厂方法放在不同的类中。

在接口静态方法之前,JDK实现了Arrays.asList(...)来创建显式给定对象的列表。随着语言的接口静态方法的引入,该方法现在(也)在List接口本身上也以List.of(...)的形式实现。

此外,他们还为Set.of(...)Map.of(...)添加了便捷方法。

答案 1 :(得分:0)

我认为他们希望链在某种意义上看起来更好。我想不出任何其他解释来说明为什么要将类耦合到另一个构造方法。

因此,而不是

someChain.thenApply(i -> new A().setVar1(var1).setVar2(var2).someMethod());

你可以做,

someChain.thenApply(i -> A.of().setVar1(var1).setVar2(var2).someMethod());

他们可能认为第二个看起来更好。