gpt4 book ai didi

java - 从Java中的构造函数调用静态方法

转载 作者:行者123 更新时间:2023-12-02 18:26:30 29 4
gpt4 key购买 nike

我是 Java 新手,目前正在大学读一门类(class)。我们使用 Java 编程早期对象作为类(class)资料。我有一个关于新对象的构造函数的问题。书中非常明确地指出“即使可以这样做,也不要从构造函数中调用方法。”

这适用于所有方法吗?我理解从构造函数调用类自己的实例方法的问题。但是辅助方法等等?

我编了一个小例子。

下面是一个类的示例,该类的构造函数中需要一个整数。整数必须大于 1。

这可以接受吗?如果没有,我猜你不能在构造函数中使用任何 Java Math 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;
}
}

最佳答案

Even though it's possible to do so, do not call methods from constructors.

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

  • 调用当前正在构造的实例的可重写方法会导致问题,因为它会泄漏半构造的对象。 See here for more info 。但看来您已经意识到了这一点。

  • 此外,如果您将 this 从构造函数内传递给另一个方法,那么您将传递半构造的实例。坏的。不要这样做。

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

你的代码绝对没有问题:

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

如果从构造函数调用其他方法是不好的,则必须在构造函数本身中实现 ​​isGreaterThanOne 所采用的检查。但相反,您很乐意将其委托(delegate)给一个单独的方法,可以单独测试该方法。因此,您实际上是在验证输入,这是应该完成的。


编写验证的另一种方法是编写保护子句:

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
}

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

关于java - 从Java中的构造函数调用静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70077485/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com