[英]Logic in constructor?
下面的代码工作正常,但我想知道在对象创建时间是否有任何问题。
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);
}
}
是的,你是在正确的假设 - 不要在构造函数中使用业务逻辑。
最多,初始化对象状态。
否则,异常处理,测试和模拟等问题就会变得困难。
在您的代码中,您可以完全避免使用构造函数,实际上:
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);
}
}
构造函数应仅用于初始化对象的状态/字段。 您应该将其他事项的责任委托给其他方法。 请注意,构造函数只调用一次,即每当您创建一个新对象时。 在这里,在您的设计中,如果不创建FactorialExample
的对象,则无法计算数字的FactorialExample
。 相反,您应该在FactorialExample
使用数字n
作为字段,并使用单独的方法来计算阶乘。
是。 如果输入足够大,则可能会在构造函数中导致异常。
这是您不应该使用构造函数来包含“业务逻辑”的几个原因之一。
在这种情况下,使用构造函数来执行计算和执行输出与良好实践相反:
在你的情况下, fact
是构造函数中的局部变量。 它甚至不在构造函数之外使用。 所以在这种情况下不应该使用构造函数。
它是一个问题,在这种情况下,你正在尝试与现实世界的问题域一起实现。
如果构造函数包含所有内容,那么构造函数就会知道许多其他对象。 它依赖于所有这些对象。
添加功能时:
示例:如果我想要员工可以坐在桌子旁边的所有位置怎么办? 上面的类将不能,因为它太依赖于创建。
因此,您必须扩展您的域以包含重载的构造函数,很快您就会意识到,随着域特定对象的依赖性和群体的增加,它变得无法维护。
分割它是最好的编程习惯。
域驱动设计中提出的服务概念。 现在最好阅读不同的设计模式,特别是http://en.wikipedia.org/wiki/Design_Patterns#Creational
工厂以及为什么我们使用它们创建对象的问题而不指定确切的对象类 http://en.wikipedia.org/wiki/Factory_method_pattern
然后我建议继续阅读依赖注入和控制反转以及为什么/如何解耦代码。
http://martinfowler.com/articles/injection.html
希望这可以帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.