歧管与伦波克:通过财产支持增强Java
#编程 #教程 #tooling #java

今天,我们将探索歧管的有趣方面:其属性支持。相比之下,我们还将研究Lombok,这是一个流行的图书馆,提供类似的功能。通过分析这两个项目之间的差异,我们可以深入了解它们的核心理念和优势。让我们潜入并发现歧管的财产支持如何脱颖而出。

一如既往,您可以在我的GitHub page上找到本文的代码示例和其他资源。

比较歧管和伦波克

歧管和伦波克(Lombok)是非常不同的项目,但它们确实在一些领域重叠。属性是重叠最大的地方,并且两者之间的哲学差异最大。

让我们详细探讨这些差异,强调每个差异的优势和局限性。下表提供了高级比较:

Lombok 歧管
成熟
IDE支持 所有支持的主要IDE Intellij/Idea
退出策略 Easy
可扩展性 挑战 模块化
范围 有限 广泛

成熟,IDE支持和退出策略

Lombok已经存在了相当长的一段时间,其许多功能都是为Java版本设计的。因此,其某些功能可能不再相关或适用。此外,Lombok与现代IDE的集成可能会受到限制,并且将Lombok代码转换回普通Java来源可能并不简单。尽管Lombok提供了必需的样板去除,但由于其潜在方法,它通常被视为临时解决方案或“创可贴”。

歧管的可扩展性和范围

歧管提供了一个更可扩展和可插入的框架,并具有精心设计的体系结构。尽管它可能仍面临增长的痛苦和有限的IDE支持,但歧管的灵活性允许更雄心勃勃的项目和未来的增强。它在提供独特功能的同时利用Java类型系统的优势。

财产支持

歧管的财产支持基于一个概念,该概念已经在Java社区中讨论了数十年。但是,在该方向上达成共识被证明是具有挑战性的,因此JEP从未实现。就个人而言,我深入参与了这次讨论,并强烈提倡对象属性。使用瓦尔哈拉(Valhalla),对象属性可能会成为前进的黄金标准。

歧管采用了一种更标准的方法,该方法与其他语言(例如C#和Kotlin)保持一致,提供了熟悉且强大的属性符号。这很好,它可以短期缓解getters和setters的冗长。

区分歧管的财产支持

要了解歧管的属性支持,让我们检查其与Lombok示例的等效代码。这是标准的普通旧爪哇对象(PO​​JO)。注意获取和设置方法?这些是标准的Java属性,在样板上有功能强大但很重:

public class HelloPojo {
    private int number;
    private String str;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }
}

我们可以使用Lombok编写相同的代码:

@Getter
@Setter
public class HelloLombok {
    private int number;
    private String str;
}

用法是相同的:

obj.setNumber(5);

这是有问题的。您会注意到我们将字段定义为私人,但突然出现了一种setNumber()方法,出现了稀薄的空气。感觉很奇怪。我得到了逻辑。伦波克的创建者希望它成为一个替代品。您可以用setter编写代码的其余部分,因此,如果您选择删除Lombok,则不需要编辑代码的其余部分。它仍然很奇怪。

歧管等效物相似,但有一些细微差别:

public class HelloProperties {
    @var int number;
    @var String str;
}

一个值得注意的区别是,歧管的属性是在单个字段级别定义的,而不是应用于整个类。尽管流形可能会在将来引入类似的功能与伦波克的数据注释相似,但目前不存在。我们需要明确定义每个属性。

默认情况下,歧管将属性私有并生成公共访问者(Getters and Setters)。但是,就像Lombok一样,歧管允许通过注释进行自定义。

最大的区别在于用法。与Lombol不同,歧管可以直接访问该属性,从而消除了对明确方法调用的需求。这种行为不仅适用于属性,还适用于常规的设定器和盖特斯,创造了一致,直观的体验。例如,以Calendar.instance访问Calendar.getInstance()或使用timeInMillis而不是getTimeInMillis()从实例中检索时间,以展示歧管提供的句法清晰度和简洁性:

// In Manifold a property acts like field access
var properties = new HelloProperties();
properties.number = 5;

// even POJO getters and setters act like field access
var pojo = new HelloPojo();
pojo.number = 5;

// This is equivalent to Calendar.getInstance().getTimeInMillis()
var time = Calendar.instance.timeInMillis;

自定义歧管属性

类似于Lombok,歧管为单个属性提供了自定义选项。通过使用val,只能定义一个只有getter的读取属性,与最终字段相似。相反,set定义了仅写入属性。此外,可以将范围偏好作为参数传递,从而影响生成的方法的可见性。

这是一个自定义此类范围的示例类:

public class HelloScoping {
    @val(PropOption.Package) int number = 5;
    final @set String str;
}

我们可以这样使用:

var scoping = new HelloScoping();
scoping.str = "";
System.out.println(scoping.number);

// This line won’t compile due to “read only” property
scoping.number = 4;

// This line won’t compile due to “write only” property
System.out.println(scoping.str);

封装和方法实施

尽管属性在歧管中具有可访问性,但封装并未受到损害。如果明确实现了设置器或Getter方法,则歧管识别自定义实现并与属性无缝交互。例如,实现setNumber()允许代码相应地处理对number字段的访问,从而在整个代码库中保持一致的行为:

public class HelloComputed {
    @var int number;
    @var String str;

    public void setNumber(int number) {
        this.number = number - 1;
    }
}

以下代码将打印4

computed.number = 5;
System.out.println(computed.number);

其他考虑因素

虽然Lombok和Maniold都提供了有用的功能,但重要的是考虑一些可能影响您决定的方面。 LOMBOK提供了生成平等,哈希码和ToString方法的注释。它提供了产生构造函数,构建器模式和登录器的注释,目前所有这些都缺少。

此外,Lombok的@SneakyThrows注释可以在不明确声明或处理的情况下投掷检查例外。歧管以类似的全局配置解决了这一点,在整个代码库中禁用了检查的异常。对于大多数开发人员而言,这可能有点笨拙。但是,值得注意的是,这些不是直接的等效物,并且具有不同的含义。

我们可以在下表中总结一下:

lombok

歧管

data&value

equals/hashcode/tostring

constructors

构建者

loggers

。?

流体点语法

智能范围

最后一句话

当我们结束对歧管和伦波克财产支持的探索时,很明显,这两个项目都为增强Java开发带来了独特的方法。尽管Lombok一直是一个受欢迎的选择,但其局限性和遗产功能可能会促使开发人员寻求替代解决方案。另一方面,歧管的可扩展性,建筑健全性和独特的功能使其成为现代Java项目的诱人选择。歧管很年轻,在这个特定部门仍然存在一些局限性。这可能会阻碍其在短期内采用。

就我个人而言,我仍然在篱笆上。我认为这里有巨大的潜力。我觉得这是一个更好的思考解决方案。相比之下,伦波克感觉有点像创可贴。歧管的主要好处是整个项目提供的功能要比Lombok更大。

记住在我的GitHub page上查看代码示例和资源,以进一步加深您对歧管财产支持的理解。