java 构造函数中的逻辑?

zlhcx6iw  于 2023-09-29  发布在  Java
关注(0)|答案(5)|浏览(105)

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

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);

    }
}
gpnt7bae

gpnt7bae1#

是的,你的假设是正确的--不要在构造函数中使用业务逻辑。
最多初始化对象状态。
否则,像异常处理、测试和模拟这样的事情就会变得很困难。
在你的代码中,你可以完全避免使用构造函数,事实上:

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);
    }
}
axr492tv

axr492tv2#

构造函数应该只用于初始化对象的状态/字段。你应该把其他事情的责任委托给其他方法。注意构造函数只被调用一次,即每当你创建一个新对象的时候。在这里,在您的设计中,如果不创建FactorialExample对象,就无法计算数字的阶乘。相反,您应该在FactorialExample中使用数字n作为字段,并使用单独的方法来计算阶乘。

kzmpq1sx

kzmpq1sx3#

是的。如果输入足够大,你可以在构造函数中引发异常。
这是不应该使用构造函数来包含“业务逻辑”的几个原因之一。
在这种情况下,使用构造函数来执行计算和执行输出与良好实践背道而驰:

  • 你有一个对象,它不包含状态,只在它的构造函数中工作。
  • 您没有与构造函数创建的对象进行交互,部分原因是它没有可供交互的方法或字段。
  • 你的构造函数如果被认为是一个方法,就违反了一个方法应该有一个单一目的的原则(通过执行计算和执行输出)。
vxbzzdmp

vxbzzdmp4#

这是一个问题,你试图实现与真实的世界的问题域在这种情况下阶乘。
如果构造函数拥有一切,那么构造函数知道许多其他对象。它变得依赖于所有这些对象。
添加功能时:
示例:如果我想要员工可以围坐在table周围的所有职位,该怎么办?上面的类将不能,因为它对创建的依赖性太强。
因此,您将不得不扩展域以包含重载的构造函数,并且很快您将意识到,随着依赖关系的增加和特定于域的对象的增加,它变得不可维护。
最好的编程实践是将其拆分。
领域驱动设计中提出的服务概念。最好现在阅读不同的设计模式,特别是http://en.wikipedia.org/wiki/Design_Patterns#Creational
工厂和为什么我们使用它们创建对象而不指定对象的确切类的问题http://en.wikipedia.org/wiki/Factory_method_pattern
然后我建议继续阅读依赖注入和控制反转以及为什么/如何解耦代码。
http://martinfowler.com/articles/injection.html
希望这对你有帮助!

efzxgjgh

efzxgjgh5#

在本例中,fact是构造函数中的局部变量。它甚至不在构造函数之外使用。因此,在这种情况下,不应使用构造函数。

相关问题