簡體   English   中英

訪問器方法是否應該檢查Java中調用對象是否為null?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM