返回顶部
首页 > 资讯 > 后端开发 > Python >详解Java如何优雅的实现字典翻译
  • 194
分享到

详解Java如何优雅的实现字典翻译

Java实现字典翻译Java字典翻译Java字典 2023-05-18 05:05:24 194人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是序列化使用序列化实现字典值的翻译总结什么是序列化 在Java中,序列化是将对象转换为字节流的过程,可以将这些字节流保存到文件中或通过网络进行传输。反序列化是将字节流转换为原

什么是序列化

在Java中,序列化是将对象转换为字节流的过程,可以将这些字节流保存到文件中或通过网络进行传输。反序列化是将字节流转换为原始对象的过程。通过序列化和反序列化,我们可以在不同的应用程序之间传递对象,也可以将对象保存到文件中以便以后使用。

使用序列化实现字典值的翻译

在Java中,我们可以使用序列化机制来实现编码与其对应的含义的对应关系。具体步骤如下:

1.定义一个字典注解与,例如:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JSONSerialize(using = DictSerializer.class)
public @interface Dict {
​
    
    String dic();
}

2.自定义注解结合继承jsonSerialize实现ContextualSerializer,实现返回结果转译:

@Slf4j
public class DictSerializer extends StdSerializer<Object> implements ContextualSerializer {
​
    private transient String dictCode;
​
    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty beanProperty){
        Dict dict = beanProperty.getAnnotation(Dict.class);
        return createContextual(dict.dic());
    }
​
    private JsonSerializer<?> createContextual(String dicCode) {
        DictSerializer serializer = new DictSerializer();
        serializer.setDictCode(dicCode);
        return serializer;
    }
​
    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider provider){
​
        String dictCode = getDictCode();
        if (StrUtil.isBlank(dictCode)) {
            return;
        }
        if (Objects.isNull(value)) {
            return;
        }
        try {
            // 因为序列化是每个对象都需要进行序列话操作,这里为了减少网络IO,使用了 guava 的本地缓存(代码在下面)
            Map<String, String> dictMap = DictionaryConstants.DICTIONARY_CACHE.get(dictCode);
            if (dictMap.containsKey("nullValue")) {
                // 当本地缓存中不存在该类型的字典时,就调用查询方法,并且放入到本地缓存中(代码在下面)
                dictMap = translateDictValue(dictCode);
                DictionaryConstants.DICTIONARY_CACHE.put(dictCode, dictMap);
            }
            // 通过数据字典类型和value获取name
            String label = dictMap.get(value.toString());
            gen.writeObject(value);
            // 在需要转换的字段上添加@Dict注解,注明需要引用的code,后端会在返回值中增加filedName_dictText的key,前端只需要取对应的 filedName_dictText 就可以直接使用
            gen.writeFieldName(gen.getOutputContext().getCurrentName() + DictionaryConstants.DICT_TEXT_SUFFIX);
            gen.writeObject(label);
        } catch (Exception e) {
            log.error("错误信息:{}", e.getMessage(), e);
        }
    }
​
    private String getDictCode() {
        return dictCode;
    }
​
    private void setDictCode(String dictCode) {
        this.dictCode = dictCode;
    }
​
    protected DictSerializer() {
        super(Object.class);
    }
}

3.将同类型的字典编码和对应的含义保存到一个Map中,例如:

private Map<String, String> translateDictValue(String code) {
    if (StrUtil.isBlank(code)) {
      return null;
    }
    // Map<String, String> map = new HashMap<>();
    // map.put("1", "小学生");
    // map.put("2", "初中生");
    // map.put("3", "高中生");
    // map.put("4", "大学生");
  
    // 因为我们公司采用微服务,然后字典模块单独拆分成一个服务,所以这里使用Feign方式调用
    DictionaryFeignClient dictionaryFeign = springUtil.getBean(DictionaryFeignClient.class);
    return dictionaryFeign.dictionary(code);
}

4.因为序列化是需要每个对象都进行序列话操作,如果返回的是集合的话,就会进行很多次序列化操作,此时就需要对相同类型的字典进行缓存,我这里使用了guava 的 LoadinGCache 进行本地缓存(这里可能有人会说了,如果这个时候字典值对应的含义修改了,你这个缓存岂不是会导致数据不正确,首先字典功能一般是管理端进行增删改操作,而且字典一旦定好了是不会轻易修改的,如果你要硬杠,你赢了)。

public class DictionaryConstants {
​
    
