37

你知道龙目岛的替代品吗?使用 Lombok,我们可以忘记使用 getter 和 setter 和toString. 我想在我的项目中使用它,但是我想知道是否有更好的选择?

我使用的是 Java 1.7,无法更改为 1.8。

4

2 回答 2

30

恐怕没有其他选择,除非您想切换到Scala之类的东西,或者对AutoValue提供的一小部分功能感到满意。

虽然AutoValue可能是您使用纯 Java 可以获得的最好的,但它提供了

  • @Getter
  • @AllArgsConstructor
  • @EqualsAndHashCode
  • @ToString
  • @Builder

但它错过了

  • @枯萎
  • toBuilder
  • @Setter
  • @代表
  • @ExtensionMethod
  • 还有一些我不使用的功能。

虽然我强烈同意不变性是一种美德,但它有时并不适用。无论如何,Lombok 努力支持不可变性,它甚至与 Guava 的不可变集合集成,你可以写

@Builder @Getter public final class Sentence {
    private final boolean truthValue;
    @Singular private final ImmutableList<String> words;    
}

并像使用它一样

Sentence s = Sentence.builder().truthValue(true)
    .word("Lombok").word("is").word("cool").build();
assertEquals(3, s.getWords().size());

注意:我不是作者,所以我可以说它很酷。

对于不可变的,@Wither并且toBuilder非常酷。前者允许您创建与单个字段不同的副本,后者为您提供一个从当前值开始并适合更改多个字段的构建器。以下两行是等价的:

o.withA(1).withB(2)
o.toBuilder().a(1).b(2).build()

龙目岛和AutoValue使用一些魔法。后者的神奇之处在于标准的注释处理,所以它非常健壮。如第 27 页所列,它有一些缺点。我要补充一个事实,即生成了一些我没有订购的 AutoValue_foo。

Lombok 使用了一些黑魔法,因此更加脆弱,但它提供的更多并且效果很好。

于 2014-02-12T23:13:31.067 回答
14

“更好”在这里颇有争议,但另一种选择是AutoValue,可在此处获得。 本演示文稿解释了 AutoValue 与例如 Lombok 之间的一些差异。

特别是,AutoValue 强调不变性(通常是一件好事!)和最少的语言外魔法(与 Lombok 非常不同)。

于 2014-02-12T22:43:25.293 回答