下面的代码工作正常,但我想知道对象创建时间是否有任何问题。
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);
}
}
答案 0 :(得分:6)
是的,你是在正确的假设 - 不要在构造函数中使用业务逻辑。
最多初始化对象状态。
否则,异常处理,测试和模拟等问题可能会变得困难。
在您的代码中,您可以完全避免使用构造函数,实际上:
import java.util.Scanner;
public class FactorialExample {
int solve(int n){
int fact=1;
for(int i=1;i<=n;i++){
fact=fact*i;
}
return fact;
}
public static void main(String[] args) {
FactorialExample fe=new FactorialExample();
Scanner sc=new Scanner(System.in);
System.out.println("Enter any Integer Value:");
int value=sc.nextInt();
int solution = fe.solve(value);
System.out.println("tha factorail of a given number is::"+solution);
}
}
答案 1 :(得分:3)
构造函数应仅用于初始化对象的状态/字段。
您应该将其他事项的责任委托给其他方法。
请注意,只要您创建一个新对象,就只调用一次构造函数。在这里,在您的设计中,如果不创建FactorialExample
对象,则无法计算数字的阶乘。相反,您应该在n
中使用数字FactorialExample
作为字段,并使用单独的方法计算因子。
答案 2 :(得分:1)
是。如果输入足够大,则可能会在构造函数中导致异常。
这是您不应该使用构造函数来包含“业务逻辑”的几个原因之一。
在这种情况下,使用构造函数来执行计算和执行输出与良好实践相反:
答案 3 :(得分:0)
在你的情况下,fact
是构造函数中的局部变量。它甚至不在构造函数之外使用。所以在这种情况下不应该使用构造函数。
答案 4 :(得分:0)
这是一个问题,在这种情况下,你想要与现实世界的问题域一起实现什么。
如果构造函数包含所有内容,则构造函数知道许多其他对象。 它依赖于所有这些对象。
添加功能时:
示例:如果我想要员工可以坐在桌子旁边的所有位置怎么办?上面的类将不能,因为它太依赖于创建。
因此,您必须扩展您的域以包含重载的构造函数,很快您就会意识到,随着域特定对象的依赖性和群体的增加,它变得无法维护。
分割它是最好的编程习惯。
域驱动设计中提出的服务概念。 现在最好阅读有关不同设计模式的内容 http://en.wikipedia.org/wiki/Design_Patterns#Creational
工厂以及我们使用它们的原因 创建对象而不指定确切的对象类的问题 http://en.wikipedia.org/wiki/Factory_method_pattern
然后我建议继续阅读有关依赖注入和控制反转以及它为什么/如何解耦代码的内容。
http://martinfowler.com/articles/injection.html
希望这有帮助!