获取器和设置器与用户输入

3

在处理用户输入时使用getter和setter是一种好的实践吗?我查找了一些示例,但没有找到任何内容。虽然下面的代码可以工作,但这是一个好的实践吗?我注意到如果我使用下面的代码,我将无法使用构造函数。感谢您的解释。

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();

    }

}

当调用您的setter时,您是否希望程序在等待命令行上的用户输入时停止? - 4dc0
无法使用构造函数?你是什么意思? - Nicholas K
3
不,那并不是好的实践。一个设置方法应该有一个参数,用于设置字段的新值。一般来说,你的数据(id、name)应该在一个类中,并且数据的收集应该由另一个类处理。 - Joakim Danielson
如果我使用构造函数,那么 Tests test = new Tests(name, id); 我必须输入一个名称/ID。然而,我希望用户能够提供该名称和ID。 - Sheikh Rahman
@SheikhRahman,请看我上面的评论解决那个问题。 - Joakim Danielson
谢谢大家的解释,这非常有帮助。 - Sheikh Rahman
4个回答

6
我认为这是糟糕的做法。它违反了“bean”合约,并且没有遵循单一职责原则(它会改变并提示一个值)。
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()方法进行一些更改,并从类声明中删除scanner。
        //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();
        }

1
我认为你的做法不是很好。你可以按照这个方法来操作。在主函数中输入数据,然后使用“name”设置输入值。
public void setName( String name){
      this.name =name;
}

或者你可以使用另一种方法,比如 takeInput(){} 并从主方法中调用它,然后在 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 类对象时,您已经使用了构造函数。这被称为默认构造函数。您还可以定义带参数的构造函数,例如:

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

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

为了更好的设计,您可以创建另一个类,例如Info.java,在其中定义类成员(如名称及其getter和setter),并仅在主方法中使用Tests类。


这段代码无法编译,你在错误的方式下混合了静态和非静态方法,并且缺少关键字。请整理你的代码(并添加一些缩进),以便这个答案达到可接受的水平。 - Joakim Danielson
这里我解释了场景,但没有给出确切的代码。这个问题是为了分析而不是运行代码。这就是我认为它不相关的原因。 - flopcoder
这个答案可能对其他初学者有所帮助或指导,因为它被标记为已接受的答案,所以我认为尽可能地使其正确是很重要的,以避免不必要的混淆。此外,你不会在自己的努力中感到一些自豪感,并希望它尽可能好吗? - Joakim Danielson
当然,我会更新。我是用手机回答的。等我能够使用笔记本电脑时,我会进行更新。感谢您的关注。 - flopcoder

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

and in the main when you call:

test.setName(userinput.nextLine());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接