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

Java - should I use new() in Setters or not?

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

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

我真的在寻找答案,但没有找到。

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

但这通常正是您想要实现的目标。您不想在设置值时生成新对象。通常您明确希望它是完全相同的对象。

只有当调用站点认为它的对象版本是私有的 属性 时,它才有责任生成并设置一个副本。

名字setter的意思是:设置一个字段。

那个方法不叫 storeCopyOf(),是吗?

当然你可以使用new(以防相应的class提供拷贝构造函数),但是在setter中这样做并不常见实践。如图所示,考虑到名称 setX() 传达的含义,这样做非常具有误导性。

Shouldn't I use X = new X(_x) instead?

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

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

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

我们使用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");

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

如果您正在设置一个可变(可更改)对象,但您不想更改您的副本,那么是的,您应该在您的 setter 中使用复制构造函数。但是我不愿意调用该设置,它更像是 saveCopy(_x);