带有用户输入的 Getters Setters

Getters Setters with user input

将 getter 和 setter 与 userinput 一起使用是一种好的做法吗?我找了一些例子,但找不到任何例子。虽然下面的代码有效,但这是一个好习惯吗?我注意到如果我使用下面的代码,我将无法使用构造函数。谢谢你的解释。

public class Tests{

    private String name;
    private int id;

    Scanner userinput = new Scanner(System.in);

    public void setName(){
        System.out.println("Enter a name: ");
        name= userinput.next();     
    }

    public String getName(){

        return name;
    }

    public void displayInfo(){
        setName();
        System.out.println("You entered " + this.getName());
    }
    public static void main(String [] args){

        Tests test = new Tests();
        test.displayInfo();

    }

}

我会说这是糟糕的做法。它违反了 "bean" 约定,并且不遵循 single responsibility principle(它会变异并提示输入一个值)。这个,

public void setName(){
    System.out.println("Enter a name: ");
    name= userinput.next();     
}

应该只是

public void setName(String name){
    this.name = name;     
}

然后(不要无缘无故地让 Scanner 成为一个字段)像

public void displayInfo() {
    Scanner userinput = new Scanner(System.in);
    System.out.println("Enter a name: ");
    setName(userinput.nextLine()); 
    System.out.println("You entered " + this.getName());
}

我建议您更改带有 1 个参数的 setName() 方法。它将是干净的,并有助于远离许多错误。并且您必须对 getName() 方法进行一些更改。并在 class decleration.

中删除扫描仪
        //setName
        public void setName(String n) {
            this.name = n;
        }

        //getName
        public String getName() {
            return this.name;
        }

        //main method.
        public static void main(String[] args) {
            Scanner s = new Scanner(System.in);
            Test test = new Test();
            test.setName(s.next());
            test.displayInfo();
        }

我认为你的做法不是很好。你可以关注这个。在 main 函数中输入,然后使用

将输入值设置为名称
public void setName( String name){
      this.name =name;
}

或者您可以使用另一种方法,如 takeInput(){},并从 main 方法中调用它,然后在 setter 方法中进行设置。像这样

public static void main(String[] args){
   Tests tests= new Tests();
   String inputString =tests.takeInput();
   tests.setName(inputString);
   tests.displayInfo();
}

并且 takeInput() 会喜欢这样

public String takeInput(){
    System.out.println("Enter your name");
    String str =userinput.next();
    return str;
}

displayInfo()简单显示数据

并且您在创建 Test class 对象时已经在使用构造函数。这称为默认构造函数。您还可以定义参数化构造函数,例如

Tests(String name){
      this.name = name;
}

但在这种情况下,您不需要声明参数化构造函数。

为了更好的设计,您可以创建另一个 class,例如 Info.java,您可以在其中定义 class 成员,例如名称及其 getter 和 setter并且只能对主要方法使用测试 class。

public void setName(String name){ this.name=name; }

and in the main when you call:

test.setName(userinput.nextLine());