你可以看到下面的类声明了2个私有实例变量和2个get& 2设置与每个私有成员相关联的方法,以允许对它们进行操作和验证。
我的问题是:最好在构造函数减速中使用,实例变量直接如下面的代码片段所示,或者使用与它们相关联的set方法,以及促进在toString方法中使用的良好软件实践,实例变量或它们的getter方法?
谢谢你的时间。public Class Employee {
private String firstName;
private String lastName;
public Employee (String first, String last)
{
firstName = first;
lastName = last;
}//end of constructor
public void setFirstName(String first)
{
firstName = first;
}//end of method setFirstName
public String getFirstName()
{
return firstName;
}
public void setLastName(String last)
{
lastName = last;
}//end of method setLastName
public String getLastName()
{
return lastName;
}//end of method getLastName
public String toString()
{
return String.format ("%s: %s %s\n", "Employee Name: ", firstName, lastName);
}//end of method toString
}//end of class Employee
答案 0 :(得分:5)
我倾向于通过构造来支持初始化。通过使用此方法并提供适当的检查(通过final
编译时间和通过空检查或类似的运行时),您可以确保您的对象正确并完全实例化。
在字段上使用final
关键字将使编译器检查您在构造时是否已为该字段指定了值。它确实意味着该字段是不可变的,但令人惊讶的是您经常需要它。
我会小心为所有事情提供吸气剂。如果您不断提供和使用getter,则表明您正在从对象中提取数据并在该对象之外对其进行操作。请记住 - OO的一个关键原则是让对象为您做事,而不是向他们询问数据并自行完成。
答案 1 :(得分:2)
规则#1,总是限制对最少必要的访问,即除非你明确需要更改名字/姓氏的值,否则使对象不可变(带有参数的构造函数,没有setter只有getter)
答案 2 :(得分:1)
如果您希望扩展您的类(并且重写getter / setter),最好使用方法而不是变量。
注意:我不确定构造函数中究竟发生了什么,你最好直接设置变量。
您可以将getter / setter标记为final,然后您不必担心覆盖。使用这些方法而不是直接访问仍然是一种很好的做法,因为您可以更容易地放置断点或调试语句
答案 3 :(得分:1)
一般来说,我倾向于避免从构造函数中调用非静态方法(因为该对象在该阶段没有完全初始化)。如果setter方法只将字段设置为参数值,如上所述,我只需在构造函数中设置它(即不调用setter)。如果setter更复杂,我会尝试将逻辑分解为静态辅助方法,并从构造函数和setter方法中使用它。类似的东西:
int field_;
Constructor(int initialValue) {
field_ = helper(initialValue);
}
public void setField(int value) {
field_ = helper(value);
}
// not really complex, but avoid duplication of logic
private static int helper(int value) {
return 2*value;
}
答案 4 :(得分:0)
我会使用setter。有时你在setter中有额外的代码。例如,列表的setter也可能挂钩列表的Changed事件,如果不使用setter,则不会捕获Changed事件。