对大多数人来说,这可能是一个简单的问题,但我要求这样做以确保我的课程设计在正确使用构造函数和访问修饰符时不违反设计概念。
在本课程中我正在研究我没有使用setter因为我认为使用构造函数初始化 Subject 对象而不是使用setter设置每个字段是正确的方法。因此,在调用add()
方法之前,要求我的其他队友在实例化时提供类主题的属性。
我的问题是为什么我会在Netbeans上收到此警告?
我应该制作实例变量private final
吗?
我应该删除构造函数参数并创建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());
}
}
}
我很感激任何建议。
感谢。
答案 0 :(得分:1)
Netbeans正在发出警告,因为您没有任何方法可以更改这些字段的原始值,因此Netbeans建议这样做以使您的代码更具可读性。因此,如果您添加任何修改该原始值的方法,它将停止显示它。
关于设计:
Inmutable和Mutable Objects 之间的决定是关于这些对象的目的。
根据你的例子:
如果您的Subject类将在Bussines Logic中进行更改并且这些更改将进一步使用,实际上如果Subject拥有标识,则最好使用可变类设计,它不需要实现有了setter,它也可以使用Factory。
否则,如果您的对象没有标识,并且每次需要另一个对象时实例化一个新对象,那么使用Inmutable,这也适用于并发,因为不可变对象是线程安全的。 / p>
作为示例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?
学家皮查
答案 1 :(得分:1)
因为您已在构造函数中初始化了实例变量。而你还没有重新初始化变量。构造函数只会在对象生命周期中调用一次。所以netbeans建议你将这些变量声明为final。如果使用setter方法,则此警告不会出现。因为方法可以被多次调用,这是变量的重新初始化。
答案 2 :(得分:0)
显示警告是因为您仅使用构造函数初始化了属性。 然后从未改变。
此警告将显示在NetBean上,不会显示在Eclipse上。
我认为你可以写这样的课程:
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){
setName(name);
setCode(code);
setUnits(units);
/*other setters*/
}
public String getSubjectYearLevel() {
return subjectYearLevel;
}
public void setSubjectYearLevel(String subjectYearLevel) {
/*Some validation and filters can write there*/
this.subjectYearLevel = subjectYearLevel;
}
/*other getter setter.....*/
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());
}
}
}
在setter中,您可以为某些不了解您的课程的人编写属性的验证码。