    public static final String DICT_TEXT_SUFFIX = "_dictText";
​
    public static final LoadingCache<String, Map<String, String>> DICTIONARY_CACHE = CacheBuilder.newBuilder()
            .maximumSize(1000)
            .expireAfterWrite(30, TimeUnit.SECONDS)
            .expireAfterAccess(10, TimeUnit.SECONDS)
            .build(new CacheLoader<String, Map<String, String>>() {
                @Override
                public Map<String, String> load(String key) {
                    Map<String, String> map = new HashMap<>();
                    map.put("nullValue", "nullValue");
                    return map;
                }
            });
}

这里额外补充一个小知识:

  • expireAfterWrite和expireAfterAccess都是Google Guava缓存库中的缓存过期策略。
  • expireAfterWrite表示缓存项在指定时间后过期,无论缓存项是否被访问过。例如,如果我们将缓存项的expireAfterWrite设置为10分钟,则缓存项在被添加到缓存中10分钟后过期,无论它是否被访问过。
  • 这两种过期策略可以单独或组合使用,以实现更灵活的缓存策略。例如,我们可以将缓存项的expireAfterWrite设置为10分钟,同时将expireAfterAccess设置为5分钟,这样缓存项将在10分钟后过期,或者在最近5分钟内没有被访问时过期,以先到者为准。
  • 使用expireAfterWrite和expireAfterAccess可以避免缓存中的数据过期时间过长或过短,从而提高缓存的效率和可靠性。

5.相比于使用 aop 切面的方式,使用序列化的方式能更好的进行字典的翻译(因为 aop 方式很难处理对象中的属性的属性),例如:

public class Company {
  private List<Staff> staffs;
}
​
public class Staff {
  private Integer age;
  private String name;
  @Dic(dic = "position")
  private String position;
  
}

在这种场景中,如果返回的是 Company 集合,使用 aop 切面方式就很难达到(开发难度与开发成本)与序列化方式同样的效果。

通过以上步骤,我们可以使用Java中的序列化机制来优雅地实现字典编码与其对应的含义的对应关系,从而简化编码数据的管理和维护。

总结

在本文中,我们介绍了如何使用Java中的序列化机制来实现编码与其对应的含义的对应关系,从而简化编码数据的管理和维护。通过序列化和反序列化,我们可以高效地传递和保存对象,提高应用程序的效率和可维护性。

到此这篇关于详解Java如何优雅的实现字典翻译的文章就介绍到这了,更多相关Java字典翻译内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解Java如何优雅的实现字典翻译

