제목이이 정의를 수행하는지 확실하지 않습니다. 저는 Java에 익숙하지 않고 한 클래스에서 다른 "서비스"를 사용하는 방법을 알아 내려고 노력하고 있습니다. 내가 APIRequest 클래스를 가지고 있다고 가정하면,이 클래스는 필요한 것에 따라 다른 API를 사용할 수 있어야합니다. 예. 패키지를 발송해야합니다. 패키지가 32OZ 이하인 경우 Endicia를 사용해야하고, 그렇지 않으면 FedEx를 사용해야합니다. FedexRequest와 EndiciaRequest라는 2 가지 "서비스"클래스가 있습니다. APIRequest 클래스가 패키지의 가중치에 따라 둘 중 하나를 사용하도록 허용하려고합니다. getService라는 정적 메서드가있는 APIService라는 클래스를 만들었습니다. ; 그래서 지금은 APIService.getService를 ("페덱스")을 호출 할 수 있습니다>과 같이 요청 클래스 ...자바에서 반환하고 다른 클래스를 사용하십시오.
public class APIService {
private static Map<String, Object> services = new HashMap<>();
private static final Map<String, String> availableServices = new HashMap() {{
put("fedex", "FedexRequest");
put("endicia", "EndiciaRequest");
}};
public static Object getService(String type) {
if(services.containsKey(type)) {
return services.get(type);
}
return null;
}
static {
for(Map.Entry<String, String> serv : availableServices.entrySet()) {
try {
Class<?> cls = Class.forName(serv.getValue());
services.put(serv.getKey(), cls.newInstance());
} catch(Exception e) {
services.put(serv.getKey(), new Class[1]);
}
}
}
}
- 그냥 문자열 이름의 맵을 작성 그러나 내가 ... 내가 좋아하는 뭔가를 할 필요가 있기 때문에, 내 APIRequest 클래스에서 그것을 사용하는 방법을 알아 내려고
this.service = (FedexRequest) APIService.getService("fedex");
//or
this.service = (EndiciaRequest) APIService.getService("endicia);
을 정말 힘든 시간을 보내고 있어요하지만 그 방정식의 전체 동적 부분을 나누기, 나중에 다른 서비스를 추가해야하는 경우 어떻게해야합니까? 나는 FedexRequest과 EndiciaRequest 모두 다음, 요청 인터페이스를 구현
this.service = (Request) APIService.getService("fedex");
를 사용 가진 시도했지만 그게 요청에 캐스트 할 수없는 말을 나에게 java.lang.Class의 오류를 제공합니다. 요청은 인터페이스이므로 구현 클래스에서 cls.newInstance()를 사용할 수 없으므로 인터페이스로 캐스팅됩니다.
필자는 APIRequest 클래스가 특별히 유형 캐스팅을 사용하지 않고 FedexRequest 또는 EndiciaRequest를 사용하여 동적 일 수 있고 모든 것을 다시 코딩하지 않고 나중에 서비스를 추가 할 수 있도록하는 방법에 대해 정말로 분실했습니다. 필자는 명시 적으로 타입을 정의 할 필요가 없기 때문에 PHP에서이 것이 매우 간단합니다. 어떤 도움이라도 대단히 감사하겠습니다. 고맙습니다.
https://en.wikipedia.org/wiki/Strategy_pattern – Nahum
이 당신의 접근 방식에 여러 가지 문제가 있지만 가장 즉각적인 당신이 상위 유형을 정의해야한다는 것 같습니다 (예를 들어,' interface ApiService')를 구현 유형 (class FedexService는 ApiService를 구현합니다. – chrylis
클래스를 키로 사용하고 getService에서 일부 generic을 사용해야합니다. public static T getService (클래스 type) {'또는 이와 비슷한 것 –