2012-02-21 4 views
2

나는 제네릭을 올바르게 이해하려고 노력하고 있으며 매우 간단한 팩토리를 작성했지만이 두 경고를 처리하는 방법을 볼 수 있습니다. 주변에 좋은 촌뜨기가 있었지만, 아마도 적절한 용어로 검색하지는 않을 것입니다.) 오! 나는 단지 경고를 삼가고 싶지 않다. 나는 이것을 할 수 있어야한다고 확신한다. .간단한 공장에서 java generics 사용 - 어떻게 이러한 경고를 피할 수 있습니까?

  • 유형 안전 : 생성자 simpleFactory (클래스) 원시 형 simpleFactory에 속한다. 제네릭 형식 simpleFactory에 대한 참조는 매개 변수화되어야합니다.
  • simpleFactory는 원시 형식입니다. 제네릭 형식 simpleFactory에 대한 언급은

나는이 실제로 컴파일에 실패 해결하기 위해 노력했습니다 모든 구조 매개 변수가 있어야합니다 - 이것은 내가 얻을 수있는 가장 가까운 것 같다. 그것은 경고를 생성하는 ++++로 표시된 라인입니다 (Eclipse Indigo에서 안드로이드 프로젝트를 위해)

저는 훌륭한 객체 팩토리가 있다는 것을 알고 있습니다 만, 실제로 팩토리를 만드는 것이 아니라 언어를 이해하는 것입니다.)

import java.util.Stack; 

public class simpleFactory<T> { 

private Stack<T> cupboard; 
private int allocCount; 
private Class<T> thisclass; 

public static simpleFactory<?> makeFactory(Class<?> facType) { 
    try { 
     facType.getConstructor(); 
    } catch (NoSuchMethodException e) { 
     return null; 
    } 
+++++ return new simpleFactory(facType); 
} 

private simpleFactory(Class<T> facType) { 
    thisclass = facType; 
    cupboard = new Stack<T>(); 
} 

public T obtain() { 
    if (cupboard.isEmpty()) { 
     allocCount++; 
     try { 
      return thisclass.newInstance(); 
     } catch (IllegalAccessException a) { 
      return null; 
     } catch (InstantiationException b) { 
      return null; 
     } 
    } else { 
     return cupboard.pop(); 
    } 
} 

public void recycle(T wornout) { 
    cupboard.push(wornout); 
} 
} 

답변

0

이 내 이전의 대답은 완전히 부서졌다 : 여기

는 소스입니다. 이것은 더 나은 공장 방법입니다.

public static <R> simpleFactory<R> makeFactory(Class<R> facType) { 
    try { 
     facType.getConstructor(); 
    } catch (NoSuchMethodException e) { 
     return null; 
    } 
    return new simpleFactory<R>(facType); 
} 

사용법 :

simpleFactory<String> factory = simpleFactory.makeFactory(String.class); 
+0

분명히 이것은 cutchin이지만 닭고기와 계란입니다. makeFactory 메소드가 정적이지 않은 경우, 작업중인 팩토리 또는 null을 반환하는 이점이 느슨합니다. 나는 생성자를 public으로 만들지도 모른다. 그러나 이것은 make가 처음 호출 될 때 실패 할 수 있다는 것을 의미한다. 정적 makefactory 메소드를 사용하면 팩토리가 설정 될 때 나중의 실패의 주요 이유를 확인할 수 있기 때문에 팩토리 클라이언트가 많이있다. 획득에서 오브젝트를 다시 얻지 못할 가능성이 적습니다. – pootle

+0

오, 죄송합니다. 정적으로 두십시오. 방금 작업 한 다른 클래스에 코드를 붙여 넣었고 해당 범위에서 정적 일 수 없습니다. 중요한 부분은 입니다. – cutchin

+0

아! 그래도 내가 대체하면 거기에 있었 니? 정적 메서드에서 T를 사용하면 - 정적이 아닌 형식에 대한 정적 참조를 만들 수 없음 T – pootle

1

은 그래서 중요한 부분은 당신이 실제로 클래스의 유형은 팩토리 메소드에 전달되는 캡처 할 수 있습니다. 클래스의 유형을 숨기는 동일한 식별자 (T)를 사용하고 있습니다. 약간의 혼동을 일으킬 수 있으므로 다른 식별자를 사용하는 것이 좋습니다.

또한 언급 된 cutchin과 같은 특정 유형으로 클래스를 인스턴스화해야합니다.

public static <T> simpleFactory<T> makeFactory(Class<T> facType) 
{ 
    try 
    { 
     facType.getConstructor(); 
    } 
    catch (NoSuchMethodException e) 
    { 
     return null; 
    } 
    return new simpleFactory<T>(facType); 
} 
+0

처음으로 깨진 코드를 게시하지 않으려 고 Upvoted! – cutchin

+0

OOh! 찾고있는 goood .... – pootle

+0

이것은 대답이다 - 그리고 정적 classname 나는 오랫동안 생각했을 문법이 아니었다. – pootle