下面的代码工作正常,但我想知道在对象创建时是否有任何问题。
import java.util.Scanner;
public class FactorialExample {
public FactorialExample(int n) {
int fact=1;
for(int i=1;i<=n;i++) {
fact=fact*i;
}
System.out.println("the factorial of a given number is::"+fact);
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("Enter any Integer Value:");
int value=sc.nextInt();
FactorialExample fe=new FactorialExample(value);
}
}
5条答案
按热度按时间gpnt7bae1#
是的,你的假设是正确的--不要在构造函数中使用业务逻辑。
最多初始化对象状态。
否则,像异常处理、测试和模拟这样的事情就会变得很困难。
在你的代码中,你可以完全避免使用构造函数,事实上:
axr492tv2#
构造函数应该只用于初始化对象的状态/字段。你应该把其他事情的责任委托给其他方法。注意构造函数只被调用一次,即每当你创建一个新对象的时候。在这里,在您的设计中,如果不创建
FactorialExample
对象,就无法计算数字的阶乘。相反,您应该在FactorialExample
中使用数字n
作为字段,并使用单独的方法来计算阶乘。kzmpq1sx3#
是的。如果输入足够大,你可以在构造函数中引发异常。
这是不应该使用构造函数来包含“业务逻辑”的几个原因之一。
在这种情况下,使用构造函数来执行计算和执行输出与良好实践背道而驰:
vxbzzdmp4#
这是一个问题,你试图实现与真实的世界的问题域在这种情况下阶乘。
如果构造函数拥有一切,那么构造函数知道许多其他对象。它变得依赖于所有这些对象。
添加功能时:
示例:如果我想要员工可以围坐在table周围的所有职位,该怎么办?上面的类将不能,因为它对创建的依赖性太强。
因此,您将不得不扩展域以包含重载的构造函数,并且很快您将意识到,随着依赖关系的增加和特定于域的对象的增加,它变得不可维护。
最好的编程实践是将其拆分。
领域驱动设计中提出的服务概念。最好现在阅读不同的设计模式,特别是http://en.wikipedia.org/wiki/Design_Patterns#Creational
工厂和为什么我们使用它们创建对象而不指定对象的确切类的问题http://en.wikipedia.org/wiki/Factory_method_pattern
然后我建议继续阅读依赖注入和控制反转以及为什么/如何解耦代码。
http://martinfowler.com/articles/injection.html
希望这对你有帮助!
efzxgjgh5#
在本例中,
fact
是构造函数中的局部变量。它甚至不在构造函数之外使用。因此,在这种情况下,不应使用构造函数。