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);
}
添加回答
举报