getter是否应该在java中进行验证?

时间:2016-02-25 04:16:14

标签: java arrays validation oop junit

getter是否应该在java中进行验证(例如。检查某些内容是否为null)?或者他们应该简单地得到任何想要得到的回报声明。对我而言,这就是我通常的做法。

public class GetterDemo
{
private String name;
private int age;
public GetterDemo(String name, int age)
{
     this.name = name;
     this.age = age;
}

public String getName()
{
return this.name;
}

public int getAge()
{
return this.age;
}
}

现在假设构造函数有一个来自名为hobbies的类的爱好数组。

public class Hobbies
{
private String hobby;
private String category;
public Hobbies(String hobby, String category)
{
this.hobby = hobby;
this.category = category;
}

public String getHobby()
{
return this.hobby;
}

public String getCategory()
{
return this.category;
}
}

现在,让我们在构造函数中更新GetterDemo的版本,其中包含一系列爱好,如上所述。并且它有一个下一个方法来在每次调用时获取数组中的下一个爱好。

public class GetterDemo
{
private String name;
private int age;
private int count = 0;
private Hobbies[] hobbies;
public GetterDemo(String name, int age, Hobbies[] hobbies)
{
this.name = name;
this.age = age;
this.hobbies = hobbies
}

public Hobbies getNextHobby()
{
//Create a counter.
Hobbies result;
if (this.hobbies == null || this.hobbies.length == 0
  || this.count >= this.hobbies.length) //Called more then length times.
return null;

result = this.hobbies[count];
count++;
return result;  
}

public String getName()
{
return this.name;
}

public int getAge()
{
return this.age;
}
public void reset()
{
this.count = 0;
}
}

好的,这就是一个小代码示例。可能有错误,可能很多,因为我空白编码。 在测试null(JUnit测试)方面进行解释。如果我调用getNextHobby()爱好长度或更长时间它将返回null并且我可以AssertNull()并且它将通过。但是,例如,如果我执行AssertNull,其中业余爱好数组为Null并且我尝试使用getNextHobby.getCategory(),它将抛出NullPointerException,即使我希望它为null。修复此问题的唯一方法是创建一个检查此方法的方法吗?或以某种方式检查null的getter?可能是下面的代码?

public boolean checkNull()
{
boolean result = false;
if (getNextHobby().getCategory() == null || getNextHobby().getHobby())
result = true;
return result;
}

1 个答案:

答案 0 :(得分:1)

我认为这是一个品味问题。

我更喜欢setter和getter只做他们想做的事情,这意味着设置某些值或获取某些值。我的理由如下:

  1. 该方法的签名应该解释这个方法正在做什么,因为我们知道好的方法应该一件好事。因此,当您开始添加一些验证时,我会假设您需要更改签名,否则调用者可能会认为只发生了set / get操作。
  2. 每个IDE都有机会生成getter和setter,由于某种原因,它们不会为getter方法的参数生成一些验证,因此我假设您不应该这样做。
  3. 我尝试将getter和setter与其他方法分开,因此如果我需要获取值,那么,它并不完全是一个getter,因为你需要做一些其他的操作,I喜欢使用其他词语,如 fetch,retrieve,获取。在这种情况下,很明显你不需要测试getter和setter,因为它们并没有真正做任何事情,但是,fetch和其他你必须这样做。