当前位置: 首页 > 面试题库 >

为什么从构造函数中调用Set方法不是一个好主意?

蒋高杰
2023-03-14
问题内容

是仅在继承还是大多数情况下才是正确的?

public class MyClass {
   public int id;

     public MyClass() {
         // Some stuff 
         setId(5);
     }

     public setId(int id) {
         this.id = id;
     }
}

问题答案:

这是真的。

因为二传手总是public方法。如果您的课程不是,final那么就会出现外来方法调用的问题。这不是线程安全的,即称为转义this引用。因此,从构造函数中,如果要调用方法,则应为finalprivate。其他safe initialization对象将不会发生,这会在实际系统中导致许多错误。

除了上述内容之外,我们永远不要public从中调用method,constructor因为
如果该类旨在继承,则Constructor不得直接或间接调用可重写的方法

如果违反此规则,将导致程序失败。超类构造函数在子类构造函数之前运行,因此子类中的重写方法将在子类构造函数运行之前被调用。如果重写方法依赖于子类构造函数执行的任何初始化,则该方法将无法正常工作。

来源。



 类似资料:
  • 问题内容: 在Java中,为什么从构造函数中调用方法被认为是不好的做法?如果该方法计算量大,是否特别糟糕? 问题答案: 首先,通常在构造函数中调用方法没有问题。这些问题特别涉及调用构造函数的类的可重写方法以及将对象的引用传递给其他对象的方法(包括构造函数)的特殊情况。 避免重载方法和“泄漏” 的原因可能很复杂,但它们基本上都与防止使用未完全初始化的对象有关。 避免调用可覆盖的方法 避免在构造函数中

  • 问题内容: eval函数是一种动态生成代码的强大而简便的方法,那么有哪些警告? 问题答案: 错误使用 eval会 打开代码以进行注入攻击 调试 可能会更具挑战性(没有行号等) 评估的代码执行速度较慢(没有机会编译/缓存评估的代码) 编辑:正如@Jeff Walden在评论中指出的那样,今天#3的真实性要低于2008年。但是,尽管可能会缓存一些已编译脚本,但这只会限于未经修改就重复的脚本。更有可能的

  • 问题内容: Java 1.5 的Java序列化规范说: 对于可序列化的对象,运行第一个不可序列化超类型的no- arg构造函数。对于可序列化的类,将字段初始化为适合其类型的默认值。然后,通过调用特定于类的readObject方法来恢复每个类的字段,如果未定义这些字段,则通过调用defaultReadObject方法来恢复它们。请注意,在反序列化期间,不会为可序列化的类执行字段初始化程序和构造函数。

  • 根据我的理解,当创建了临时对象时,将调用move构造函数。这里,函数返回一个临时对象,但我的程序没有打印来自移动构造函数的消息:

  • 考虑以下类来演示Java中的内部类行为。主代码在方法中。其余的只是管道代码。 我只是打印下面的javap输出隐藏的构造函数: 通常情况下,编译器确保子类构造函数在初始化自己的字段之前首先调用超类构造函数。这有助于正确构造对象,但我发现编译器为内部类生成的构造函数与规范行为不符。为什么会这样?是否由JLS指定? 附言:我知道内部类包含对外部类的隐藏引用,该引用在上面的javap输出中设置。但问题是为

  • 问题内容: 这是面试中提出的问题。如果一个类在Java中何时有多个构造函数,我们可以从另一个构造函数调用另一个函数吗? 问题答案: 可以,我知道的语法是 您还可以通过以下方式调用超类的构造函数 这两个调用只能作为构造函数中的第一条语句完成(因此,您只能在执行其他任何操作之前调用另一个构造函数)。