불변성

1932 단어
불가변 대상은 틀림없이 라인이 안전할 것이다
그럼 불변의 대상은 무엇일까요?
조건을 충족시킬 때야말로 대상이야말로 변할 수 없는 것이다.
  • 대상이 만들어진 후에는 상태를 수정할 수 없음
  • 대상의 모든 영역은final 유형
  • 대상이 올바르게 만들어졌습니다(대상이 만들어지는 동안this 인용이 나오지 않음)
  • 우리는 이전의 인수 분해 예로 돌아가서 불변류를 구성하여 동기화를 실현한다.
    class OneValueCache{
        private final BigInteger lastNumber;
        private final BigInteger[] lastFactors;
    
        public OneValueCache(BigInteger i, BigInteger[] factors){
            lastNumber = i;
            lastFactors = Arrays.copyOf(factors, factors.length);
        }
    
        public BigInteger[] getFactors(BigInteger i){
            if (lastNumber == null || !lastNumber.equals(i)) {
                return null;
            } else {
                return Arrays.copyOf(lastFactors, lastFactors.length);
            }
        }
    }
    
    public class VolatileCachedFactorizer implements Servlet{
        private volatile OneValueCache cache = 
            new OneValueCache(null,null);
    
        public void service(ServletRequest req, ServletResponse resp){
            BigInteger i = extractFromRequest(req);
            BigInteger[] factors = cache.getFactors(i);
            if (factors == null) {
                factors = factor(i);
                cache = new OneValueCache(i, value);
            }
            encodeIntoResponse(resp, factors); 
        }
    }
    

    OneValueCache가 불변 클래스인 것을 볼 수 있으며, 라인의 안전성과 가시성을 확보하기 위해volatile 키워드를 사용합니다.
    그러나 주의해야 할 점은final 형식의 필드가 가변 대상을 가리키면 이 필드가 가리키는 대상의 상태에 접근할 때 동기화가 필요하다는 것이다
    public final class ThreeStooges {
      private final Set stooges = new HashSet();
    
      public ThreeStooges() {
        stooges.add("Moe");
        stooges.add("Larry");
        stooges.add("Curly");
      }
    
      public boolean isStooge(String name) {
        return stooges.contains(name);
      }
    
      public synchronized Set getStooges(){
        return stooges;
      }
    }
    

    위와 같이,stooges 변수는 가변 대상이기 때문에, 우리가 접근할 때,synchronized 키워드를 붙여서 동기화를 확보해야 한다.

    좋은 웹페이지 즐겨찾기