2017-1-18 11:40:25 oye
五條原則
- 不要提供任何會(huì)修改對(duì)象狀態(tài)的方法
- 保證類不會(huì)被擴(kuò)展(也有其他設(shè)計(jì)方法可以支持?jǐn)U展)
- 所有域都是
final
的 - 使所有的域都成為私有的
- 確保對(duì)于任何可變組件的互斥訪問(確保客戶端無法獲取指向可變對(duì)象的域的引用)
Example Code:
/**
* 復(fù)數(shù)(不可變類)
* @author zWX332481
*/
public final class Complex
{
private final double re;
private final double im;
public Complex(double re, double im)
{
this.re = re;
this.im = im;
}
/**
* 實(shí)部
* @return double
*/
public double realPart()
{
return re;
}
/**
* 虛部
* @return double
*/
public double imaginaryPart()
{
return im;
}
public Complex add(Complex c)
{
return new Complex(re + c.re, im + c.im);
}
public Complex subtract(Complex c)
{
return new Complex(re - c.re, im - c.im);
}
public Complex multiply(Complex c)
{
return new Complex(re * c.re - im * c.im, re * c.im + im * c.re);
}
public Complex divide(Complex c)
{
double tmp = c.re * c.re + c.im * c.im;
return new Complex((re * c.re + im * c.im) / tmp, (im * c.re - re * c.im) / tmp);
}
@Override
public boolean equals(Object o)
{
if (o == this)
return true;
if (!(o instanceof Complex))
return false;
Complex c = (Complex) o;
return Double.compare(re, c.re) == 0 && Double.compare(im, c.im) == 0;
}
@Override
public int hashCode()
{
return (17 + hashDouble(re)) * 31 + hashDouble(im);
}
private int hashDouble(double val)
{
long longBits = Double.doubleToLongBits(re);
return (int) (longBits ^ (longBits >>> 32));
}
}
Analysis:
- 針對(duì)
Complex
類中的私有域,實(shí)部re
和虛部im
,類將其定義為final
的,且只提供了getter
方法,保證了類在創(chuàng)建之后就無法改變 - 同時(shí)針對(duì)其提供的四個(gè)基本運(yùn)算方法,均未改變其私有域,而是產(chǎn)生一個(gè)新的對(duì)象
Improvement:
改進(jìn)的更靈活的方法晚些時(shí)候添加