有没有更好的标准方法在 Java 中创建 getter 和 setter?
必须为每个变量显式定义 getter 和 setter 是非常冗长的。有更好的标准注释方法吗?
Spring有这样的东西吗?
甚至 C# 也有属性。
有没有更好的标准方法在 Java 中创建 getter 和 setter?
必须为每个变量显式定义 getter 和 setter 是非常冗长的。有更好的标准注释方法吗?
Spring有这样的东西吗?
甚至 C# 也有属性。
我不确定你是否认为它是“标准的”,但Project Lombok解决了这个问题。他们使用注释来代替 Java 的大部分冗长。
有些人正在寻找替代的 Java 兄弟语言,例如 Groovy 或 Scala。恐怕需要几年时间——如果有的话——JSR 会找到一种“标准化”的方式来在 Java 中“修复”这个问题。
Eclipse 有一个上下文菜单选项,可以为您自动生成这些,我相信许多其他 IDE 都会这样做。
我创建了一些不是 Eclipse 特定的注释。
请参阅http://code.google.com/p/javadude/wiki/Annotations
例如:
package sample;
import com.javadude.annotation.Bean;
import com.javadude.annotation.Property;
import com.javadude.annotation.PropertyKind;
@Bean(properties={
@Property(name="name"),
@Property(name="phone", bound=true),
@Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
})
public class Person extends PersonGen {
}
我的注释生成一个超类;我认为 Lombok 修改了正在编译的实际类(Sun 官方不支持它并且可能会中断 - 我可能对它的工作方式有误,但根据我所看到的,他们必须这样做)
享受!——斯科特
作为一种可能的选择,您是否尝试过Scala?它编译成 Java 字节码,并有许多有趣的快捷方式,可以让您作为 Java 程序员的生活更轻松。
例如属性:
case class Person(var name:String,
var age:Int);
val p = Person("John", 4)
p.name
p.name = "Charlie"
p.name
和输出:
defined class Person
p: Person = Person(John,4)
res7: String = John
res8: String = Charlie
我同意 getter/setter 是冗长的。正如其他人所建议的那样, Project Lombok 对此有很好的答案。否则,您可以使用 IDE 的功能来生成它们。
这是一篇关于这个主题的有趣文章:http: //cafe.elharo.com/java/why-java-doesnt-need-properties-it-already-has-them/
我认为属性是一种捷径,但它更像是一个小功能而不是一个真正重要的功能
还有带有 @RooJavaBean 注解的 Spring Roo 项目。它也有 @RooToString 和 @RooHashCodeEquals 或类似的东西。它在后台使用适当的方法生成一个 AspectJ 文件。
大多数 IDE 提供了生成代码的快捷方式(例如Eclipse:右键单击 -> Source -> Generate Getters & Setters),尽管我意识到这可能不是您要寻找的答案。
一些 IOC 框架允许您注释属性,以便它们可以在框架的上下文中使用,例如 Tapestry IOC 和最新的 Spring,我认为(但这种用法仅限于框架使用)
使用 Netbeans,只需在要替换 getter/setter 的位置开始键入 get 或 set 并调用自动完成 (Ctrl+Space),它就会为您提供生成 getter 或 setter 的选项。它还将为您提供生成构造函数的选项。
作为语言的一部分,没有比这更好的方法了——没有什么比“property”关键字更好的了。
正如其他人所提到的,一种替代方法是使用您的 IDE 来生成它们。另一个,如果你有很多需要这个的对象,是编写你自己的代码生成工具,它接受一个基类并生成一个带有 getter 和 setter 的包装器。
您也可以简单地将变量公开为公共成员。但是,当您决定添加验证逻辑时,这可能会再次伤害您。
但是,最后一个想法:除非您的类仅用于传输数据,否则它们可能不应该公开其内部状态。IMO,带有getter和setter的“行为”类是一种代码味道。
尝试这样的事情:
@Getter @Setter private int age = 10;
更多信息如下:
是的,你有点不走运。Groovy 会为您生成它们,但在标准 java 中没有骰子。如果您使用 Eclipse,您可以很容易地生成它们,以及生成 hashCode() 和 equals() 函数。
如果您需要一个只读类,请查看 Java Records。它自动生成 getter 和方法,例如 equals 和 hashcode。但是,此功能并不稳定,目前您可以将其用作实验功能(可能会在 Java 16 上稳定)。 https://dzone.com/articles/introducing-java-record
如果您使用 emacs,则可以定义一个为您执行此操作的 emacs 宏。那里有任何emacs大师吗?:)
这是 IDE 的工作,它生成重复的详细代码作为 getter/setter
使用您的 IDE 为您生成它,并尽量减少您拥有的 getter/setter 的数量 - 您可能会享受到不变性的额外好处。
我喜欢属性的 C# 语法,我认为它漂亮干净,而且非常干净。
好吧,一种选择是不要那么害怕公共领域。对于你知道永远不会在 get 和 set 的底层做验证或额外工作的简单类,公共字段需要更少的样板,语法更好,效率更高。