为什么在Dart中类不满足条件就不能创建const对象

问题描述 投票:0回答:1

为了澄清,我问的是语言的设计决策以及编译器和执行器的内部工作原理。

在 Dart 中,从类创建 const 对象需要满足三个条件:

  1. 构造函数应该是 const 构造函数
  2. 类的每个属性都应该是final
  3. 构造函数不应该有主体

附注: 这个问题我自己来回答一下。但如果您能阅读我的答案并告诉我它是否错误或添加我不知道的信息,我将不胜感激

虽然不是我的问题的直接一部分,但我在下面附上了我为理解该问题的语言而进行的一系列测试: https://docs.google.com/document/d/1Y8IlOlzI5VGFLzLFlih1d7QgOdynUxvrF7Q3kd0OSwQ/edit?usp=sharing

dart class object compiler-construction constants
1个回答
0
投票

我的假设:

我们知道 Dart 创建了不同的构造函数来创建 const 和非常量对象(即使内部标记为 const 的构造函数也有一个非常量副本)。当编译器遇到 const 对象创建时,它可以自己创建一个 const 构造函数,但这会导致冗余(时间和内存方面),因为与类的代码段内存分配有关的问题和预编译头文件。因此类本身最好将构造函数标记为 const 构造函数,因此规则 1.

对修改属性的限制以删除其 setter 方法的形式处理。方法对于类来说是通用的,并且不能在不创建类的不同版本的情况下区分 const 和非 const 对象。虽然,这很可能由编译器在内部实现,但 Dart 可能选择了利用现有机制的简单方法,这导致了规则 2。因为 Final 属性没有 setter 方法,所以无论该类是否有 const 构造函数.

对于规则 3, 我们想要为构造函数提供主体有两个原因:

  1. 在设置属性之前根据参数计算属性值。但要将计算出的值分配给正在创建的对象的属性,setter 函数必须存在。但它不适用于最终属性。所以这个用例不能应用。
  2. 创建副作用:但是由于 const 对象是在编译时创建的,我们期望哪些副作用是我们无法自己硬编码的?此外,它还限制编译器执行的传递顺序以及编译代码的方式。编码人员也可能对各种 const 对象创建的执行流程(相对于彼此以及代码的其余部分)抱有错误的期望。所以这个用例也不适用。

当这两个用例都不适用时(并且这两种情况都需要额外的工作来实现,通常在语言中,构造函数主体在创建对象后执行),为什么还要允许主体?如果我们需要从对象运行某些东西,我们可以在运行时使用类方法(而不是构造函数)来完成

© www.soinside.com 2019 - 2024. All rights reserved.