D中的仅不可变类
如何创建一个不可变的类 我的目标是创建一个实例总是不可变的类。现在我只是用不可变的方法和构造函数创建一个“可变”类。我叫它mData,我代表可变的。然后我制作了一个别名D中的仅不可变类,d,D,如何创建一个不可变的类 我的目标是创建一个实例总是不可变的类。现在我只是用不可变的方法和构造函数创建一个“可变”类。我叫它mData,我代表可变的。然后我制作了一个别名别名不可变(mData)数据并在任何地方使用它,而不是类名。这很有效,但似乎没有必要 如果我用immutable(immutable class Data{…})标记类定义,那么就不会遵循类的用法。因此,如果我从另一个类或函数中使用它并调用不可变方法(它们都是),编译器会抱怨在可变对象上调用不可变方法,即使根据定义该类是不可变的!
别名不可变(mData)数据
并在任何地方使用它,而不是类名。这很有效,但似乎没有必要
如果我用immutable(immutable class Data{…}
)标记类定义,那么就不会遵循类的用法。因此,如果我从另一个类或函数中使用它并调用不可变方法(它们都是),编译器会抱怨在可变对象上调用不可变方法,即使根据定义该类是不可变的!为了解决这个问题,我必须在所有类型名称前面添加immutable关键字。这就是化名真正为我做的
别名真的是最好的方法吗?
不可变关键字对类定义有什么作用?
如果它什么也不做,这不应该是某种警告或错误吗
(在Windows 8上使用Xamarin Studio和dub以及DMD32 D编译器v2.066.0)我认为alias是最好的方法,再加上类外不可变的特性。后者的作用是:
如果一个类声明有一个常量、不可变或共享存储类,那么就好像该类的每个成员都是用该存储类声明的一样。如果基类是常量、不可变或共享的,那么从它派生的所有类也都是常量、不可变或共享的
因此,它避免了对内部所有内容设置不可变,也适用于继承。但是它并没有改变类型本身-数据
仍然是一个可变的引用,只引用所有不可变的数据(顺便说一句,这有时可能很有用,因为它可以很容易地重新绑定到另一个实例)。您的别名实现了类型的全部更改
顺便说一句,还要向不可变类添加构造函数。即使它只是空的,不可变构造函数的存在(如果您将不可变放在外部,这将是全部)将完全禁止可变构造:
immutable class Foo { }
Foo foo = new Foo(); // permitted. All the data will be immutable, but it will let you construct it this way
immutable class Foo {
this() {}
}
Foo foo = new Foo(); // Error: immutable method test100.Foo.this is not callable using a mutable object
那么你想用
auto foo = new immutable Foo(); // (infers based on right hand side)
你也可以这样写:
immutable foo = new immutable Foo(); // (infers always to an immutable type)
或
取决于你喜欢什么
immutable(Foo) foo = new immutable Foo(); // (explicitly writing the immutable type)