构造函数中的逻辑?

时间:2014-06-04 13:34:02

标签: java

下面的代码工作正常,但我想知道对象创建时间是否有任何问题。

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 个答案:

答案 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

希望这有帮助!