我看到默认的setX
函数只使用X = _x
,但在Java中它不仅仅是对_x
对象的引用?
我不应该使用X = new X(_x)
吗?
我真的找了答案,但却找不到答案。
答案 0 :(得分:3)
为了在语义上正确,_x
不是一个对象,它是一个参数,它指的是一个对象。是的,之后你的X
将是该引用的副本,因此它将指向同一个对象。
但通常这正是你想要达到的目标。每当设置值时,您都不想生成新对象。而且通常你明确地希望它是完全相同的对象。
仅当主叫站点将其对象的版本视为私有属性时,它才会负责生成和设置副本。
答案 1 :(得分:3)
名字设定者意味着:设置一个字段。
该方法不称为storeCopyOf(),是吗?
当然你可以使用 new (如果相应的类提供了一个复制构造函数),但在setter中这样做并不常见。如图所示,考虑到名称setX()通信的含义,这样做是非常误导的。
答案 2 :(得分:2)
不,你不应该。您的API用户希望准确设置给定的实例,而不是它的副本。我不应该使用
X = new X(_x)
吗?
如果它不符合你的需要,可以通过抛出异常来验证这个传入的实例,但是设置副本真的不清楚。
可能您可能希望使用此方法从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);