为带有可选参数的最终私有字段设置默认实例的最佳方法是什么?

What is the best way to set the default instance for a final private field with optional parameter?

给定一个 class 最终私有字段 _bar:

class Foo() {

final Bar _bar;

    Foo({Bar bar}) : _bar = bar {

        //error: list cannot be used as setter, it is final
       _bar = new Bar();
    }

}

试图在参数列表中设置它会导致此错误

//error: default values of an object must be constant
Foo({Bar bar: new Bar()}) : _bar = bar ..

我想保留可选参数,以便我可以在单元测试期间注入模拟。最好的方法是什么?

class Foo {
  final Bar _bar;
  Foo({Bar bar}) : _bar = bar != null ? bar : new Bar();
}

当逻辑很复杂时,我建议使用静态方法。

class Foo {
  final Object _field1;

  Foo({Object value1}) : this._field1 = _setUpField1(value1);

  static Object _setUpField1(Object value) {
    // Some complex logic
    return value;
  }
}