使用新的vs创建对象

在执行任务期间,我看到其他开发人员,他们使用@AllArgsConstructor(access = AccessLevel.PRIVATE)创建了一个类,该类使该类的构造函数私有.然后,他们使用代替创建一个对象.

 

使用new和of创建之间有什么区别?

 

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();
        }

    }

最佳答案

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

 

一个(相当愚蠢的)示例是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)

不需要命名时,将使用的通用名称.仍然可以以重载构造函数的相同方式来重载,例如您可能还具有:

 

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值