我最近遇到了使用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的地方参考:
答案 0 :(得分:1)
如果我可能只想更改bValue ...并继续在代码的其他部分使用该怎么办?
如果您想更新@AutoValue
d类的特定值,则需要使用@AutoValue.Builder
创建一个具有更新值的新类,因为Vincent Dubedout在他的博客上回复了您的评论
您将拥有一个带有@AutoValue.Builder
注释的静态构建器类的类,如this one,当您需要具有更新值的类时,您将使用此构建器创建一个新类一个类只更新了某个值。
https://github.com/google/auto/blob/master/value/userguide/builders.md#autovalue-with-builders
我希望这会有所帮助。