Java-我是否应该在setter中使用new()?
我看到默认的Java-我是否应该在setter中使用new()?,java,reference,new-operator,setter,Java,Reference,New Operator,Setter,我看到默认的setX函数只使用X=\ux,但在Java中,它不只是对\ux对象的引用吗 我不应该改用X=newx(\ux) 我真的在寻找答案,但还没有找到答案。从语义上讲正确,\ux不是一个对象,它是一个参数,它指的是一个对象。是的,之后您的X将是该引用的副本,因此它将指向同一对象 但通常这正是你想要实现的。您不希望在设置值时生成新对象。通常,您明确希望它是完全相同的对象 只有当调用站点将其对象版本视为私有财产时,它才有责任生成并设置副本 从语义上来说,\ux不是一个对象,它是一个参数,它指的是
setX
函数只使用X=\ux
,但在Java中,它不只是对\ux
对象的引用吗
我不应该改用X=newx(\ux)
我真的在寻找答案,但还没有找到答案。从语义上讲正确,
\ux
不是一个对象,它是一个参数,它指的是一个对象。是的,之后您的X
将是该引用的副本,因此它将指向同一对象
但通常这正是你想要实现的。您不希望在设置值时生成新对象。通常,您明确希望它是完全相同的对象
只有当调用站点将其对象版本视为私有财产时,它才有责任生成并设置副本 从语义上来说,
\ux
不是一个对象,它是一个参数,它指的是一个对象。是的,之后您的X
将是该引用的副本,因此它将指向同一对象
但通常这正是你想要实现的。您不希望在设置值时生成新对象。通常,您明确希望它是完全相同的对象
只有当调用站点将其对象版本视为私有财产时,它才有责任生成并设置副本 名称设置器意味着:设置字段 该方法不是名为storeCopyOf(),是吗
当然,您可以使用new(如果相应的类提供了复制构造函数),但在setter中这样做并不常见。如图所示,鉴于名称setX()的含义,这样做是非常误导的 名称设置器意味着:设置字段 该方法不是名为storeCopyOf(),是吗 当然,您可以使用new(如果相应的类提供了复制构造函数),但在setter中这样做并不常见。如图所示,鉴于名称setX()的含义,这样做是非常误导的 我不应该改用
X=newx(\ux)
不,你不应该。API的用户希望准确地设置给定实例,而不是它的副本
如果传入实例不符合您的需要,您可以通过抛出异常来验证该实例,但设置副本确实不清楚
您可能希望使用这种方法从getter返回一个值。返回内部字段(引用类型)的副本是保持不变性的一种好方法
我不应该改用X=newx(\ux)
不,你不应该。API的用户希望准确地设置给定实例,而不是它的副本
如果传入实例不符合您的需要,您可以通过抛出异常来验证该实例,但设置副本确实不清楚
您可能希望使用这种方法从getter返回一个值。返回内部字段(引用类型)的副本是保持不变性的好方法。我们使用
setter
(和getter
)方法来实现
例如:
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
s的人将根据需要传递这些值,例如:
obj.setMyField("myvalue");
我们使用
setter
(和getter
)方法来实现
例如:
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
s的人将根据需要传递这些值,例如:
obj.setMyField("myvalue");
如果x是基元类型,则无需使用复制构造函数重新创建该值,因为在其他地方对其值的更改不会影响本地副本
如果您正在设置可变(可更改)对象,但不希望更改副本,则应该在setter中使用副本构造函数。然而,我不太愿意称之为设置,它更像是一个
saveCopy(x)代码>如果x是基元类型,则无需使用副本构造函数重新创建该值,因为在其他地方对其值的更改不会影响本地副本
如果您正在设置可变(可更改)对象,但不希望更改副本,则应该在setter中使用副本构造函数。然而,我不太愿意称之为设置,它更像是一个saveCopy(x)代码>“它不只是对x对象的引用吗”是的。“我不应该改用X=newx(X)吗?”这取决于a)X
是否有这样的构造函数,b)您实际上需要一个新实例(例如作为防御副本)。YourClass YourClass=new YourClass();yourClass.setX(x)。你可以发布你的代码吗?如果你需要的话,对现有对象实例的引用有什么问题?您是否需要一个新实例取决于场景。@MehrajMalik这个问题是一般性的,因此我发现它非常清楚。我错了吗?“这不只是对x对象的引用吗”是的。“我不应该改用X=newx(X)吗?”这取决于a)X
是否有这样的构造函数,b)您实际上需要一个新实例(例如作为防御副本)。YourClass YourClass=new YourClass();yourClass.setX(x)。你可以发布你的代码吗?如果你需要的话,对现有对象实例的引用有什么问题?您是否需要一个新实例取决于场景。@MehrajMalik这个问题是一般性的,因此我发现它非常清楚。我错了吗?