我希望能够实例化一个基于Moose的对象添加到它,直到我序列化它,然后我想使它不可更改。我该怎么做/应该怎么做?使对象实例不可变
使对象实例不可变
回答
我不知道(也不可能很容易找到)的任何模块,以做到这一点的CPAN这是令人惊讶,但也解释了为什么你修改了你的所有属性的“前”问:-)
一是解决这个问题的明显方法。我确定有一种合适的元编程方法可以获得所有属性访问器的列表并应用修饰符,但我很想用一个大的评论明确列出它们。
你有没有考虑过你是否有一两个课(Thingy,LockedThingy)?如果你倾向于这种方式,两个班会让你把元智慧封装起来。
我会做两个阶级,一个共同的角色:
package Thing
use Moose::Role;
has some_attrib => (isa => 'AnotherThing');
### Behaviour (the important stuff) goes here
package ImmutableThing;
use Moose;
with 'Thing';
has +some_attrib => (is => 'ro');
sub finalize { shift }
package MutableThing
use Moose;
with 'Thing';
has +some_attrib => (is => 'rw');
sub finalize {
my $self = shift;
Thing->new({some_attrib => $self->some_attrib});
}
我不知道具有相同类的可变和不可变的形式必然是,虽然是个好主意。我倾向于将构建时间和运行时间考虑为具有不同接口的两个不同阶段。
我会更倾向于编写一个参数收集器(我已将它大写为它的样式,但我没有在文献中看到过),它具有优化的界面以收集创建事物所需的信息,以及本身的东西,这是对象使用其余的程序。
我认为你要找的术语是工厂,它知道如何构造一个物体 – xenoterracide
嗯,是的,有点。但我期待通过多个方法调用收集所需的参数。但那可能只是我误解了一家工厂。 –
不,我猜不是,实际上有效的Java有一种构建模式,因为它不支持构造函数的散列。另一方面,我开始怀疑,这是否并非都归结为不将undef视为构造函数中未设置的。 – xenoterracide
- 1. 实例化不可变配对对象
- 2. 使用可变数量的参数实例化一个对象
- 3. 使AS3/Flex类可扩展但不可实例化为对象?
- 4. 使用不同类中的对象的实例变量
- 5. 获取对象的实例变量
- 6. 从变量实例化新对象
- 7. 在javascript中变更对象的实例
- 8. 创建不可变的对象,实例化而不需要新的
- 9. Java对象实例 - 什么不对的:
- 10. 用于添加多个对象实例的可变参数
- 11. 与对象initialisers不可变对象
- 12. 对象实例化
- 13. MongoDB对象实例
- 14. 实例vs对象
- 15. 实例化对象
- 16. 在对象实例
- 17. 对象实例化
- 18. 对象与实例
- 19. String对象实例
- 20. 将可变对象转换为不可变对象
- 21. 不可变对象内的可变对象
- 22. 可变对象和不可变对象之间的区别
- 23. 未设置对象实例的对象变量
- 24. 对象实例变为非对象在测试功能
- 25. 的Javascript:设置对象变量内的对象实例
- 26. Hibernate不可变值对象
- 27. 对象不可变异
- 28. 有效不可变对象
- 29. ActionScript - 从实例实例化新对象?
- 30. 未设置为实例或对象的实例对象。 Visual Basic
我已经考虑了很多事情......我诚恳地可以弄清楚如何通过拖把来做到这一点,但我有点被问到如何去做所有的想法。 – xenoterracide