Java 无getter/setter/toString/constructor的清晰代码的Lombok替代方案

Java 无getter/setter/toString/constructor的清晰代码的Lombok替代方案,java,lombok,Java,Lombok,你知道龙目山有什么替代品吗? 使用Lombok,我们可以忘记将类与getter和setter以及toString混为一谈。我想在我的项目中使用它,但是我想知道是否有更好的替代方案 我使用的是Java 1.7,无法更改为1.8。这里的“更好”一词颇有争议,但有一种选择是可用的。解释AutoValue和Lombok之间的一些差异 特别是,AutoValue强调不变性(一般来说,这是件好事!)和最少的语言外魔法(与Lombok截然不同)。恐怕没有其他选择,除非您想切换到类似的功能,或者对类似于提供的功

你知道龙目山有什么替代品吗? 使用Lombok,我们可以忘记将类与getter和setter以及
toString混为一谈。我想在我的项目中使用它,但是我想知道是否有更好的替代方案

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

这里的“更好”一词颇有争议,但有一种选择是可用的。解释AutoValue和Lombok之间的一些差异


特别是,AutoValue强调不变性(一般来说,这是件好事!)和最少的语言外魔法(与Lombok截然不同)。

恐怕没有其他选择,除非您想切换到类似的功能,或者对类似于提供的功能集感到满意


虽然
AutoValue
可能是纯Java的最佳选择,但它提供了

  • @吸气剂
  • @AllArgsConstructor
  • @EqualsAndHashCode
  • @托斯特林
  • @建筑商
但它错过了

  • @枯萎
  • 托布勒
  • @塞特
  • @委派
  • @扩展方法
  • 还有一些我不用的功能
虽然我非常同意不变性是一种美德,但它有时并不适用。无论如何,Lombok努力支持不变性,它甚至与Guava的不变性集合集成,您可以编写

@Builder @Getter public final class Sentence {
    private final boolean truthValue;
    @Singular private final ImmutableList<String> words;    
}
注:我不是作者,所以我可以说它很酷

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

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

Lombok和
AutoValue
都使用了一些魔法。后者的神奇之处在于标准的注释处理,因此它非常健壮。如图所示,它有一些缺点。我要补充一个事实,即生成了一些我没有订购的AutoValue\u foo


Lombok使用了一些黑色魔法,因此更加脆弱,但它提供了更多的魔法,效果也非常好。

我认为这个问题不应该被解决。虽然这有点像是在要求一种工具,但它是相当基本的。它也可以被重新表述为“有没有办法避免编写所有常见的Java样板文件”,而不提及任何工具。@maartinus+1通常,关闭更严格地遵守规则,而不是看到用户的意图和兴趣……为什么,如果这是我在搜索Lombok替代方案时找到的唯一好资源,这里关门了?而固执己见的答案肯定有什么不好的地方(但它变成了某种元问题):如果你寻找的不是Lombok,而是你的观点或直觉,也许这不是处理样板代码的最佳方式,你想让其他人对他们找到的最佳方式发表意见。怎么样?“可能是纯Java所能得到的最好的结果”——正如Lombok对带注释类所做的那样,仍然称Lomboke代码为纯Java至少是有争议的。@MichalM它是“不纯”的,因为它没有JLS所涵盖的东西。你可以称之为“有争议”或“Java Plus”,无论如何,它工作得很好,提供了严重缺失的功能,只是缓慢地将这些功能引入Java。例如,在Java10中,我们得到了
var
,这在Lombok已经很久了。Lombok也完全同意。这只是你最初的“纯Java”的措辞,这在某种程度上与你回答中的“类似Scala的东西”形成了鲜明的对比。人们不愿意使用Scala或Kotlin或其他任何东西的原因之一可能是为了确保JVM及其未来更新之间的源代码兼容性。在这方面,将Lombok视为“纯Java”可能会带来一种错误的安全感——代价是通过切换到另一种JVM语言(而不仅仅是“Java Plus”)可能会发现所有其他功能都是有用的。当然还有其他方面,比如开发或维护团队对Java代码的熟悉程度。在这个层次上考虑,Lombok代码实际上只不过是“纯Java”。但就是这样,我想“纯粹”这个词唤醒了我内心的一种纯粹主义者——对不起!值得注意的是,构建器也可以通过
o.withA(1).withB(2)
o.toBuilder().a(1).b(2).build()