Java约定中的getter和setter

我的Java有点生疏(过去几年一直在做C#)。 我也希望这不是一个非常主观的问题。

无论如何说我有class级Person (是的,有点陈词滥调,我知道),没有行为(C#版本):

 public class Person { public string Name { get; set; } public int Age { get; set; } // say 10+ properties } 

等效的Java版本将如何? 我知道我可以写一堆getter和setter(但是说我有10多个属性),感觉就像很多样板。 这样做是不好的做法:

 public class Person { public String name; public int age; // rest of the stuff here } 

我对此感到有点不安。 我意识到没有“正确答案”但是,我对一般惯例和最佳实践更感兴趣。

你应该写getter和setter。 或者更好 – 让IDE自动生成它们。 否则你打破了封装。 也许你只需要一个吸气剂。

使用getter或setter的另一个好处是可以在返回或设置字段之前进行一些检查或预处理。

以下是示例代码段:

 private String name; public String getName() { return this.name; } public void setName(String name) { this.name = name; } 

您可以选择使用http://projectlombok.org/并使用注释将其写为:

 @Getter @Setter private String name; 

代码生成是在编译时完成的。

最好让getter / setter返回字段,以便封装字段的计算方式。 虽然它很少发生,但有时候你想改变这样的事情:

 getBalance() { return this.staticBalance; } 

对此:

 getBalance() { return calculateBalance(); } 

Java中改变字段行为而不会改变大量代码(或者更糟糕的是要求API用户更改代码串)的唯一方法是使用getter和setter。

其他好处是:

  • 子类能够覆盖行为
  • 提高了线程安全性,因为您可以同步访问

编写样板文件很繁琐,但是一个好的IDE将从字段名称中为您生成这些方法。

您必须创建手动function才能执行此操作。

首先,您创建一个支持字段。

 private String _backingString 

然后你创建getter和mutators

 public String getBackingString() { return this._backingString; } public String setBackingString(String value) { this._backingString = value; } 

这是Java惯例 – 没有其他办法解决它。 但是,您会很高兴知道大多数IDE都有工具来生成这些。 只需谷歌浏览您最喜欢的IDE生成器工具。

您可以在Eclipse中看到有关如何执行此操作的问题。

你应该为每个人做getter和setter。 现代IDE让它变得简单,因为它们具有自动插入选项。 最终,您可以在Calendar的类样式中创建get和set方法。

我经常使用这两种方法,有吸气剂和安装者而不是。 我总是使用私有字段强制在我的模型中使用getter和setter。 使用JPA和Hibernate,我的模型与我的数据库模式相关联。 然后对于通常用于RESTful服务之类的我的DTO,我主要使用没有getter和setter的公共字段。 这些DTO没有逻辑并被编组到JSON或从客户端设置的JSON创建,所以我发现不需要getter和setter。 我通常也不会为这些重写equals和hashCode。 它们尽可能简单。

所以我认为没有正确或错误的方式,这取决于使用情况。

如果您打算创建getter和setter,那么让IDE为您完成工作。

您使用的是哪个IDE? 在Eclipse中,您可以从源菜单自动创建它们,它们的名称来自字段名称。 码:

 private String myField; public String getMyField() { return this.myField; } public void setMyField(String value) { //validation stuff this.myField = value; }