使用继承或委托来定义immutable classes
来源:互联网 发布:java开发软件要多少钱 编辑:程序博客网 时间:2024/05/17 23:32
1、Immutable interface(不可变接口)
假设你有一个表示圆圈的mutable class MutableCirle, 你想把它变成immutable object。
class MutableCircle{
private double radius;
public MutableCircle(double r){
radius = r;
}
public void setRadius(double r){
radius = r;
}
public double radius(){
return radius;
}
}
为了让这个class成为一个immutable class, 你可以声明一个immutable interface再由这个class去实现它。如:
interface ImmutableCircle{
public double radius();
}
class MutableCircle implements ImmutableCircle{
private double radius;
public MutableCircle(double r){
radius = r;
}
public void setRadius(double s){
radius = r;
}
public double radius(){
return radius;
}
}
由于immutable interface仅仅暴露底部class的non-mutating methods,可以通过这个interface访问的objects能保持不变性。
ImmutableCircle iwheel = new MutableCircle(6);
这种方法隐藏了setRadius方法。但是他人还是可以通过cast到MutableCircle去调用setRadius。
2、公共接口或公共基类
定义一个公用的接口或基类,然后在实现两个subclass 一个是mutable 一个immutable。
如:
interface PinNumbers{
public String accountOwner();
public int checkingPin();
public int savingsPin();
}
class MutablePinNumbers implements PinNumbers{
private String acctOwner;
private int checkingAcctPin;
private int savingAcctPin;
MutablePinNumbers(String owner,int cPin,int sPin){
acctOwner = owner;
checkingAccPin = cPin;
savingsAcctPin = sPin;
}
// 下面提供mutable函数实现代码。
pubic void setAccountOwner(String str){
acctOwner = str;
}
// 下面是每个field的getter// setter方法。
}
final class ImmutablePinNumbers implements PinNumbers{
private String acctOwner;
private int checkingAcctPin;
private int savingAcctPin;
ImmutablePinNumbers(String owner,int cPin,int sPin){
acctOwner = owner;
checkingAccPin = cPin;
savingsAcctPin = sPin;
}
// all fields getter method
}
3、不可变的委托类(immutable Delegation Class)
其实是复合的实现方式,将外界对他们的调用任务委托(delegates)给class内含的mutable object。 如:
上面的circle classes可以实现为。
class MutableCircle{
private double radius;
public MutableCircle(double r){
radius = r;
}
public void setRadius(double r){
radius = r;
}
public double radius(){
return radius;
}
}
final class ImmutableCircle{
private MutableCircle mCircle;
public ImmutableCircle(){
mCircle = new MutableCircle(r);
}
public double radius(){
return mCircle.radius();
}
}
书上说这种方式要以性能为代价, 我觉得这种实现更优秀, effective java 中说过 复合优与继承。
*所说的性能可能是表面上是immutable类但是实际上内部还是mutable类 所有性能代价更大。
- 使用继承或委托来定义immutable classes
- 谨慎地定义和实现immutable classes(不可变类)
- 使用RequireJS来加载MooTools Classes
- c++继承 与委托 使用
- 使用CLASS属性或CSSCLASS属性来定义文本或控件显示的样式表
- 使用委托来调用函数
- 使用服务端事件委托机制来防止页面重复提交数据或客户端浏览器使用(F5)刷新提交数据
- C#委托的简单学习:定义委托和使用、Func<int f1,out r1>、给自定义的类或数组排序(冒泡排序)
- paip.使用继承机制来实现控制反转或依赖倒置
- c#委托的定义与基本使用
- 委托的定义和使用入门
- C#事件与委托定义与使用
- c# 委托的定义及使用实例
- 如何:定义和使用委托 (C++/CLI)
- 201-委托的定义和使用
- 202-委托的定义和使用2
- 使用委托来减少if..else判断
- SCALA 集合框架文档翻译-Concrete Immutable Collection Classes
- WINDOWS系统服务详解
- 最近在研究Swept Volume的碰撞检测。
- IIS5.0(ASP)+sybase网站开发中遇到的BUG!!!
- 用delphi制作dll的方法
- 三个月搞定系花 匿名(很感人的故事)
- 使用继承或委托来定义immutable classes
- AAL:ATM 适配层(AAL0、AAL2、AAL3/4、AAL5)--网络大典
- 大家都不可以不看的一些网站
- AAL0 - AAL5:ATM 适配层类型0-5--网络大典
- 我的c学习心得(零碎收拢) 序:
- 超强的个人签名,你的怎么写?
- JDK的安装与配置
- Solaris开放源代码了
- decode [Oracle SQL][转贴]