当前位置: 首页 > 知识库问答 >
问题:

在Java中从构造函数调用静态方法

居焱
2023-03-14

我是新爪哇,目前正在大学读一门课程。我们使用Java编程早期对象作为课程文献。我有一个关于新对象构造函数的问题。这本书非常明确地指出,“即使这样做是可能的,也不要从构造函数调用方法。”

这是所有的方法吗,句号?我理解从构造函数调用类自己的实例方法的问题。但是帮手方法等?

这可以接受吗?如果没有,我想你不能在构造函数中使用任何Java数学util函数或类似的东西?

public class TestClass {

    private int number;

    // Only allow construction if number is greater than one
    TestClass(int number) {
        if (NumberUtils.isGreaterThanOne(number)) {
            this.number = number;
        } else {
            throw new IllegalArgumentException("Number must be above 1");
        }
    }
}
public class NumberUtils {
    
    // Helper method to check if number is greater than one
    public static boolean isGreaterThanOne(int number) {
        return number > 1;
    }
}

共有1个答案

呼延鹏云
2023-03-14

即使这样做是可能的,也不要从构造函数调用方法。

嗯,正如我在注释中所说的,从构造函数调用方法是完全可以的。要么作者没有真正理解这一切,要么这句话措辞不佳。

>

  • 调用当前构造的实例的可重写方法会导致问题,因为它会泄漏半构造的对象。更多信息请参见此处。但看起来你已经意识到这一点了。

    但对于所有其他情况,调用另一个方法根本不会造成问题。当您调用一个方法时,它将被执行,当它返回时,控制将被传递回构造函数,构造函数愉快地继续构造对象。

    您的代码绝对没有问题:

    TestClass(int number) {
        if (NumberUtils.isGreaterThanOne(number)) {
            this.number = number;
        } else {
            throw new IllegalArgumentException("Number must be above 1");
        }
    }
    

    如果不能从构造函数调用其他方法,则必须在构造函数本身中实现isgreaterthanone所使用的检查。但相反,您可以愉快地将其委托给一个单独的方法,该方法可以单独测试。所以您实际上是在验证输入,这是应该完成的。

    TestClass(int number) {
        // This check here immediately throws an exception if number has an
        // invalid value. This is called a a guard clause, and are usually
        // positioned at the top of the method or constructor.
        if (!NumberUtils.isGreaterThanOne(number)) {
            throw new IllegalArgumentException("Number must be above 1");
        }
    
        // Continue with normal operation
    }
    

    但这只是写同样逻辑的另一种方式。

  •  类似资料:
    • 问题内容: 什么时候应该使用构造函数,什么时候应该使用静态方法? 您能用小片段解释一下吗?我略读了一些线程,但是我仍然不清楚。 问题答案: 当您只想返回该类型的新对象并且希望简单时,请使用公共构造函数。 一个很好的例子是StringBuilder,因为它是可变的,您可能每次都想要一个新对象。 当您可能想重用对象(尤其是不可变的对象),返回子类或描述结构时,请使用静态因子方法。一个很好的例子是Enu

    • 本文向大家介绍C#静态构造函数?相关面试题,主要包含被问及C#静态构造函数?时的应答技巧和注意事项,需要的朋友参考一下 最先被执行的构造函数,且在一个类里只允许有一个无参的静态构造函数 执行顺序:静态变量>静态构造函数>实例变量>实例构造函数  

    • 问题内容: 对不起任何较小的语法错误或其他错误,我正在使用Jitsi模块进行此操作,并且对Java不太熟悉,因此想确认正在发生的事情以及为什么以及如何对其进行修复。 使用按名称加载类方法创建类B的实例时,应用程序正在执行此操作: 在类B中调用重写的load() 初始化变量(根据调试器调用“私有字符串testString = null”),将其无效。 这是预期的Java行为吗?是什么原因造成的?它是

    • 所以我在学习java继承,我遇到了一个我不知道如何解决的问题。 我要做的是从超类中调用一个子类构造函数。我不知道这是否有任何意义,但我会尝试用一个例子来解释我自己。 我为什么要这么做? 我希望能够主要不必处理智能手机。 我希望能够做到:

    • 本文向大家介绍解析C#中的私有构造函数和静态构造函数,包括了解析C#中的私有构造函数和静态构造函数的使用技巧和注意事项,需要的朋友参考一下 私有构造函数 私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。例如: 声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问

    • 用参数1导数创建的基构造函数导数线程正在用参数1运行 但是在JAVA中启动一个线程调用构造函数中的抽象方法安全吗?因为,就我所知,在C++和C#中,它在大多数情况下是不安全的。谢谢!