亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 setter/getter 中創建 if

在 setter/getter 中創建 if

MMTTMM 2023-05-10 15:07:42
對 Java 很陌生,需要一些幫助來存儲乘客詳細信息,同時使用 setter/getter 并使用 toString 方法創建輸出。我遇到的問題是,假設我正在存儲乘客的電話號碼并且不希望他們的電話號碼包含任何字符,長度為 10 個數字并以 1 開頭,如果出現其中一個,則返回“無效”。我試圖在 setter 中創建 if 語句,但它沒有返回“無效”。這是我到目前為止所擁有的public class Passenger {    private String name;    private String location;    private String phoneNumber;    public Passenger(String name, String location, String phoneNumber) {        this.name = name;        this.location = location;        this.phoneNumber = phoneNumber;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getLocation() {        return location;    }    public void setLocation(String location) {        this.location = location;    }    public String getPhoneNumber() {        return phoneNumber;    }    public void setPhoneNumber(String phoneNumber) {        if (phoneNumber.matches("[a-zA-z]+)")) {            phoneNumber = "Not Valid";        }         else if (phoneNumber.length() > 10) {            phoneNumber = "Not Valid";        }        else if (phoneNumber.startsWith("1")){            phoneNumber = "Not Valid";        }        else {        this.phoneNumber = phoneNumber;        }    }    public String toString() {        return " Name: " + name + "\n Location: " + location + "\n Phone Number: " + phoneNumber;  public class Test {    public static void main(String[] args) {        Passenger one = new Passenger("John John", "China", "1231231234");        Passenger two = new Passenger("John John", "China", "A");        Passenger three = new Passenger("John John", "China", "2323232323");        Passenger four = new Passenger("John John", "China", "123123123123");        System.out.println(one);        System.out.println(two);        System.out.println(three);        System.out.println(four);    }對于二號、三號和四號乘客,我希望顯示電話號碼Not Valid,但它們顯示的是輸入的值。任何幫助將不勝感激
查看完整描述

4 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

當然,可以setPhoneNumber在構造函數中調用該方法。但問題是您在構造函數中調用了一個可重寫的方法。

這會導致問題。

一種方法是制作一個包含驗證的私有方法:

private?void?validateAndSetPhoneNumber(String?phoneNumber)?{
????this.phoneNumber?=?...
}

然后從構造函數中調用它

public?Passenger(String?name,?String?location,?String?phoneNumber)?{?
???this.name?=?name;
???????this.location?=?location;
???????????this.phoneNumber?=?validateAndSetPhoneNumber(phoneNumber);
}

來自二傳手:

public?void?setPhoneNumber(String?phoneNumber)?{
????validateAndSetPhoneNumber(phoneNumber);
}

此外,還有幾點說明:

你說你“不希望他們的電話號碼包含任何字符”。假設您的意思是“除數字以外的任何字符”,您的驗證不太正確。您當前的代碼肯定會拋出 a?PatternSyntaxException,因為您的正則表達式包含一個不匹配的).?如果正則表達式是[a-zA-z]+,那么驗證仍然不正確。例如,電話號碼輸入abc4def將被視為有效。那是因為String.matches試圖匹配整個區域。

根據您當前的要求,以下內容就足夠了:

if (phoneNumber.matches("[02-9]\\d{0,9}")) {

? ? this.phoneNumber = phoneNumber;

}

else {

? ? this.phoneNumber = "Not Valid";

}

要不就


this.phoneNumber = phoneNumber.matches("[02-9]\\d{0,9}") ? phoneNumber : "Not Valid";



查看完整回答
反對 回復 2023-05-10
?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

在類的構造函數中使用方法 setPhoneNumber


public Passenger(String name, String location, String phoneNumber) {

    this.name = name;

    this.location = location;

    this.setPhoneNumber(phoneNumber);

}


查看完整回答
反對 回復 2023-05-10
?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

好吧,有幾件事。在你的構造函數中,你沒有調用你的 setter 方法,所以那些 if 語句永遠不會被觸及。同樣在設置器中,您忘記使用“this.phoneNumber”。這導致數據為空而不是“無效”。


您在最后一個陳述中提到您希望案例 1 是正確的,但是您的一個 if 陳述指出,else if (phoneNumber.startsWith("1"))所以在案例 1 中,數字無效,只是一個旁注。


這是代碼:


public class Passenger {


private String name;

private String location;

private String phoneNumber;


public Passenger(String name, String location, String phoneNumber) {

    this.name = name;

    this.location = location;

    setPhoneNumber(phoneNumber);

}


public String getName() {

    return name;

}


public void setName(String name) {

    this.name = name;

}


public String getLocation() {

    return location;

}


public void setLocation(String location) {

    this.location = location;

}


public String getPhoneNumber() {

    return phoneNumber;

}


public void setPhoneNumber(String phoneNumber) {

    if (phoneNumber.matches("[a-zA-z]+")) {

        this.phoneNumber = "Not Valid";

    } 

    else if (phoneNumber.length() > 10) {

        this.phoneNumber = "Not Valid";

    }


    else if (phoneNumber.startsWith("1")){

        this.phoneNumber = "Not Valid";

    }

    else {

    this.phoneNumber = phoneNumber;

    }

}


public String toString() {

    return " Name: " + name + "\n Location: " + location + "\n Phone Number: " + phoneNumber;

}

}

希望這可以幫助


查看完整回答
反對 回復 2023-05-10
?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

您會得到有關當前代碼中缺少哪些內容的很好的答案:setPhoneNumber() 永遠不會被調用。


但我認為在標準 setter ( setFieldName()) 中添加特定邏輯不一定是最好的做法:在大多數情況下,開發人員希望 setter 在傳遞值時設置值。如果不檢查實現,

他們就無法猜測這setPhoneNumber()意味著什么。setPhoneNumberOrUseDefaultValueIfInvalid()


所以我寧愿重命名它以明確意圖:


private static final String DEFAULT_PHONE_NUMBER = "Not Valid";


public void setPhoneNumberOrUseDefaultValueIfInvalid(String phoneNumber) {

        if (phoneNumber.matches("[a-zA-z]+)")) {

            phoneNumber = DEFAULT_PHONE_NUMBER;

        } 

        else if (phoneNumber.length() > 10) {

            phoneNumber = DEFAULT_PHONE_NUMBER;

        }


        else if (phoneNumber.startsWith("1")){

            phoneNumber = DEFAULT_PHONE_NUMBER;

        }

        else {

            this.phoneNumber = phoneNumber;

        }

}

并使用它:


public Passenger(String name, String location, String phoneNumber) {

    this.name = name;

    this.location = location;

    setPhoneNumberOrUseDefaultValueIfInvalid(phoneNumber);

}


查看完整回答
反對 回復 2023-05-10
  • 4 回答
  • 0 關注
  • 186 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號