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);
我看到默认的 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);