gpt4 book ai didi

java - 构造函数还是设置函数?

转载 作者:行者123 更新时间:2023-11-30 02:55:13 25 4
gpt4 key购买 nike

对于大多数人来说,这可能是一个简单的问题,但我问这个问题是为了确保我的类设计在正确使用构造函数和访问修饰符时不会违反设计概念。

在我正在处理的这个类(class)中,我没有使用 setter,因为我认为使用构造函数初始化 Subject 对象而不是使用 setter 方法设置每个字段是正确的。因此,要求我的其他队友在调用 add() 方法之前实例化类 Subject 时提供该类的属性。

我的问题是为什么我在 Netbeans 上收到此警告?

enter image description here

  1. 我应该将实例变量设为private final吗?

  2. 我应该删除构造函数参数并创建 setter 方法来初始化字段/变量吗?

这是我的代码。

public class Subject {

private String subjectName;
private String subjectCode;
private int subjectUnits;
private String subjectDescription;
private String subjectYearLevel;
private int schoolYearStart;
private int schoolYearEnd;

public Subject(String name, String code, int units, String description, String yearLevel){
subjectName = name;
subjectCode = code;
subjectUnits = units;
subjectDescription = description;
subjectYearLevel = yearLevel;
}

public void add(){

String SQL = "INSERT INTO subject(name,code,units,description,yearlevel,creator) "
+ "VALUES (?,?,?,?,?,?)";
try(Connection con = DBUtil.getConnection(DBType.MYSQL);
PreparedStatement ps = con.prepareStatement(SQL);){
ps.setString(1,subjectName );
ps.setString(2,subjectCode );
ps.setInt(3, subjectUnits);
ps.setString(4, subjectDescription);
ps.setString(5, subjectYearLevel);
ps.setString(6, Login.getUsername());

} catch (SQLException e) {
JOptionPane.showMessageDialog(null,e.getClass()+" "+e.getMessage());
}
}
}

如果有任何建议,我将不胜感激。

谢谢。

最佳答案

Netbeans 发出该警告是因为您没有任何方法可以更改这些字段的原始值,因此 Netbeans 建议这样做,以使您的代码更具可读性。因此,如果您添加任何修改该原始值的方法,它将停止显示它。

关于设计:

不可变对象(immutable对象)和可变对象之间的决定取决于这些对象的用途。

根据您的示例:

如果您的主题类将在业务逻辑中发生更改,并且这些更改将有进一步的用途,事实上,如果主题拥有一个身份,那么最好使用可变类设计,它不需要实现有了setter,它还可以使用Factory。

否则,如果您的对象没有标识,并且每次需要不同的对象时实例化一个新对象然后使用 Inmutable 是有利于性能的,这也适用于并发性,因为不可变对象(immutable对象)是线程安全的。

以 Hibernate 为例,它是一个 Java ORM,需要模型是可变的并且具有 setter 方法。

如果您想了解更多相关信息:

6 Benefits of Programming with Immutable Objects in Java
If immutable objects are good, why do people keep creating mutable objects?

J.皮查多

关于java - 构造函数还是设置函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37427075/

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