【问题标题】:what's the difference between class type variables or instantiating in a constructor/method类类型变量或在构造函数/方法中实例化有什么区别
【发布时间】:2015-04-13 20:24:14
【问题描述】:
public class MotoXCellPhone {

    //assume there's a speaker class
    private BlueToothSpeaker speaker; 

    //why instantiate in constructor?

    MotoXCellPhone() {
        speaker = new BlueToothSpeaker();
    }

    //or if i instantiate in a method?
    public BlueToothSpeaker useSpeaker() {
        speaker = new BlueToothSpeaker();
        return speaker;
    }
}

为什么要在另一个类的构造函数中实例化一个类?我还没有完全理解作文,所以我对一切的“为什么”很模糊

【问题讨论】:

  • 如果已回答,请记得将您的问题标记为“已回答”。

标签: java design-patterns netbeans composition


【解决方案1】:

如果在方法中实例化它,则每次调用该方法时都会创建一个新的。如果这没有意义——如果你希望一个 BlueToothSpeaker 对象在其生命周期内绑定到 MotoXCellPhone 对象——那么你需要在构造函数中创建它(或注入它)。

【讨论】:

  • 谢谢!这对我来说更清楚。说我想将手机连接到扬声器(假设两个类中都有正确的方法/变量)我会使用将类引用作为实例变量吗?
  • 如果您希望扬声器成为手机的属性,您将有一个 BlueToothSpeaker 类型的字段来存储扬声器。
  • 即使扬声器是一个独立的对象,并且电话类只是“使用”了该扬声器对象,该逻辑是否仍然适用?
  • 在这种情况下,您可能希望将扬声器传递给构造函数,而不是实例化一个新的。
  • @Bryan 演讲者来自哪里?某些呼叫必须创建扬声器。 Louis Wasserman 提到的技术也称为Inversion of Control(并非来自此上下文,但仍适用于此处)
【解决方案2】:

参数如下:如果其他人使用你的代码,他们可能不会调用useSpeakser(),因此speakers可能是null。在构造函数中实例化speakers 断言它不会是null

【讨论】:

  • 好的,如果我的 MotoX 类要使用扬声器,我应该设置一个类引用实例变量,并在构造函数中实例化它?
  • 取决于您的应用程序。通常,更容易假设属性不是null。为方便起见,您可以在构造函数中调用useSpeaker(),避免代码重复。
【解决方案3】:

构造函数将在实例化 MotoXCell 时立即运行并实例化 BlueToothSpeaker,而该方法只会在调用它时实例化新类。

【讨论】:

    【解决方案4】:

    成员初始化有两种类型,各有优缺点,我试着列举一下:

    1. 早期初始化

      • 在声明成员时完成,或在类构造函数中完成
      • 优点:
        • 创建的对象与其“父对象”同时开始其生命周期,并且随时可用,无需进行任何检查
        • 在工人类的情况下,创建的对象可以立即开始工作
      • 缺点:
        • 更多 CPU/内存用于该对象
        • 根据上下文,对象可能永远不会被使用
    2. 延迟初始化

      • 按需完成,通常在其 getter 内完成
      • 优点:
        • 仅在第一次需要时创建对象,从而减少其 CPU/内存使用率
        • 不依赖上下文,如果成员根本不需要,则不会创建它
      • 缺点:
        • 您需要始终通过“父”类中的 getter 访问该成员,否则您可能会遇到崩溃
        • 在处理多线程时必须小心(例如,必须使用锁),这会影响性能

    根据你的类的实现,你可能会选择一个而不是另一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      相关资源
      最近更新 更多