易于设计,实现和使用
使用过程中不容易导致出错
更加的安全,可以随意地共用
天然具备线程安全性,无需增加额外的同步操作
类不可被继承:也就是要把类声明为 final,从而预防了子类继承中可能存在的非法修改父类状态的问题
所有的属性设置为 final:这样一来,只能通过构造函数传参或者 builder 模式来实例化类实例
所有属性设置为 private:这是毋庸置疑的,因为如果属性是 public,那么外界可以随意修改它的属性值
public final class Autobot { private final String name; private final String fullname; private final Boolean leader; private final String group; public Autobot(String name, String fullname, Boolean leader, String group) { this.name = name; this.fullname = fullname; this.leader = leader; this.group = group; } public String name() { return name; } public String fullname() { return fullname; } public Boolean leader() { return leader; } public String group() { return group; }
}
public Autobot fusion(Autobot autobot) { return new Autobot(name.concat(autobot.name()));
}
import org.immutables.value.Value;
@Value.Immutable public abstract class Decepticon { public abstract String name(); public abstract String fullname(); public abstract Boolean leader(); public abstract String group();
}
ImmutableDecepticon decepticon = ImmutableDecepticon.builder() .name("Megatron") .fullname("Megatron Galvatron") .group("Decepticons") .leader(true) .build();
@Value.Immutable public interface ITransformer extends IAutobot, IDecepticon { // it will generate and fields extended from IAutobot and IDecepticon
}
import org.immutables.value.Value;
@Value.Immutable public interface Car { enum MotorType { DIESEL, GAS } @Value.Parameter String manufacturer(); @Value.Parameter MotorType motorType();
}
// create instance
ImmutableCar car = new ImmutableCar("Nissan", Car.MotorType.GAS);
import com.google.auto.value.AutoValue;
@AutoValue abstract class Autobot { abstract String name(); abstract String fullname(); abstract Boolean leader(); abstract String group();
}
AutoValue_Autobot autobot = new AutoValue_Autobot("Bumblebee", "Bumblebee Autobot", false, "Autobot");
import com.google.auto.value.AutoValue;
@AutoValue abstract class Autobot { public static Autobot create(String name, String fullname, Boolean leader, String group) { return new AutoValue_Autobot(name, fullname, leader, group); } abstract String name(); abstract String fullname(); abstract Boolean leader(); abstract String group();
}
Autobot auto = Autobot.create("Bumblebee", "Bumblebee Autobot", false, "Autobot");
import com.google.auto.value.AutoValue;
@AutoValue abstract class Decepticon { abstract String name(); abstract String fullname(); abstract Boolean leader(); abstract String group(); static Builder builder() { return new AutoValue_Decepticon.Builder(); } @AutoValue.Builder abstract static class Builder { abstract Builder name(String name); abstract Builder fullname(String fullname); abstract Builder leader(Boolean leader); abstract Builder group(String group); abstract Decepticon build(); }
}
Decepticon decepticon = Decepticon.builder() .name("Kakuryu") .fullname("Kakuryu Decepticon") .leader(false) .group("Decepticons") .build();
ImmutableList
ImmutableSet
ImmutableSortedSet
ImmutableMap
ImmutableSortedMap
ImmutableMultiset
ImmutableSortedMultiset
ImmutableMultimap
ImmutableListMultimap
ImmutableSetMultimap
ImmutableBiMap
ImmutableClassToInstanceMap
ImmutableTable
public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of( "red", "orange", "yellow", "green", "blue", "purple"); final ImmutableSet<Bar> bars = ImmutableSet.copyOf(bars); // defensive copy!
Google’s AutoValue4
Google’s Guava5
Immutables official6
Power Use of Value Objects in DDD7
Simple made easy8
[1] https://bitbucket.org/hvisser/android-apt ↩
[2] http://immutables.github.io/style.html ↩
[3] http://jakewharton.com/auto-value-extensions-ny-android-meetup/ ↩
[4] https://speakerdeck.com/alexsimo/cleaner-code-with-guava-v2 ↩
[5] https://github.com/google/auto/blob/master/value/userguide/index.md ↩
[6] https://github.com/google/guava ↩
[7] http://immutables.github.io/i ↩
[8] https://www.infoq.com/presentations/Value-Objects-Dan-Bergh-Johnsson ↩
[9] https://www.infoq.com/presentations/Simple-Made-Easy ↩