飞镖:什么时候使用吸气剂对最后一场



我有一个简单的问题要问。

考虑两个代码示例,

// 1
class A {
final a = 23;
}
// 2
class A {
get a => 23;
}

在[2]中,最后一个字段被转换为getter。

问题:在什么情况下应该使用这两种代码?飞镖的首选方式是哪一种?

我认为没有首选的方法。你可以使用任何一种。它们的意思也不一定有任何区别。智能编译器可以转换为另一个,这取决于类的使用方式哪种更有效。

假设编译器不更改表示形式。

  • 最后一个字段在类的每个实例上引入一个内存槽,用于保存值,然后是一个读取该槽的通用getter
  • getter在类上引入了一个getter方法,该方法除了返回值之外什么都不做

哪个更好取决于类的使用方式。如果您只有很少的实例,那么每个实例上额外内存插槽的内存开销可以忽略不计。

如果编译器是智能的,它可能会跳过字段的隐式getter,直接读取slot。如果编译器是智能的,它可能也会内联显式getter。

总而言之,我不会担心会有什么不同。我个人倾向于getter,因为我更喜欢通过查看对象的字段来推断对象的状态,而最终的常值字段对状态没有真正的贡献。

在示例2中,a的值可能会随时间变化。

如果您想控制一个值,但允许其他类访问,那么您将使用一个带有公共getter的私有变量。

如果值永远不会改变,您可以考虑const/final/static

何时使用final字段:

考虑这个类别:

class Foo {
// This final field can have just one value no matter how many times it is read.
final int x = math.Random().nextInt(10); 
// This getter will return different value each time it is read. 
int get y => math.Random().nextInt(10);
}

何时使用getter:

在Flutter中,如果更改变量的值,热重载将不会反映该值,但getter会反映该值。

最新更新