本文链接: https://lsjlt.com/news/211685.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解Java如何优雅的实现字典翻译
    目录什么是序列化使用序列化实现字典值的翻译总结什么是序列化 在Java中,序列化是将对象转换为字节流的过程,可以将这些字节流保存到文件中或通过网络进行传输。反序列化是将字节流转换为原...
    99+
    2023-05-18
    Java实现字典翻译 Java字典翻译 Java字典
  • java通过注解翻译字典的实现示例
    最近在写代码时遇到一个需要将entity字段通过字典翻译成真实值的场景,原来的做法是通过主表字段和字典表关联的形式,当一个需要大量翻译的场景时,大量的关联会造成sql阅读的不友好,所...
    99+
    2024-04-02
  • 详解Java线程池如何实现优雅退出
    目录shutdown()方法shutdownNow()方法awaitTermination(long, TimeUnit)方法在【高并发专题】中,我们从源码角度深度分析了线程池中那些...
    99+
    2024-04-02
  • python中如何优雅的合并两个字典
    这篇文章给大家分享的是有关python中如何优雅的合并两个字典的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。如何优雅的合并两个字典** 操作符可以解包字典,这在合并字典时非常有用,比如:>>>&...
    99+
    2023-06-27
  • Java字符串拼接的优雅方式实例详解
    目录背景String底层原理拼接的方法经典但有时不优雅的 +优点缺点业务一万能的StringBuilder线程安全的StringBuffer灵活的String.format()有点绿...
    99+
    2024-04-02
  • Java实现优雅的参数校验方法详解
    目录一、引子二、如何优雅地校验参数2.1 官方指导意见2.2 注解用法说明一、引子 要对方法的参数进行校验,最简单暴力的写法是这个样子: public static void...
    99+
    2024-04-02
  • Java如何实现优雅的参数校验
    这篇文章主要介绍“Java如何实现优雅的参数校验”,在日常操作中,相信很多人在Java如何实现优雅的参数校验问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java如何实现优雅的参数校验”的疑惑有所帮助!接下来...
    99+
    2023-07-02
  • iOS如何优雅地实现序列动画详解
    前言 我们的在做动效中经常会有这样的需求,A动画执行完,执行B动画,B动画执行完执行C动画这样的序列,比如如下效果: iOS 10之前,我们可能这样实现这个动画序列,实际上可能你...
    99+
    2022-05-27
    ios 序列 动画
  • 详解如何优雅迭代JavaScript字面对象
    目录为什么要实现自定义迭代器如何实现JavaScript字面量对象迭代实现方法解析为什么生成器函数要这样设计为什么要实现自定义迭代器 因为在JavaScript中字面量对象是不支持迭...
    99+
    2024-04-02
  • 如何使用python实现一款属于自己的翻译词典软件
    这篇文章主要介绍如何使用python实现一款属于自己的翻译词典软件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、设计理念先写一个登录的py文件,用python的tkinter库2.再写一个py文件用于爬取有道翻译...
    99+
    2023-06-15
  • 详解Java中字典树(Trie树)的图解与实现
    目录简介工作过程数据结构初始化构建字典树应用匹配有效单词关键词提示总结简介 Trie又称为前缀树或字典树,是一种有序树,它是一种专门用来处理串匹配的数据结构,用来解决一组字符中快速查...
    99+
    2024-04-02
  • 详解Java如何优雅的使用策略模式
    目录什么是策略模式策略模式结构策略模式适用场景简单示例项目实战场景用一坨坨代码实现策略模式重构代码代码实现总结最近这段时间,想给大家分享一下设计模式的一些用法以及在项目中怎么运用。 ...
    99+
    2023-02-27
    Java优雅使用策略模式 Java使用策略模式 Java策略模式
  • 如何利用Python实现翻译HTML中的文本字符串
    本篇内容主要讲解“如何利用Python实现翻译HTML中的文本字符串”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何利用Python实现翻译HTML中的文本字符串”吧!相信大家都用过浏览器的翻...
    99+
    2023-07-02
  • Go如何优雅的使用字节池示例详解
    目录背景为何需要字节池最简单的方式测试不预先申请空间预先申请空间字节数组池测试结果更优雅的方式测试直接使用Bufferbytes.Buffer池测试结果限制池大小测试固定大小字节池测...
    99+
    2024-04-02
  • Java 如何快速,优雅的实现导出Excel
    目录前言:使用第三方库实现导出Excel使用 Hutool 工具库实现导出Excel:使用 EasyExcel 工具库实现导出Excel:前言: 春节假期刚刚过去,大家是不是已经开...
    99+
    2024-04-02
  • 更优雅的C++字符串格式化实现方法详解
    目录背景优化实现使用背景 在用C++编写代码时,经常需要用到字符串拼接及格式化,尤其是在拼写sql语句时,目前大部分sql拼接方式都是通过ostringstream流一点一点拼接的,...
    99+
    2023-05-16
    C++实现字符串格式化 C++字符串格式化 C++字符串 C++格式化
  • 详解Java如何优雅的使用装饰器模式
    目录什么是装饰器模式优点缺点使用场景装饰器模式和代理模式的区别装饰器的简单实现装饰器模式实战小结什么是装饰器模式 装饰器模式(Decorator Pattern): 在不改...
    99+
    2024-04-02
  • Java中该如何优雅的使用线程池详解
    目录为什么要用线程池?线程池线程池基本概念线程池接口定义和实现类ExecutorServiceScheduledExecutorService线程池工具类newFixedThread...
    99+
    2024-04-02
  • Java如何优雅的实现微信登录注册
    目录引言问题分析解决思路方案实现最后引言 今天我们来聊一聊微信登录注册遇到的一些事儿。 在我们的业务系统中,一个用户在系统中肯定会有一个唯一标识,并且这个唯一标识一般是从系统外部获取...
    99+
    2024-04-02
  • MySQL如何优雅的删除大表实例详解
    前言 删除表,大家下意识想到的命令可能是直接使用DROP TABLE "表名",这是初生牛犊的做法,因为当要删除的表达空间到几十G,甚至是几百G的表时候。这样一条命令下去,MySQL可能就直接夯住了,外在表现就是Q...
    99+
    2022-05-11
    mysql 删除大表 mysql删除表的字段 mysql删除表内的数据语句
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作