繁体   English   中英

类类型变量或在构造函数/方法中实例化之间有什么区别

[英]what's the difference between class type variables or instantiating in a constructor/method

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

我为什么要在另一个类的构造函数中实例化一个类? 我还没有完全理解构图,所以我对所有事物的“为什么”都模糊不清

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

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

实例化MotoXCell时,构造函数将运行并实例化BlueToothSpeaker,而方法仅在被调用时实例化新类。

成员初始化有两种类型,每种都有优点和缺点,我将尝试枚举它们:

  1. 早期初始化

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

    • 按需完成,通常在其吸气剂内
    • 优点:
      • 仅在首次需要时才创建该对象,从而减少其CPU /内存使用量
      • 与上下文无关,如果根本不需要该成员,则不会创建该成员
    • 缺点:
      • 您将需要始终通过“父”类中的getter访问成员,否则您可能会崩溃
      • 处理多线程时必须小心(例如必须使用锁),这会对性能产生影响

根据课程的实施情况,您可以选择一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM