热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用相同的方法但不实现相同的接口为一组类编写通用代码的惯用方式是什么?

如何解决《用相同的方法但不实现相同的接口为一组类编写通用代码的惯用方式是什么?》经验,求助如何解决?

我正在使用一个外部库,该库提供紧密相关的类(从某些模板生成),但是不幸的是,没有共享的接口,例如

public class A {
    public UUID id();
    public Long version();
    public String foo();
    public String bar();
}

public class B {
    public UUID id();
    public Long version();
    public String foo();
    public String bar();
}

public class C {
    public UUID id();
    public Long version();
    public String foo();
    public String bar();
}

// ... and more: D, E, F, etc.

鉴于我对外部库没有影响,编写共享相同方法签名的一组类的公共逻辑的惯用方式是什么(至少对于公共逻辑使用的方法而言)?

目前,我会根据具体情况做以下三件事之一:

    我编写了辅助方法,这些方法从每个对象获取原始结果,例如

    private static void myHelper(UUID id, Long version, String foo, String bar) {
      ...
    }
    

    这样,无论类型如何,我都可以“解压缩”对象:

    myHelper(whatever.id(), whatever.version(), whatever.foo(), whatever.bar());
    

    但这很罗word,尤其是当我需要与许多成员一起工作时。

    在仅使用吸气剂的情况下(仅需要访问对象的当前值),我找到了一种使用诸如Dozer或ModelMapper之类的映射库将A或B或C映射到我自己的通用类的方法。 ,例如

    public class CommonABC {
      UUID id;
      Long version;
      String foo;
      String bar;
    }
    

    通过玩配置,您可以获取这些库以将所有成员(无论是方法还是字段,公共或私有)映射到您的类,例如

    modelMapper.getConfiguration()
        .setFieldMatchingEnabled(true)
        .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE);
    

    但这是一种“大刀阔斧”的方法,这是IMO显然没有理由仅仅为了排除重复代码而做出的破解。

    最后,在某些其他情况下,最简洁的做法是

    private static void myHelper(Object extLibEntity) {
      if (extLibEntity instanceof A) {
        ...
      } else if (extLibEntity instanceof B) {
        ...
      } else if (extLibEntity instanceof C) {
        ...
      } else {
        throw new RuntimeException(...);
      }
    }
    

    很明显为什么这很糟糕。

在企业环境中,您必须以这种方式来使用图书馆,您将怎么办?

我倾向于编写一个非常明确的(如果是冗长的)映射器(不使用通用映射器库),该映射器从一开始就转换这些实体。但是,我想知道是否有更好的方法。(例如,是否有一种方法可以在运行时将对象“投射”为实现新接口?)


推荐阅读
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 精讲代理设计模式
    代理设计模式为其他对象提供一种代理以控制对这个对象的访问。代理模式实现原理代理模式主要包含三个角色,即抽象主题角色(Subject)、委托类角色(被代理角色ÿ ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • centos6.8 下nginx1.10 安装 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
  • centos php部署到nginx 404_NodeJS项目部署到阿里云ECS服务器全程详解
    本文转载自:http:www.kovli.com20170919ecs-deploy作者:Kovli本文详细介绍如何部署NodeJS项目到阿里云ECS上, ... [详细]
author-avatar
兄弟465748208_279
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有