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";

TA貢獻1848條經驗 獲得超10個贊
在類的構造函數中使用方法 setPhoneNumber
public Passenger(String name, String location, String phoneNumber) {
this.name = name;
this.location = location;
this.setPhoneNumber(phoneNumber);
}

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;
}
}
希望這可以幫助

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);
}
添加回答
舉報