Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 在使用私有成员之前,类是否应该验证它们是否存在?_Oop_Constructor_Language Agnostic - Fatal编程技术网

Oop 在使用私有成员之前,类是否应该验证它们是否存在?

Oop 在使用私有成员之前,类是否应该验证它们是否存在?,oop,constructor,language-agnostic,Oop,Constructor,Language Agnostic,总是在方法使用类的私有成员之前验证它们是否存在是一个好主意 考虑这个例子: class Game() { constructor() { this._setupCamera(); this._updateCameraPosition(); } _setupCamera() { this._camera = new Camera(); } _updateCameraPosition() { this._camera.position.x =

总是在方法使用类的私有成员之前验证它们是否存在是一个好主意

考虑这个例子:

class Game() {
  constructor() {
    this._setupCamera();
    this._updateCameraPosition();
  }

  _setupCamera() {
    this._camera = new Camera();
  }

  _updateCameraPosition() { 
    this._camera.position.x = 500;
  }
}
如果重新排列构造函数中调用的顺序,则类将中断,因为尚未定义摄影机

这个例子看起来很傻,但我经常在大班遇到这个问题。构造函数中的初始化顺序变得很重要,但是,如果不检查私有成员,则没有任何内容强制执行调用顺序

我可以这样避免问题:

_updateCameraPosition() {
  if (!this._camera) {
    throw new Error('Camera is not defined!');
  }

  this._camera.position.x = 500;
}

在使用私有成员之前总是检查它是否已定义是一个好主意吗?

根据经验,在
构造函数运行完成之前,您不能对对象的状态(对象的(私有)字段)做出任何断言;至少在Java中,这样的行为是没有定义的

因此,回答您的问题,最佳实践可能是在构造函数中初始化成员,然后在后期构造方法中修改。在复杂类中,您可能希望使用Factory设计模式

或者绝对要确保按照正确的顺序编写构造函数的实现:)

“在使用私有成员之前总是检查是否定义了它是个好主意吗?”

对。此外,将成员变量作为属性公开并使用是一种常见做法

如果从未调用setter,那么如果发现私有成员变量为null,就会在getter中动态创建一个小部件

private _myWidget;

private property MyWidget
{
  get
  {
    if (_myWidget == null)
      _myWidget = new Widget();

    return _myWidget;    
  }

  set
  {
    _myWidget = value;
  }
}