Java 如何避免没有继承的DTOs重复?
我正在连接许多社交网络,以便在我的应用程序中登录。 我对每个社交网络响应都有一个DTOJava 如何避免没有继承的DTOs重复?,java,inheritance,dto,code-duplication,Java,Inheritance,Dto,Code Duplication,我正在连接许多社交网络,以便在我的应用程序中登录。 我对每个社交网络响应都有一个DTO public class GoogleUserInfo { private String id; private String firstName; private String lastName; private String email; private AgeRange ageRange; // more specific fields } public
public class GoogleUserInfo {
private String id;
private String firstName;
private String lastName;
private String email;
private AgeRange ageRange;
// more specific fields
}
public class FacebookUserInfo {
private String id;
private String firstName;
private String lastName;
private String email;
private String picture;
// more specific fields
}
public class AppleUserInfo {
private String id;
private String firstName;
private String lastName;
private String email;
private Boolean emailVerified;
// more specific fields
}
在每个社交网络连接器中,我都会执行类似的步骤来获取信息,因此我认为我可以使用一些DTO,如下所示:
public class SocialNetworkInfo {
protected String id;
protected String firstName;
protected String lastName;
protected String email;
}
public class SocialNetworkInfo {
private String id;
private String firstName;
private String lastName;
private String email;
}
public class GoogleUserInfo {
private SocialNetworkInfo socialNetworkInfo;
private AgeRange ageRange;
// more specific fields
}
public class FacebookUserInfo {
private SocialNetworkInfo socialNetworkInfo;
private String picture;
// more specific fields
}
public class AppleUserInfo {
private SocialNetworkInfo socialNetworkInfo;
private Boolean emailVerified;
// more specific fields
}
社交网络DTO可以扩展此功能以获得公共字段。然后,我可以使用这个通用DTO实现一个抽象连接器,该连接器处理连接器之间的所有重复逻辑(发出请求、解析响应等):
但我意识到,在上面的服务层中,我需要这些特定字段来进行一些更改和操作
SocialNetworkInfo networkUserInfo = facebookConnector.fetchUserInfo(facebookId);
facebookService.updatePicture(networkUserInfo.getPicture()); // can't access this specific field
您认为在不强制转换和避免逻辑或数据重复的情况下,哪种方法是解决这种情况的最佳方法
我很想听听你的想法
谢谢 根据您的情况,所有社交网络模型都具有相同的性质,因此如果您将公共属性移动到共享类,如
CommonSocialInfo
,就可以了。然后,我建议为连接器提供接口,如:
interface SocialNetworkConnector<T extends SocialNetworkInfo> {
T fetchUserInfo(String userId);
}
如果您需要实施多种社会服务,可以使用Factory模式生成所需的服务,快速示例:
public class FacebookService implements SocialNetworkService {
private final SocialNetworkConnector<FacebookSocialInfo> connector;
...
}
interface SocialNetworkServiceFactory {
SocialNetworkService getFacebookService();
...
}
如果您需要更详细的帮助,或者您在理解想法时遇到困难,请随时询问 > P>如果您不想使用<强>继承< /强>,我建议考虑<强>构图< /强>。代码可以如下所示:
public class SocialNetworkInfo {
protected String id;
protected String firstName;
protected String lastName;
protected String email;
}
public class SocialNetworkInfo {
private String id;
private String firstName;
private String lastName;
private String email;
}
public class GoogleUserInfo {
private SocialNetworkInfo socialNetworkInfo;
private AgeRange ageRange;
// more specific fields
}
public class FacebookUserInfo {
private SocialNetworkInfo socialNetworkInfo;
private String picture;
// more specific fields
}
public class AppleUserInfo {
private SocialNetworkInfo socialNetworkInfo;
private Boolean emailVerified;
// more specific fields
}
AbstractConnector
Op说没有继承,不知道为什么。我肯定会这样做…我想这更多的是多态性而不是继承性。。。谢谢你的这种方法!它向我阐明了如何解决这个问题,并使我对泛型更感兴趣(我现在还不知道)@RobC:抱歉,若我表达错误,我认为继承仅限于访问服务层上面的子类属性,我正在寻找替代方法或最佳实现方法。很好,它帮助了你们!谢谢你的意见。我想我不能用这种方法直接映射JSON响应。如果事实上也有办法,请让我知道@LeandroSuarez:当然,你可以很容易地将它映射到JSON。如果您使用JAX-RS或Spring Boot,您甚至不需要为此进行任何配置。非常奇怪的是,你提出了一个“没有继承”的解决方案,却接受了一个使用继承并与你的要求相矛盾的答案。真的,对不起。我没有意识到我在标题中加入了这个条件。我正朝着更多的方向前进。尽管我没有实现你的解决方案,但我还是要给你荣誉,因为另一个更适合我的代码。@LeandroSuarez:放松:)如果另一个答案对你来说是最好的,你应该接受它为最好的。为了避免误解,你可以相应地调整你的问题,更好地解释你为什么谈论继承以及实际原因是什么。那么你的问题可能不仅对你有帮助,而且对其他人也有帮助。