Java 构造函数内部的用户输入挂起

Java 构造函数内部的用户输入挂起,java,constructor,user-input,Java,Constructor,User Input,我在想这种做法有多糟糕,当你这么做的时候: SomeConstructor(){ Scanner sc = new Scanner(System.in); a = sc.nextInt(); } Java允许我这样做,但我从未见过有人编写过这样的代码,所以问题是这样的代码会产生什么问题,如果这是一种不好的做法,请解释一下为什么 简单地说:真的不好 构造函数的主要目的当然是初始化新创建的对象。但是:您非常喜欢传递值 意思是:当您有一个从标准中读取的构造函数时,这几乎不可能轻松地对相应的类进行

我在想这种做法有多糟糕,当你这么做的时候:

SomeConstructor(){
 Scanner sc = new Scanner(System.in);
 a = sc.nextInt();
}

Java允许我这样做,但我从未见过有人编写过这样的代码,所以问题是这样的代码会产生什么问题,如果这是一种不好的做法,请解释一下为什么

简单地说:真的不好

构造函数的主要目的当然是初始化新创建的对象。但是:您非常喜欢传递

意思是:当您有一个从标准中读取的构造函数时,这几乎不可能轻松地对相应的类进行单元测试


您希望遵循单一责任原则。比如:一个类负责收集输入。然后,另一个类负责处理该输入。您的方法将导致一个类,该类首先获取值,然后使用它们。正如前面所说:您希望避免这种情况。

“Java允许我这样做”。我不认为任何语言的设计都能防止人们所能做的一切愚蠢行为。如果您想在构造函数中阻塞用户I/O,为什么语言会禁止您这样做?这肯定不符合“关注点分离”的设计原则。我相信比我更了解的人可以更好地解释这一点,但这将遵循冰淇淋(我不知道它是否真的有这个名字,但java io流遵循这种嵌套原则)模式。但我可能错了,所以请纠正我从@ghostcat那里借的话:真的很糟糕。-如果构造函数抛出异常,那么对象是否真的constructed@M.勒鲁特,我这么说的意思是我现在正在学习,我在谷歌上找不到我问题的答案。如果我只读好的东西,我怎么知道什么是不允许的呢?我是这个领域的新手,所以请耐心点,否则我真的看不出你评论的意义。非常感谢。非常感谢您的礼貌和解释。@roleveltv非常欢迎您。请让我知道,如果有什么我可以补充,以便也得到我的答案upvote值得,现在你达到upvote特权。