java dto 枚举兼容

public class Tmp {
  @Getter
  public static enum Goods {
  Food(1, "food"),
  Car(2, "car");

  Goods(int id, String name) {
  this.id = id;
  this.name = name;
  }

  int id;
  String name;
  }

  @Data
  public static class GoodsDTO {
  Goods type;
  }

  public static void main(String[] args) {
  // 假设是其他服务传递来的,这里用 new 模拟
  GoodsDTO goodsDTO = new GoodsDTO();
  goodsDTO.getType().getName();
  }

}

我们的场景是枚举和dto都是服务端提供的包文件,但是如果服务端发生了升级。如果客户端调用的时候出现了未知的枚举,会产生null的错误异常,会阻止程序的正常运行。现在希望是可以有默认值,所以枚举类型需要单独增加一个enum,作为默认值。但是由于服务端在正常情况下不会设置为默认值,而是有可能设置一个客户端不存在,但是服务端存在的正常类型,这时候需要在dto做手脚了,首先enum本身是一个基原类型的组合,所以我们可以在封装dto存储一个基原类型,而枚举的获取是在调用方通进行转化,而转化代码本身本身是可以兼容未知类型的。所以这种情况下的使用是不会出现null的。不会因为某些情况下,服务端版本因为高于客户端版本,导致客户端出现null的错误。


public class Tmp {
  @Getter
  public static enum Goods {
  Food(1, "food"),
  Car(2, "car"),
  Unknown(0, "unknown");

  Goods(int id, String name) {
  this.id = id;
  this.name = name;
  }

  int id;
  String name;

  public static Goods getValueOf(int value) {
  return Arrays.stream(Goods.values()).filter(v -> v.getId() == value).findFirst().orElse(Unknown);
  }
  }

  @Data
  public static class GoodsDTO {
  int typeId;

  public Goods getType() {
  return Goods.getValueOf(this.typeId);
  }
  }

  public static void main(String[] args) {
  // 假设是其他服务传递来的,这里用 new 模拟
  GoodsDTO goodsDTO = new GoodsDTO();
  System.out.println(goodsDTO.getType().getName());;
  }

}

评论列表