gpt4 book ai didi

java - Java 中的 Setter 参数最终

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:11:40 25 4
gpt4 key购买 nike

我一直在用 java 编程,最近我开始学习一些 c++。

在 C++ 中,通常将 setter 参数设置为 const,为什么我们在 java 中看不到这一点?

我的意思是像这样创建一个 setter 有什么缺点吗:

public void setObject(final Object o){ this.o=o; }

对比

public void setObject(Object o){ this.o=o; }

第一个应该强制对象参数 o 在整个 set 函数中保持不变,不是吗?

编辑:

最后一个参数将强制这不会发生:

public void setName(String name){ 
name="Carlos";
this.name=name;
}

用户永远无法设置不同于“Carlos”的名字

最佳答案

将 Java 方法参数设置为 final 没有什么好处,因为它不会阻止某人更改方法中参数引用的状态。它所阻止的只是将参数变量重新分配给其他东西,这对原始引用没有任何作用,并且它允许在匿名内部类中使用参数。如果你想在这种情况下真正安全,你会尽可能使你的参数类型不可变。


编辑
您已发布:

public void setObject(Object o){ 
o++; // this does not compile
this.o=o;
}

它混合了原始数字和引用类型。只有当 o 是 Integer 或其他数字包装类时才有意义,即使如此,将其设为 final 也不会阻止某人创建:

private void setI(final Integer i) {
this.i = 1 + i;
}

但是你的代码和上面这段代码都不会影响调用代码端的参数对象。


编辑
好的,现在你已经发布了:

public void setName(String name){ 
name="Carlos";
this.name=name;
}

但是有人可以写

public void setName(final String name){ 
this.name= name + " Carlos";
}

危险就在这里,final 也无济于事。假设你有一个名为 Name 的类:

public class Name {
private String lastName;
private String firstName;
public Name(String lastName, String firstName) {
this.lastName = lastName;
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}

然后是一个类 Foo,它有一个 Name 字段和一个 setter。这是危险代码:

class Foo {
private Name name;

public void setName(final Name name) {
name.setFirstName("Carlos");
this.name = name;
}
}

因为它不仅会改变字段的状态,还会改变调用代码中 Name 引用的状态,而 final 修饰符一点用处都没有。解决方案:使 Name 不可变。

例如,

import java.util.Date;

// class should be declared final
public final class BetterName {
private String lastName;
private String firstName;
private Date dateOfBirth;

public BetterName(String lastName, String firstName, Date dob) {
this.lastName = lastName;
this.firstName = firstName;

// make and store a private copy of non-immutable reference types
dateOfBirth = new Date(dob.getTime());
}

// only getters -- no setters
public String getLastName() {
return lastName;
}

public String getFirstName() {
return firstName;
}

public Date getDateOfBirth() {
// return copies of non-immutable fields
return new Date(dateOfBirth.getTime());
}
}

关于java - Java 中的 Setter 参数最终,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31103345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com