欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java如何優(yōu)雅的實(shí)現(xiàn)字典翻譯

 更新時(shí)間:2023年04月27日 11:17:57   作者:李同學(xué)  
當(dāng)我們?cè)贘ava應(yīng)用程序中需要對(duì)字典屬性進(jìn)行轉(zhuǎn)換返回給前端時(shí),如何簡(jiǎn)單、方便、并且優(yōu)雅的處理是一個(gè)重要問(wèn)題。在本文中,我們將介紹如何使用Java中的序列化機(jī)制來(lái)優(yōu)雅地實(shí)現(xiàn)字典值的翻譯,從而簡(jiǎn)化開(kāi)發(fā)

什么是序列化

在Java中,序列化是將對(duì)象轉(zhuǎn)換為字節(jié)流的過(guò)程,可以將這些字節(jié)流保存到文件中或通過(guò)網(wǎng)絡(luò)進(jìn)行傳輸。反序列化是將字節(jié)流轉(zhuǎn)換為原始對(duì)象的過(guò)程。通過(guò)序列化和反序列化,我們可以在不同的應(yīng)用程序之間傳遞對(duì)象,也可以將對(duì)象保存到文件中以便以后使用。

使用序列化實(shí)現(xiàn)字典值的翻譯

在Java中,我們可以使用序列化機(jī)制來(lái)實(shí)現(xiàn)編碼與其對(duì)應(yīng)的含義的對(duì)應(yīng)關(guān)系。具體步驟如下:

1.定義一個(gè)字典注解與,例如:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = DictSerializer.class)
public @interface Dict {
?
    /**
     * 字典類(lèi)型
     * 比如在描述學(xué)生的時(shí)候,1代表小學(xué)生 2代表初中生 3代表高中生 4代表大學(xué)生
     * 同樣在描述老師的時(shí)候,1代表語(yǔ)文老師 2代表數(shù)學(xué)老師 3代表英語(yǔ)老師 4代表體育老師
     * 同樣的數(shù)值在不同類(lèi)型下,代表含義不同,所以需要指定字典的類(lèi)型
     */
    String dic();
}

2.自定義注解結(jié)合繼承JsonSerialize實(shí)現(xiàn)ContextualSerializer,實(shí)現(xiàn)返回結(jié)果轉(zhuǎn)譯:

@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 {
            // 因?yàn)樾蛄谢敲總€(gè)對(duì)象都需要進(jìn)行序列話(huà)操作,這里為了減少網(wǎng)絡(luò)IO,使用了 guava 的本地緩存(代碼在下面)
            Map<String, String> dictMap = DictionaryConstants.DICTIONARY_CACHE.get(dictCode);
            if (dictMap.containsKey("nullValue")) {
                // 當(dāng)本地緩存中不存在該類(lèi)型的字典時(shí),就調(diào)用查詢(xún)方法,并且放入到本地緩存中(代碼在下面)
                dictMap = translateDictValue(dictCode);
                DictionaryConstants.DICTIONARY_CACHE.put(dictCode, dictMap);
            }
            // 通過(guò)數(shù)據(jù)字典類(lèi)型和value獲取name
            String label = dictMap.get(value.toString());
            gen.writeObject(value);
            // 在需要轉(zhuǎn)換的字段上添加@Dict注解,注明需要引用的code,后端會(huì)在返回值中增加filedName_dictText的key,前端只需要取對(duì)應(yīng)的 filedName_dictText 就可以直接使用
            gen.writeFieldName(gen.getOutputContext().getCurrentName() + DictionaryConstants.DICT_TEXT_SUFFIX);
            gen.writeObject(label);
        } catch (Exception e) {
            log.error("錯(cuò)誤信息:{}", e.getMessage(), e);
        }
    }
?
    private String getDictCode() {
        return dictCode;
    }
?
    private void setDictCode(String dictCode) {
        this.dictCode = dictCode;
    }
?
    protected DictSerializer() {
        super(Object.class);
    }
}

3.將同類(lèi)型的字典編碼和對(duì)應(yīng)的含義保存到一個(gè)Map中,例如:

private Map<String, String> translateDictValue(String code) {
    if (StrUtil.isBlank(code)) {
      return null;
    }
    // Map<String, String> map = new HashMap<>();
    // map.put("1", "小學(xué)生");
    // map.put("2", "初中生");
    // map.put("3", "高中生");
    // map.put("4", "大學(xué)生");
  
    // 因?yàn)槲覀児静捎梦⒎?wù),然后字典模塊單獨(dú)拆分成一個(gè)服務(wù),所以這里使用Feign方式調(diào)用
    DictionaryFeignClient dictionaryFeign = SpringUtil.getBean(DictionaryFeignClient.class);
    return dictionaryFeign.dictionary(code);
}

4.因?yàn)樾蛄谢切枰總€(gè)對(duì)象都進(jìn)行序列話(huà)操作,如果返回的是集合的話(huà),就會(huì)進(jìn)行很多次序列化操作,此時(shí)就需要對(duì)相同類(lèi)型的字典進(jìn)行緩存,我這里使用了guava 的 LoadingCache 進(jìn)行本地緩存(這里可能有人會(huì)說(shuō)了,如果這個(gè)時(shí)候字典值對(duì)應(yīng)的含義修改了,你這個(gè)緩存豈不是會(huì)導(dǎo)致數(shù)據(jù)不正確,首先字典功能一般是管理端進(jìn)行增刪改操作,而且字典一旦定好了是不會(huì)輕易修改的,如果你要硬杠,你贏(yíng)了)。

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;
                }
            });
}

