我推荐的解决方法
1,首选语言提供的功能
2,次选类库提供的功能
3,自己包装代理类,或返回深度拷贝,或使用aop
|
[c++] class config { public: const list<string> & get_attributes(){ return attrs; } private: list<string> attrs; }; |
[c#] public class someclass { private ilist attrs; public ilist getattributes(){ return arraylist.readonly(attrs); } } |
[java] public class someclass { private list attrs; public list getattributes(){ return collections.unmodifiablelist(attrs); } } |
效果
1,语言提供的功能可帮助在编译期进行检查,确保程序中连试图增删元素的代码都不存在;但对有意无意的const转型无能为力
2,类库提供的功能可帮助在运行期进行检查,确保程序中试图增删元素的操作都抛出异常
同步代理
问题为了对象的线程安全引入了同步机制,却使对象在单线程环境下付出了不必要的性能上的代价,曾经的例子如写时拷贝cow
我见过的解决方法
就是视而不见,不做任何处理,使用同步原语
|
[c#] public class someclass { [methodimplattribute(methodimploptions.synchronized)] public void add(string name){ attrs.add(name); } } |
[java] public class someclass { public synchronized void add(string name){ attrs.add(name); } }
|