Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-我是否应该在setter中使用new()?_Java_Reference_New Operator_Setter - Fatal编程技术网

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这个问题是一般性的,因此我发现它非常清楚。我错了吗?