Java 使用gson将列表反序列化为不可修改的集合

Java 使用gson将列表反序列化为不可修改的集合,java,list,deserialization,gson,Java,List,Deserialization,Gson,我希望将所有列表反序列化为不可修改的集合 下面是我正在反序列化的类: public class MyClass { public final mylist = Collections.unmodifiablelist(new ArrayList()); } 我如何反序列化: MyClass inst = (new Gson()).fromJson("{mylist:[\"firstString\"]}", MyClass.class); 我不想为所有使用List的100个类创建一个r

我希望将所有
列表
反序列化为不可修改的集合

下面是我正在反序列化的类:

public class MyClass
{
    public final mylist = Collections.unmodifiablelist(new ArrayList());
}
我如何反序列化:

MyClass inst = (new Gson()).fromJson("{mylist:[\"firstString\"]}", MyClass.class);

我不想为所有使用
List
的100个类创建一个register a类型适配器,那么对于
Gson
的实例,有没有一种方法可以全局覆盖
List
的反序列化呢?

为什么不遵循JavaBean标准,只返回不可修改的列表呢

public class MyClass {
    private List<String> myList = new ArrayList<String>();

    public void setMyList(List<String> list) {
        this.myList = list;
    }

    public Collection<String> getMyList() {
        return Collections.unmodifiablelist(this.myList);
    }
}
公共类MyClass{
private List myList=new ArrayList();
公共void setMyList(列表){
this.myList=list;
}
公共集合getMyList(){
返回集合.unmodifiablelist(this.myList);
}
}

我也会选择适配器工厂,但代码更短:

class MyAdapter implements TypeAdapterFactory {

  @Override
  public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> tokenType) {
    final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, tokenType);

    return new TypeAdapter<T>() {
      @Override
      public void write(JsonWriter out, T value) throws IOException {
        delegate.write(out, value);
      }

      @Override
      public T read(JsonReader arg0) throws IOException {
        T t = delegate.read(arg0);
        if (List.class.isAssignableFrom(tokenType.getRawType())) {
          List<?> list = (List<?>) t;

          return (T) Collections.unmodifiableList(list);
        }

        return t;
      }
    };
  }
}

…因为
myList
实例也是在内部使用的…出于理智的原因,我更希望它不可修改。嗯,如果你不能信任自己的类不进行修改,你会遇到更大的问题…这不是一个值得信任的事情…更多关于推理,如果有人以后来编辑我的类…如果它不可修改,它会让开发人员停下来思考为什么要这样做……字段的类型在哪里?
Gson g = new GsonBuilder().registerTypeAdapterFactory(new MyAdapter()).create();