Java - 我应该在setter中读取一个值吗?

Per*_*dis 0 java

我有一个setter,我希望它检查一个电子邮件地址是否包含字符"@"和".".,在设置值之前.如果电子邮件地址不包含这些字符,我希望用户再次输入电子邮件地址.我应该读取setter中的新值还是不好的实践,只能在main或不同的方法中完成?

import java.util.Scanner;
public class Person {
    private String emailAddress;
    Scanner input = new Scanner( System.in);

    public void setEmail(String email)
    {
         while(email.indexOf('@')<0 || email.indexOf('.')<0)
         {
                System.out.println("The email address must contain the characters \"@\" and \".\" ");
                System.out.println("Enter email address again:
                email = input.nextLine();
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*ner 6

不,这是不好的做法.

问题是,如果在没有交互式控制台的上下文中调用方法,例如在单元测试中,则会卡住.

抛出一个IllegalArgumentException,让调用者实现重试(或不重试).

在你的二传手:

void setEmail(String email) {
  if (!email.contains("@") || !email.contains(".")) {
    throw new IllegalArgumentException("Invalid email: " + email);
  }
  this.emailAddress = email;
}
Run Code Online (Sandbox Code Playgroud)

在您的来电者中:

while (true) {
  try {
    setEmail(emailAddress);
    break;
  } catch (IllegalArgumentException e) {
    // Show a message, or whatever.
  }
Run Code Online (Sandbox Code Playgroud)