良好的软件实践 - 获取和设置方法

时间:2012-03-28 14:50:58

标签: java coding-style

你可以看到下面的类声明了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

5 个答案:

答案 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事件。