Java - 我应该在Setters中使用new()吗?

时间:2017-05-26 09:38:40

标签: java reference new-operator setter

我看到默认的setX函数只使用X = _x,但在Java中它不仅仅是对_x对象的引用?

我不应该使用X = new X(_x)吗?

我真的找了答案,但却找不到答案。

5 个答案:

答案 0 :(得分:3)

为了在语义上正确,_x不是一个对象,它是一个参数,它指的是一个对象。是的,之后你的X将是该引用的副本,因此它将指向同一个对象。

但通常这正是你想要达到的目标。每当设置值时,您都不想生成新对象。而且通常你明确地希望它是完全相同的对象。

仅当主叫站点将其对象的版本视为私有属性时,它才会负责生成和设置副本。

答案 1 :(得分:3)

名字设定者意味着:设置一个字段。

该方法不称为storeCopyOf(),是吗?

当然你可以使用 new (如果相应的类提供了一个复制构造函数),但在setter中这样做并不常见。如图所示,考虑到名称setX()通信的含义,这样做是非常误导的。

答案 2 :(得分:2)

  

我不应该使用X = new X(_x)吗?

不,你不应该。您的API用户希望准确设置给定的实例,而不是它的副本。

如果它不符合你的需要,可以通过抛出异常来验证这个传入的实例,但是设置副本真的不清楚。

可能您可能希望使用此方法从getter返回值。返回内部字段(引用类型)的副本是保持不变性的好方法。

答案 3 :(得分:1)

我们使用setter(和getter)方法来实施encapsulation

示例:

private String myField; //"private" means access to this is restricted

public String getMyField()
{
     //include validation, logic, logging or whatever you like here
    return this.myField;
}
public void setMyField(String value)
{
     //include more logic
     this.myField = value;
}

正在使用您的API的人会根据需要传递这些值,例如:

obj.setMyField("myvalue");

答案 4 :(得分:1)

如果x是基本类型,则无需使用复制构造函数重新创建该值,因为在其他位置更改其值不会影响本地副本。

如果您正在设置一个可变(可更改)对象,但您不希望更改副本,那么您应该在setter中使用复制构造函数。但是我会毫不犹豫地打电话给那个设置,它更像是saveCopy(_x);