Java 如何在gson中使用AutoValue扩展添加setter

Java 如何在gson中使用AutoValue扩展添加setter,java,android,json,gson,auto-value,Java,Android,Json,Gson,Auto Value,我最近遇到了使用AutoValues(GSON)扩展来加速解析json数据的概念。我们发现它解析json的速度是原来的两倍 但我遗漏了一点,使用AutoValues时的数据集是不可变的,但我们的数据集/模型通常与json类似,并且不需要映射程序 因此,如果我想在我的模型类中设置单个数据元素,这看起来是不可行的(因为我们只有抽象的getter,没有setter)。有没有办法解决这个问题,或者我遗漏了一点。 我将使用示例代码解释我们所做的工作,并使用AutoValue解释类似的语法 因此,我们通常编

我最近遇到了使用AutoValues(GSON)扩展来加速解析json数据的概念。我们发现它解析json的速度是原来的两倍

但我遗漏了一点,使用AutoValues时的数据集是不可变的,但我们的数据集/模型通常与json类似,并且不需要映射程序

因此,如果我想在我的模型类中设置单个数据元素,这看起来是不可行的(因为我们只有抽象的getter,没有setter)。有没有办法解决这个问题,或者我遗漏了一点。 我将使用示例代码解释我们所做的工作,并使用AutoValue解释类似的语法

因此,我们通常编写如下代码

public class ModelClass{
    private String aValue;
    private String anotherValue;
    public String getAValue(){
        return this.aValue;
    }
    public void setAValue(String aValue){
        this.aValue = aValue;
    }
    public String getAnotherValue(){
        return this.anotherValue;
    }
    public String setAnotherValue(anotherValue){
        this.anotherValue = anotherValue
    }
}

public class ViewClass{
     public void foo(){
          String json = {"aValue":"This is a sample string", "anotherValue": "this is another string"};
          ModelClass model = gson.fromJson(json, ModelClass.class);
          model.getAValue();
          model.setAValue("this is a new value"); // and we can set individual element ModelClass.aValue


     }
}
但是,在使用自动值时,模型类的结构将更改为

  @AutoValue public abstract class AutoValueModel{
       public abstract String bValue();
       public abstract String otherValue();

       public static AutoValueModel(String bValue, String otherValue){
           return new AutoValue_AutoValueModel(bValue, otherValue);
       }
  }
//现在,正如您所看到的,AutoValueModel结构不包含任何setter。如果我只想更改bValue(例如基于用户操作,尽管我知道AutoValues背后的基本前提是它们是不可变的),并继续在代码的其他部分中使用,该怎么办?然后使用完全相同的AutoValueModel序列化json。 或者我应该使用AutoValue技术反序列化,然后使用可以对数据集执行更改的映射模型吗?(如果使用此技术,我是否会失去使用AutoValue获得的速度优势?)

也参考了我从中了解到的有关AutoValues的内容:

如果我只想更改bValue…并在代码的其他部分继续使用,该怎么办

如果您想更新
@AutoValue
d类的特定值,您需要使用
@AutoValue.Builder
创建一个具有更新值的新类,Vincent Dubedout在其博客上回复了您的评论

您将拥有一个具有类似于
@AutoValue.builder
注释的静态生成器类,并且当您需要具有更新值的类时,您将使用此生成器创建一个新类,以便仅更新特定值的类


我希望这会有所帮助。

我同意这种方法,但每次需要更改1个变量的值时,我不会使用生成器方法创建一个新对象。想象一个类有100个变量,现在说我需要根据用户操作在不同的时间间隔更新所有变量,这不会降低任何性能吗如果您“需要更改1个变量的值”,我通过更快地解析json实现的改进很多时候,我建议你重新思考如何在你的应用程序中处理你的数据模型。AutoValue只是帮助开发者创建一种值类型;很容易,我也不会惊讶AutoValue的标题并非总是每个人都愿意做的。我不是说你需要多次更改一个变量(尽管这对于像我们这样的始终同步的系统是完全可能的),但我的问题更多的是关于通过更快的解析获得的性能偏移。尽管在深入研究之后,我认为您的方法是对数据元素执行setter操作的唯一有效方法。所以接受答案