我有一个简单的问题要问。
考虑两个代码示例,
// 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会反映该值。