[英]Should accessor method checks for if the calling object is null in java?
我應該檢查調用對象是否為空嗎?
例如:
public class Some
{
private int number;
private String name;
public Some()
{
number = 0;
name = "no name";
}
public String get()
{
return name; //Should I check if the calling object is null?
}
}
僅當您想比教皇更聖潔時。
在獲取對象本身時,並且僅在調用對象上的任何方法之后,才應檢查null:
if (some == null){
// do something: send an error message / throw exception / ignore
} else {
System.out.println(some.get());
System.out.println(some.getOtherStuff());
....
}
如果通過“檢查調用對象是否為空”來表示“檢查get()
調用的結果是否為null
”,則答案是“取決於使用情況”。 對於您的用例, name
的值永遠不會為null
,因此檢查它幾乎沒有好處。
通常,吸氣劑就是這樣-吸氣劑。 它們僅獲取數據,甚至為null
。
如果您要使用該值,並且期望它不為null,那么您當然應該在使用它的方法中檢查null
。
我假設通過calling object
您是指calling object
方法的對象,例如
String name = callingObject.get();
現在callingObject
變成this
方法里面, this
永遠是里面空get()
方法。 如果callingObject
為null,那么JVM將在調用而不是 get().
之前拋出NullPointerException
get().
我認為驗證自己的對象不是訪問者的責任。 簡而言之,除非真的有一只狗,否則您無法承受狗的重量。
相反,調用訪問器的方法負責確保對象確實存在。
public class Lab {
List<Dog> dogs;
public float getAveDogWeight() {
float sum = 0.0f;
float ave = 0.0f;
if (null != dogs && dogs.size > 0) {
for (Dog dog : dogs) {
if (null != dog) {
sum += dog.getWeight();
}
}
ave = // calculate ave here
}
return ave;
}
}
吸氣劑不應驗證數據。 您正在從錯誤的方向進行處理。
首先,您需要為對象定義規則 :其參數的有效值是什么? 這些規則稱為不變式。
然后,使用設置器驗證數據,以確保不變量始終成立。 換句話說, 使用setter來確保違反規則的對象不存在 。
如果您在getter中進行驗證,則事后將檢查無效字段。 在這一點上做任何事情已經為時已晚。
然后,除非使用反射的奇怪用法(反序列化也是另一回事),否則可以確保您的獲取器也將返回不違反規則的值。 例如,假設“人”必須具有非空名稱,並且年齡必須大於0且小於等於150:
class Person {
private String name;
private int age;
// Constructor uses setters to perform validation.
// Throws IllegalArgumentException on invalid parameter.
public Person (String name, int age) {
setName(name);
setAge(age);
}
// Setter validates name.
public final void setName (String name) {
if (name == null)
throw new IllegalArgumentException("Invalid name specified.");
this.name = name;
}
// Setter validates age.
public final void setAge (int age) {
if (age <= 0 || age > 150)
throw new IllegalArgumentException("Invalid age specified.");
this.age = age;
}
// Guaranteed to return a non-null name.
public final String getName () {
return this.name;
}
// Guaranteed to return an age > 0 and <= 150.
public final int getAge () {
return this.age;
}
}
另外請注意,我所做的getter和setter final
在這里。 由於這些參數具有規則,因此這將防止子類重寫getter / setter並可能破壞我們為Person
設置的不變式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.