在 dart 中将 final 变量设为私有是多余的吗?

Is it redundant to make final variables private in dart?

下面的class有多个参数,但只有一些需要是final;我的问题是,我是否也应该将这些最终变量设为私有,或者这样做是否多余?

class Car {
    final double _galInFullTank;
    get galInFullTank => _galInFullTank;
    double _miDrivenToEmpty;
    get miDrivenToEmpty => _miDrivenToEmpty;
    double _mpg;
    get mpg => _mpg;

    void update(double newMiDrivenToEmpty) {
        _miDrivenToEmpty = newMiDrivenToEmpty;
        _mpg = _miDrivenToEmpty/_galInFullTank;
    }

    Car({galInFullTank = 12, miDrivenToEmpty = 300}) :
        _galInFullTank = galInFullTank,
        _miDrivenToEmpty = miDrivenToEmpty,
        _mpg = miDrivenToEmpty/galInFullTank;
    }
}

它有一些 use-cases。它可以用于down-cast个变量。

例如,使用 RxDart 我们可以:

final BehaviorSubject<Foo> _foo;
Stream<Foo> get foo => foo;

这隐藏了实现细节。

它也可以用来在 getter 中做额外的事情。例如,Mobx 使用它来了解使用了哪些值。

但是直接公开变量而不进行修改或额外计算是没有意义的。

创建私有成员final 并不是多余的。一般来说,私有和 final 是正交的。例如,考虑如下内容:

class Foo {
  final List<int> someList;
}

仅仅因为 Foo.someListfinal 并不能阻止外部代码修改它(例如 someFoo.someList.clear())。

您应该将不想成为您 API 一部分的内容设为私有。