为了账号安全,请及时绑定邮箱和手机立即绑定

在 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 关注
  • 146 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信