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; }