[불변 클래스] 불변 클래스 디자인

2065 단어
2017-1-18 11:40:25 oye
다섯 가지 원칙
  • 객체 상태를 수정할 수 있는 어떠한 방법도 제공하지 마십시오
  • 보증 클래스가 확장되지 않습니다
  • 모든 도메인이 final
  • 모든 도메인을 비공개로 만듭니다
  • .
  • 가변 구성 요소에 대한 상호 배타적 접근을 확보합니다
  • Example Code:
    
    /**
     *  ( )
     * @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;
        }
    
        /**
         *  
         * @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:
  • 클래스 중의 사유역, 실부Complex와 허부re에 대해 클래스는 im로 정의하고 final 방법만 제공하여 클래스가 창설된 후에 바꿀 수 없음을 보장한다
  • 동시에 제공된 네 가지 기본 연산 방법은 모두 사유역을 바꾸지 않고 새로운 대상이 생겼다
  • Improvement: 더 유연하게 개선할 수 있는 방법은 나중에 추가합니다

    좋은 웹페이지 즐겨찾기