1

我最近遇到了使用 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


     }
}

但是在使用 Auto Value 时,模型类的结构更改为

  @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 结构不包含任何设置器,如果我只想更改 bValue(基于用户操作,即使我知道 AutoValues 背后的基本前提是它们是不可变的)并继续使用在代码的其他部分。然后使用相同的 AutoValueModel 序列化一个 json。还是应该使用 AutoValue 技术进行反序列化,然后使用可以对数据集执行更改的映射模型?(如果我使用这种技术,我会失去使用 AutoValue 获得的速度优势吗?)

还从我了解 AutoValues 的地方参考:

AutoValue 简介

使用自动值 GSON 扩展实现更快的 JSON 反序列化

4

1 回答 1

1

如果我可能只想更改 bValue ...并继续在代码的其他部分使用怎么办?

如果你想更新@AutoValued 类的某个值,你需要利用@AutoValue.Builder创建一个更新值的新类,正如 Vincent Dubedout 在他的博客上回复你的评论一样。

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

https://github.com/google/auto/blob/master/value/userguide/builders.md#autovalue-with-builders

我希望这有帮助。

于 2016-07-26T13:34:57.027 回答