2011-08-12 2 views
2

Java의 String 클래스와 같이 인턴을 지원하는 클래스가 필요합니다. 클래스의 인스턴스를 만들 때 동일한 매개 변수가있는 참조가 이미있는 경우 기존 참조를 반환해야합니다. 그렇지 않으면 새로운 참조를 리턴해야합니다. 이러한 것을 :인턴을 지원하는 객체를 만드는 데 좋은 패턴이 있습니까?

Foo a = new Foo(5); 
Foo b = new Foo(5); 
Foo c = new Foo(6); 
a == b 
a != c 

1)은 기존 개체의 테이블을 유지하기 위해 공장의 작업, 또는 테이블은 일반적으로 클래스 자체 내에서 단지 정적 변수인가?

2) 기존 개체의 테이블은 무엇입니까? 인스턴스가 요청 될 때마다 검색하는 객체 집합입니까? 아니면 키가 객체이고 값이 매개 변수 인지도입니까?

+0

'String'소스를 보았습니까? – Paul

+0

String은 intern 메서드에 네이티브 코드를 사용합니다. – Jim

+1

저는 궁금합니다. 왜 인턴쉽을 지원하는 대상이 필요합니까? –

답변

0

당신은 기존 개체를 재사용하지 않습니다 new 연산자와 함께이 작업을 수행 할 수 없습니다. 이 작업을 수행하는 가장 좋은 방법은 공장입니다. (이 클래스의 정적 인 newInstance 메소드만큼 쉽습니다.)이 데이터 구조는 일종의 Map (일반적으로 HashMap)입니다. 세트는 훨씬 비쌉니다. 객체의 수에 따라 배열을 사용할 수 있습니다. (나는 이것이 Byte가하는 것일 수도있다.)

String 객체는 자동으로 유지되지 않으며 intern을 호출하면 다른 String 인스턴스를 반환 할 수 있다는 점에 유의하십시오. 예를 들어,이 코드는 "false"를 출력 할 것이다 :

String a = new String("hello"); 
String b = new String("hello"); 
a.intern(); 
b.intern(); 
System.out.println(a == b ? "true" : "false"); 
+0

그래서 내 Foo 클래스는'정적 맵 m'과'Foo newInstance (Integer i)'를 포함 할 것이고'm.containsValue (i)'인지 확인하겠습니까? 두 곳 (객체와지도)에서 매개 변수를 유지해야한다는 것이 이상하게 보입니다. – Jim

+1

그러나 3 번과 4 번줄은 아무 것도하지 않습니다. 그것들을'a = a '로 변경하십시오.intern()'과'b = b.intern()'을 호출하고 "true"를 반환합니다. – cgull

+0

@cgull 3 호선은'a'가 아닌 무언가를합니다. 이 예제의 요점은 (아마도 내가 분명히하지는 않았지만) 설정 될 수있는 인턴의 종류에 관계없이'new'가 항상 별개의 객체를 반환한다는 것입니다. –

0

타사 의존성이 구글 구아바와 Interners 클래스를 고려해 추가 할 수 있습니다. 그것은 두 명의 단순한 내면을 가지고 있습니다 : WeakInternerStrongInterner. StrongInternerConcurrentMap으로 뒷받침되며 작고 닫힌 값 집합에 가장 적합합니다. 통제 할 수 없거나 어떤 방식 으로든 내선을 제한 할 수없는 경우 WeakReference에 의존하는 WeakInterner을 선택할 수 있습니다. WeakInterner 사용에 대한 절충은 성능입니다.

관련 문제