Joshua Bloch의 Effective Java에 설명 된 일반 유형의 안전한 컨테이너 패턴을 사용하고 싶지만 enum을 사용하여 키로 사용할 수있는 클래스를 제한하고 싶습니다. 아래는 Joshua의 책에서 발췌 한 코드입니다.타입 안전 이성 컨테이너의 키 제한
비슷한 클래스를 작성하고 싶지만 "Dog.class"및 "Cat.class"라고 말하도록 키를 제한하고 싶습니다. 이상적으로, 수용 가능한 키는 열거 형에 의해 기술되고 "RestrictedFavorites"클래스는 열거 형의 멤버를 키로 사용합니다. 컴파일러가 나를 위해 (타입 안전성, 열거 형, 제한에 의한 제한) 컴파일러를 얻을 수 있는지는 잘 모르겠지만 누군가에게 제안이 있다면, 나는 모두 귀입니다. 다음은 컴파일 타임 검사가 아닌 런타임 검사를 사용하는 V1 시도이며 완전히 만족스럽지 않습니다. (내 자신의 질문에)
public class RestrictedFavoritesTest extends TestCase {
public void testPutFavorite() {
RestrictedFavorites myFavorites = new RestrictedFavorites();
myFavorites.putFavorite(RestrictedKey.INTEGER, 1);
myFavorites.putFavorite(RestrictedKey.STRING, "hey");
int expectedInt = myFavorites.getFavorite(Integer.class);
assertEquals(1, expectedInt);
String expectedString = myFavorites.getFavorite(String.class);
assertEquals("hey", expectedString);
}
public void testPutFavorite_wrongType() {
RestrictedFavorites myFavorites = new RestrictedFavorites();
try {
myFavorites.putFavorite(RestrictedKey.INTEGER, "hey");
fail();
} catch (IllegalArgumentException expected) {}
}
public void testPutFavorite_wrongClass() {
RestrictedFavorites myFavorites = new RestrictedFavorites();
try {
myFavorites.getFavorite(Boolean.class);
} catch (IllegalArgumentException expected) {}
}
}
은'지도'의 핵심으로'enum'을 사용하고'enum'의 속성에'Class' 유형을 저장합니다. –
이 방법을 시도했습니다. 내 질문에 예제를 추가했지만 컴파일되지 않습니다. 내가 뭔가를 알아낼 수 있다면 더 좋은 버전을 반복하고 게시 할 것입니다. –
'getFavorite'에서 리턴 타입을'T'로 변환하십시오. 'Map'이 몇 가지 공통적 인 부모 클래스없이 유지할 수있는 인스턴스를 제한하려면 런타임 검사에 의존해야합니다. 여러분은 그 메소드를'enum '에 넣을 수도 있습니다 - 코드를 조금 정리하면됩니다. –