這里額外補(bǔ)充一個(gè)小知識(shí):

  • expireAfterWrite和expireAfterAccess都是Google Guava緩存庫(kù)中的緩存過(guò)期策略。
  • expireAfterWrite表示緩存項(xiàng)在指定時(shí)間后過(guò)期,無(wú)論緩存項(xiàng)是否被訪(fǎng)問(wèn)過(guò)。例如,如果我們將緩存項(xiàng)的expireAfterWrite設(shè)置為10分鐘,則緩存項(xiàng)在被添加到緩存中10分鐘后過(guò)期,無(wú)論它是否被訪(fǎng)問(wèn)過(guò)。
  • 這兩種過(guò)期策略可以單獨(dú)或組合使用,以實(shí)現(xiàn)更靈活的緩存策略。例如,我們可以將緩存項(xiàng)的expireAfterWrite設(shè)置為10分鐘,同時(shí)將expireAfterAccess設(shè)置為5分鐘,這樣緩存項(xiàng)將在10分鐘后過(guò)期,或者在最近5分鐘內(nèi)沒(méi)有被訪(fǎng)問(wèn)時(shí)過(guò)期,以先到者為準(zhǔn)。
  • 使用expireAfterWrite和expireAfterAccess可以避免緩存中的數(shù)據(jù)過(guò)期時(shí)間過(guò)長(zhǎng)或過(guò)短,從而提高緩存的效率和可靠性。

5.相比于使用 aop 切面的方式,使用序列化的方式能更好的進(jìn)行字典的翻譯(因?yàn)?aop 方式很難處理對(duì)象中的屬性的屬性),例如:

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

在這種場(chǎng)景中,如果返回的是 Company 集合,使用 aop 切面方式就很難達(dá)到(開(kāi)發(fā)難度與開(kāi)發(fā)成本)與序列化方式同樣的效果。

通過(guò)以上步驟,我們可以使用Java中的序列化機(jī)制來(lái)優(yōu)雅地實(shí)現(xiàn)字典編碼與其對(duì)應(yīng)的含義的對(duì)應(yīng)關(guān)系,從而簡(jiǎn)化編碼數(shù)據(jù)的管理和維護(hù)。

總結(jié)

在本文中,我們介紹了如何使用Java中的序列化機(jī)制來(lái)實(shí)現(xiàn)編碼與其對(duì)應(yīng)的含義的對(duì)應(yīng)關(guān)系,從而簡(jiǎn)化編碼數(shù)據(jù)的管理和維護(hù)。通過(guò)序列化和反序列化,我們可以高效地傳遞和保存對(duì)象,提高應(yīng)用程序的效率和可維護(hù)性。

到此這篇關(guān)于詳解Java如何優(yōu)雅的實(shí)現(xiàn)字典翻譯的文章就介紹到這了,更多相關(guān)Java字典翻譯內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java貪吃蛇游戲編寫(xiě)代碼

    java貪吃蛇游戲編寫(xiě)代碼

    這篇文章主要為大家詳細(xì)介紹了java貪吃蛇游戲的編寫(xiě)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • java排序去重示例分享

    java排序去重示例分享

    這篇文章主要介紹了java排序去重示例,對(duì)String strs = "ZZZ BBB AAA OOO ZZZ AAA ZZZ"計(jì)算出現(xiàn)個(gè)數(shù),排序去重,需要的朋友可以參考下
    2014-02-02
  • Java面試題之HashSet的實(shí)現(xiàn)原理

    Java面試題之HashSet的實(shí)現(xiàn)原理

    這篇文章主要介紹了Java面試題之HashSet的實(shí)現(xiàn)原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Java用Arrays.fill()初始化二維數(shù)組的實(shí)現(xiàn)

    Java用Arrays.fill()初始化二維數(shù)組的實(shí)現(xiàn)

    這篇文章主要介紹了Java用Arrays.fill()初始化二維數(shù)組的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 詳解spring boot 以jar的方式啟動(dòng)常用shell腳本

    詳解spring boot 以jar的方式啟動(dòng)常用shell腳本

    本篇文章主要介紹了詳解spring boot 以jar的方式啟動(dòng)常用shell腳本,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-09-09
  • 精通Java List 按字段提取對(duì)象

    精通Java List 按字段提取對(duì)象

    這篇文章主要介紹了精通Java List 按字段提取對(duì)象的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 解析JDK14中的java tools簡(jiǎn)介

    解析JDK14中的java tools簡(jiǎn)介

    這篇文章主要介紹了JDK14中的java tools簡(jiǎn)介,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 關(guān)于@PropertySource配置的用法解析

    關(guān)于@PropertySource配置的用法解析

    這篇文章主要介紹了關(guān)于@PropertySource配置的用法解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java包裝類(lèi)的緩存機(jī)制原理實(shí)例詳解

    Java包裝類(lèi)的緩存機(jī)制原理實(shí)例詳解

    這篇文章主要介紹了Java包裝類(lèi)的緩存機(jī)制原理實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java通過(guò)正則表達(dá)式捕獲組中的文本

    Java通過(guò)正則表達(dá)式捕獲組中的文本

    這篇文章主要給大家介紹了關(guān)于利用Java如何通過(guò)正則表達(dá)式捕獲組中文本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧下
    2019-09-09

最新評(píng)論