참조 객체를 값 객체로 변경(Change Reference to Value)

2757 단어

Summary:


너는 인용 대상이 하나 있는데, 매우 작고 변할 수 없으며, 관리하기가 쉽지 않다.그것을 값 대상으로 만들다.

Motivation:


인용 대상이 사용하기 어려워지기 시작하면 값 대상으로 바꿔야 할지도 모른다.인용 대상은 어떤 방식으로 제어되어야 하며, 항상 그 제어자에게 적당한 인용 대상을 요청해야 한다.그것들은 메모리 영역 사이의 복잡한 관련을 야기할 수 있다.분포 시스템과 병렬 시스템에서, 변할 수 없는 값 대상은 특히 유용하다. 왜냐하면 그것들의 동기화 문제를 고려할 필요가 없기 때문이다.
값 대상은 매우 중요한 특성을 가지고 있다. 그것은 변할 수 없을 것이다.언제든지 같은 대상의 같은 검색 함수를 호출하면 같은 결과를 얻어야 한다.만약 이 점을 보증한다면, 안심하고 여러 대상으로 같은 사물을 표시할 수 있다.값 대상이 가변적이라면, 어떤 대상에 대한 수정이 자동으로 다른 '같은 사물을 대표하는' 대상을 업데이트할 수 있도록 해야 한다.이 고통은 이보다 인용 대상이 되는 것이 낫다.
여기에는'변할 수 없다'는 뜻을 분명히 할 필요가 있다.머니류로'돈'의 개념을 나타내고 그중에'화폐의 종류'와'금액'이라는 두 가지 정보가 있다면 머니 대상은 통상적으로 변할 수 없는 대상이다.이는 임금이 변할 수 없다는 뜻이 아니라 임금을 바꾸려면 기존의 임금 대상을 대체하기 위해 다른 Money 대상을 사용해야 한다는 뜻이다. 기존의 임금 대상에서 수정하는 것이 아니라.너와 Money 대상 사이의 관계는 바꿀 수 있지만 Money 대상 자체는 바꿀 수 없다.

Mechanics:


1. 재구성 목표가 불변 대상인지 또는 불변 대상으로 수정할 수 있는지 확인한다.
객체가 아직 변경되지 않은 경우 변경되지 않을 때까지 Remove Setting Method를 사용합니다.
이 대상을 변경할 수 없으면 이 재구성을 사용하지 마십시오.
2. equals()와 hashCode()를 설정합니다.
3. 컴파일, 테스트.
4. 공장 함수를 삭제할 수 있는지 고려하고 구조 함수를public로 성명한다.

예제


"통화 종류"를 나타내는 Currency 클래스부터 시작하겠습니다.
public class Currency
{
    private String code;

    public String getCode()
    {
        return code;
    }

    private Currency( String code )
    {
        this.code = code;
    }
}

이 종류가 하는 일은 화폐 종류 코드를 저장하고 되돌려 주는 것이다.참조 객체이므로 인스턴스를 얻으려면 다음과 같이 해야 합니다.
4
Currency usd = Currency.get("USD");
Currency 클래스는 모든 Currency 인스턴스를 포함하는 체인 테이블을 유지합니다.Currency 구조 함수는private이기 때문에 구조 함수를 직접 사용하여 실례를 만들 수 없습니다.
인용 대상을 값 대상으로 바꾸려면, 관건적인 동작은 그것이 변할 수 있는지 확인하는 것이다.그렇지 않으면 이 재구성을 사용할 수 없습니다. 가변적인 값 대상은 짜증나는 별명 문제를 일으킬 수 있기 때문입니다.
여기서 Currency 대상은 변할 수 없기 때문에 다음 단계는 equals () 를 정의하는 것입니다.
public boolean equals( Object arg )
 {
     if( !( arg instanceof Currency ) )
     {
          return false;
     }
     Currency other = ( Currency ) arg;
     return ( code.equals( other.getCode() ) );
}

equals () 를 정의했으니hashcode () 를 동시에 정의해야 합니다.hashcode () 를 실현하는 간단한 방법은 equals () 에서 사용하는 모든 필드의hash 코드를 읽고 비트레이트 (^) 동작을 하는 것입니다.이 예에서는 equals ()가 하나의 필드만 사용했기 때문에 쉽게 실현할 수 있습니다.
4
public int hashCode()
{
    return code.hashCode();
}
이 두 함수를 완성한 후에 우리는 컴파일하고 테스트할 수 있다.이 두 함수의 수정은 동시에 진행해야 합니다. 그렇지 않으면hash에 의존하는 모든 집합 대상 (예를 들어Hashtable,HashSet,HashMap) 에서 의외의 행동이 발생할 수 있습니다.
현재, 우리는 임의의 여러 개의currency 대상을 만들 수 있으며, 구조 함수를public로 성명하여, 직접 구조 함수로currency 실례를 가져와서,currency 클래스의 공장 함수와 제어 실례 창설 행위를 제거할 수 있다.

좋은 웹페이지 즐겨찾기