我今天遇到了lombok.
我非常想知道它是如何工作的.
Java Geek文章提供了一些线索,但对我来说并不是很清楚:
Java 6删除了apt并使javac能够管理注释,简化流程以获得更简单的单步计算.这是龙目岛采取的路径.
也许使用Java 6编译过程将是:javac - > apt - > lombok apt process - >读取类文件并使用ASM添加set/get方法?
你能告诉我关于机制的更多细节吗?
有没有办法使用自动构建器为类创建构建器(Joshua Bloch的Builder模式)Eclipse?例如菜单中的选项,插件或其他内容.我在" Refactor" 下找不到任何东西.
我在我的项目中使用了龙目岛,但我的同事不同意使用它,他的理由是(来自lombok文件的争议)
这两个项目Lombok都利用非公共API来完成他们的巫术.这意味着使用后续IDE或JDK版本可能会破坏Project Lombok的风险.
但这是一篇2010年写的非常古老的文档,也许现在已经解决了这个问题,所以我想知道Lombok是否支持Java 9并且它仍然使用非公共API:s?
我想出了新的一年的性能目标,我认为我的目标是减少代码库的大小,特别是样板,我会觉得很有趣.我提出的解决这个问题的一个动作就是使用Project Lombok来使bean尽可能短.但我习惯于忽视新软件和方法的缺点,所以我依赖Stack Overflow社区:谁能告诉我为什么龙目岛是个坏主意?
toString某些简单类的自动生成方法是好还是坏?
我正在考虑生成类似下面的内容,它采用变量名称并生成一个toString方法,打印名称后跟其值.
private String name;
private int age;
private double height;
public String toString(){
return String.format("Name: %s Age: %d Height %f", name, age, height);
}
Run Code Online (Sandbox Code Playgroud) 我们将Java版本从8升级到11但是我得到了getter/setter方法的编译错误,其中我使用Lombok的Getter和Setter Annotations实现了POJO类.
有没有办法使用Lombok的@Data注释,它提供getter和setter而不在Java 11中实现它们?
目前,我面临的错误是:
找不到getStoreName()
where storeName在类上面声明为全局变量,在类上面有@Data Lombok注释.
是否有人使用Project Lombok进行大规模生产系统?它如何影响您的编译过程(即它是否进行双程编译,减慢速度,使其更脆弱)?
假设我有一个包含许多公共方法的类:
public class MyClass {
public void method1() {}
public void method2() {}
(...)
public void methodN() {}
}
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个包装类,它将所有方法委托给包装实例(委托):
public class WrapperClass extends MyClass {
private final MyClass delegate;
public WrapperClass(MyClass delegate) {
this.delagate = delegate;
}
public void method1() { delegate.method1(); }
public void method2() { delegate.method2(); }
(...)
public void methodN() { delegate.methodN(); }
}
Run Code Online (Sandbox Code Playgroud)
现在,如果MyClass有很多方法,我需要覆盖它们中的每一个,这或多或少是相同的代码,只是"委托".我想知道是否有可能做一些魔法来自动调用Java中的方法(所以Wrapper类需要说"嘿,如果你在我身上调用一个方法,只需去委托对象并在其上调用此方法)".
顺便说一句:我不能使用继承,因为委托不在我的控制之下.我只是从其他地方得到它的实例(另一种情况是如果MyClass是最终的).
注意:我不想生成IDE.我知道我可以在IntelliJ/Eclipse的帮助下完成它,但我很好奇是否可以在代码中完成.
有什么建议如何实现这样的事情?(注意:我可能会在某些脚本语言中执行此操作,例如php,我可以使用php magic功能来拦截调用).
我正在尝试将groovy添加到利用Lombok的现有Java Maven项目中.不幸的是,当我使用下面的pom片段启用groovy-maven-eclipse编译器时,我的lombok注释的java文件无法编译.据我所知,Lombok根本没有参与java文件的编译.
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<compilerId>groovy-eclipse-compiler</compilerId>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-eclipse-compiler</artifactId>
<version>2.6.0-01-SNAPSHOT</version>
</dependency>
</dependencies>
</plugin>
Run Code Online (Sandbox Code Playgroud)
我还应该指出,在eclipse中(使用m2e)一切正常.当我尝试做一个mvn包时,我的问题出现了.
Java类中常见的有许多getter和setter方法,每个方法对应一个数据模型类变量.我意识到很多IDE会为你创建这些,但是我试图避免这种混乱,并且在我的课程中没有所有这些方法.那么,有没有办法以类外的只读方式访问变量(就好像它是公共最终的),同时保留了类或子类内的写访问权限(就好像它是私有的或受保护的).
我提出的唯一伪解决方案是基类(或具有默认方法的接口),它具有get(String variableName)方法,然后通过反射获取类的字段并返回适当的字段.缺点是,为了工作,变量必须是公共的,所以只有按照惯例它才符合我的要求(在扩展/实现类中有我想要访问的变量,我只调用get方法在类之外,并没有实现set方法).我不喜欢的主要问题是,如果变量名称发生变化,get方法的调用者将不会导致编译器错误,因为变量名称只是一个硬编码的String.
谁有更好的主意?
java ×9
lombok ×6
boilerplate ×2
reflection ×2
annotations ×1
automation ×1
builder ×1
delegates ×1
eclipse ×1
getter ×1
groovy ×1
java-11 ×1
java-9 ×1
java-ee ×1
maven-3 ×1
oop ×1
setter ×1
tostring ×1