Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免没有继承的DTOs重复?_Java_Inheritance_Dto_Code Duplication - Fatal编程技术网

Java 如何避免没有继承的DTOs重复?

Java 如何避免没有继承的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

我正在连接许多社交网络,以便在我的应用程序中登录。 我对每个社交网络响应都有一个DTO

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:放松:)如果另一个答案对你来说是最好的,你应该接受它为最好的。为了避免误解,你可以相应地调整你的问题,更好地解释你为什么谈论继承以及实际原因是什么。那么你的问题可能不仅对你有帮助,而且对其他人也有帮助。