Как скопировать / преобразовать объект AutoValue с помощью компоновщика

Я недавно играю в авто-стоимость со строителем. И я нахожусь в такой ситуации, скажем, мне нужно преобразовать существующий объект в новый, обновив несколько свойств. Пример кода здесь:

@AutoValue
public abstract class SomeObject {
    public static Builder builder() {
      ...
    }

    public abstract String prop1();
    public abstract int prop2();

    // Populate a builder using the current instance.        
    public Builder newBuilder() {
        ...
    }
}

Обратите внимание, я написал newBuilder метод, так что я могу сделать преобразование следующим образом:

SomeObject resultedObject = originObject.newBuilder()
    .setProp2(99)
    .build();

Да я могу написать newBuilder как это:

public Builder newBuilder() {
    return new AutoValue_SomeObject.Builder()
            .setProp1(this.prop1())
            .setProp2(this.prop2());
}

Но должен быть лучший способ, особенно при работе со сложными объектами в реальной жизни. Примерно так лучше:

public Builder newBuilder() {
    return new AutoValue_SomeObject.Builder(this);
}

К сожалению, сгенерированный конструктор Builder(SomeObject) является частным, и я не могу найти ссылку на него.

Так что вы думаете о проблеме?

Версия AutoValue 1.4-rc2, Заранее спасибо.

1 ответ

Решение

Пожалуйста, обратитесь к ответу Джейк Уортон

Ответ должен объявить toBuilder метод в SomeObject

public abstract Builder toBuilder();

сгенерированный подкласс будет реализовывать этот метод.

Другие вопросы по тегам