3 回答

TA貢獻1921條經驗 獲得超9個贊
我認為繼承不是最好的解決方案。我也認為構圖要好得多。這可以幫助您使用通用代碼并在需要更改功能的其他地方輕松更改它。
此外,它還允許您更輕松地測試所有類。
例如:
class CommonPojo {}
class CustomerPojo extends CommonPojo {}
class PartialCustomerPojo extends CommonPojo {}
interface IResourceValid {
boolean isResourceValid(CommonPojo pojo);
}
class CustomerPojoValidator implements IResourceValid {
@Override
public boolean isResourceValid(CommonPojo pojo) {
//your validation for customer
return false;
}
}
class PartialCustomerPojoValidator implements IResourceValid {
@Override
public boolean isResourceValid(CommonPojo pojo) {
//your validation for partial customer
return true;
}
}
class CommonResource{
private DBDao dbDao;
private AnotherAPI api;
private IResourceValid validator;
public IResourceValid getValidator() {
return validator;
}
//constructor for DI
public Response Create(CommonPojo commonPojo) {
//logic to validate customerpojo
//logic to ensure user isn't a duplicate
//some other validation logic
//finally user creation/saving to DB
validator.isResourceValid(commonPojo);
return response.ok(200).build();
}
}
//@Path("/internal")
class CustomerResource{
private CommonResource resource;
//constructor for DI
public Response Create(CustomerPojo CustomerPojo) {
return resource.Create(CustomerPojo);
}
}
//@Path("/external")
class ApiResource{
private CommonResource resource;
//constructor for DI
public Response Create(PartialCustomerPojo partialCustomerPojo) {
return resource.Create(partialCustomerPojo);
}
}
DBDao dao = new DBDao();
AnotherAPI api = new AnotherAPI();
CommonResource castomerCreator = new CommonResource(new CustomerPojoValidator(), dao, api);
CommonResource apiCreator = new CommonResource(new PartialCustomerPojoValidator(), dao, api);
CustomerResource customerResource = new CustomerResource(castomerCreator);
ApiResource apiResource = new ApiResource(apiCreator);
customerResource.Create(somePojo);
apiResource.Create(someAnotherPojo);

TA貢獻1784條經驗 獲得超7個贊
這可以通過以下兩種方式來實現
創建一個接口,然后在兩個目標類上實現,以便它們都可以提供本地實現
使用抽象類,然后擴展它。
接口不會使您免于編碼,而是使抽象類不強制執行任何操作的情況下保持內聯,因此兩者都有弱點。您可以實現多個接口,但只能擴展一個類。牢記這一點,我更傾向于接口
從 Java 8 開始。Java 支持使用接口的默認方法,我認為這是最好的方法。您可以在默認方法中提供默認實現,用戶可以根據需要覆蓋該方法。這將為您提供最好的接口和抽象類。
public interface CommonCode {
default public boolean create(CommonPojo commonPojo) {
//logic to validate customerPojo
//logic to ensure user isn't a duplicate
//some other validation logic
//finally user creation/saving to DB
Return response.ok(200).build();
}
}
@Path("/internal")
public class CustomerResource implements CommonCode {
private DBDao dbDao;
private AnotherAPI api;
//constructor for DI
create(CommonPojo)
}
@Path("/external")
public class ApiResource implements CommonCode {
private DBDao dbDao;
private AnotherAPI api;
//constructor for DI
create(CommonPojo)
}

TA貢獻1890條經驗 獲得超9個贊
有很多選擇,這完全取決于您使用的策略。我更喜歡使用抽象類并在其中制作非抽象方法。當您擴展抽象類時,您可以選擇要使用的方法。在您的場景中,它應該如下所示:
public abstract class AbstractResource {
private CustomerService customerService;
@Autowired
public void setCustomerService(CustomerService customerService) {
this.customerService = customerService;
}
public Response create(CustomerPojo customer) {
return customerService.createCustomerPojo(customer);
}
public Response create(PartialCustomerPojo customer) {
return customerService.createPartialCustomerPojo(customer);
}
}
CustomerResource @Override唯一需要的方法:
@Path("/internal")
@Component
public class CustomerResource extends AbstractResource {
@POST
@Override
public Response create(PartialCustomerPojo customer) {
return super.create(customer);
}
}
相同的ApiResource
@Path("/external")
@Component
public class ApiResource extends AbstractResource {
@POST
@Override
public Response create(CustomerPojo customer) {
return super.create(customer);
}
}
一切都在一個地方 - CustomerService,在那里你做你的邏輯。
@Service
public class CustomerService {
@Autowired
private AnotherAPI api;
@Autowired
private DBDao dao;
public Response createCustomerPojo(CustomerPojo customer) {
//logic to validate customerpojo
//logic to ensure user isn't a duplicate
//some other validation logic
//finally user creation/saving to DB
}
public Response createPartialCustomerPojo(PartialCustomerPojo customer) {
//logic to validate PartialCustomerpojo
//supplement partialCustomerPojo
//logic to ensure user isn't a duplicate
//some other validation logic
//finally user creation/saving to DB
}
}
如果要最小化重復,則必須使用接口并在每個類中實現:
public class CustomerPojo implements PojoInterface {
}
public class PartialCustomerPojo implements PojoInterface {
}
現在你只能有一個抽象方法:
public abstract class AbstractResource {
private CustomerService customerService;
@Autowired
public void setCustomerService(CustomerService customerService) {
this.customerService = customerService;
}
public abstract Response create(PojoInterface customer);
}
然后在“一個地方”,您需要檢查參數的每個實例:
public Response create(PojoInterface customer) {
if (customer instanceof CustomerPojo){
//logic to validate customerpojo
//logic to ensure user isn't a duplicate
//some other validation logic
//finally user creation/saving to DB
}else if (customer instanceof PartialCustomerPojo){
//logic to validate PartialCustomerpojo
//supplement partialCustomerPojo
//logic to ensure user isn't a duplicate
//some other validation logic
//finally user creation/saving to DB
}
}
編輯:對不起,很長的帖子......
添加回答
舉報