다른 프로그래머가 내 서비스를 사용할 때 구현 및 클래스 이름이 필요하지 않도록 API를 만들려고합니다. 이 서비스는 "항목"에 대한 다양한 작업을 수행하지만 항목에 대한 요청을 처리하는 방법에 대한 주된 기여 요인은 사용자 유형을 기반으로합니다. 지금까지 인터페이스 (Item
)와 구현 서비스 (ItemService
)를 보유하고 있으며 여기에서 확장 된 여러 사용자 유형 클래스 (예 : CompanyItemService
)가 있습니다. 그러나유형 특정 구현을 숨기기위한 Java 제네릭?
User company = new Company();
//stuff
Item item = new ItemService<Company>(company)
item.belongsToUser();
: 나는 같은 호출로 내 서비스를 사용할 수 있도록하려면
public class ItemService<T extends User> extends Item {
User user;
public ItemService(User user) {
this.user = user;
}
@Override
public boolean belongsToUser() {
//Check all records
}
}
public class CompanyItemService<T extends Company> extends ItemService<Company> {
public CompanyItemService(Company user) {
super(user);
}
@Override
public boolean belongsToUser() {
//Check company specific records
}
}
public class User {
//Common user stuff
}
public class Company extends User {
//Company specific stuff
}
그래서 : 같은 Company
으로 사용자 유형은 슈퍼 클래스가 User
과 서브 클래스 인과 구조 이 작업을 수행 할 때 ItemService
의 메서드가 CompanyItemService
의 재정의 메서드 대신 호출됩니다. 클래스 CompanyItemService
에 속해 있다는 것을 알 필요가없이이 오버라이드 메소드를 얻을 수 있습니까?
건배,
Alexei Blue.
이 모든 것에 대한 일반적인 개념은 다른 사용자 유형이 발명되었을 때 필요하다면 다른 사용자 별 서비스를 추가하여 기존 코드를 그대로 둡니다. 또한 많은 사용자 유형이있는 경우에만 API를 사용하는 사람들이 ItemService
을 사용하고 나머지는 제네릭을 사용하도록 기억해야합니다.
나는지도, Class 확장 구현 된 UserService >> –
helios
답변을 주셔서 감사합니다 어니스트, 그래서 가설을 세우면 개별적으로 각각을 지정해야 할 필요가있는 독자적인 구현으로 많은 수의 사용자 유형이 있다고 가정합니다. –
@AlexeiBlue - @helios가 말한 것처럼'Map'을 사용하여 클래스 쌍에 대한 데이터를 보유 할 수 있으므로 코드 자체는 작게 유지됩니다.런타임시 속성 파일에서 해당 종류의 데이터를 읽거나 런타임에 코드에서 추가 속성을 설치할 수있는'registerItemService()'메소드를 제공하는 것이 가능합니다. 간단한 타입의 if-then은 괜찮습니다. –