我的Java有点生疏(过去几年一直在做C#)。我也希望这不是一个非常主观的问题。
无论如何说我上课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
}
我对此感到有点不安。我意识到没有“正确答案”但是,我对一般惯例和最佳实践更感兴趣。
答案 0 :(得分:9)
你应该写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;
代码生成是在编译时完成的。
答案 1 :(得分:6)
最好让getter / setter返回字段,以便封装字段的计算方式。尽管很少发生,但有时候你想改变这样的事情:
getBalance()
{
return this.staticBalance;
}
到此:
getBalance()
{
return calculateBalance();
}
在Java中改变字段行为而不会改变大量代码(或者更糟糕的是要求API用户更改代码串)的唯一方法是使用getter和setter。
其他好处是:
编写样板文件很繁琐,但是一个好的IDE只会从字段名称中为您生成这些方法。
答案 2 :(得分:3)
您必须创建手动功能才能执行此操作。
首先,您创建一个支持字段。
private String _backingString
然后你创建了getter和mutators
public String getBackingString()
{
return this._backingString;
}
public String setBackingString(String value)
{
this._backingString = value;
}
这是Java惯例 - 除此之外别无选择。但是,您会很高兴知道大多数IDE都有工具来生成这些。只需谷歌浏览你最喜欢的IDE生成工具。
答案 3 :(得分:1)
你应该为每个人做getter和setter。现代IDE让它变得简单,因为它们具有自动插入选项。 最终,您可以使用Calendar的类样式创建get和set方法。
答案 4 :(得分:1)
我经常使用这两种方法,有吸气剂和制定者,而不是。我总是使用私有字段强制在我的模型中使用getter和setter。使用JPA和Hibernate,我的模型与我的数据库模式相关联。然后对于通常用于RESTful服务之类的我的DTO,我主要使用没有getter和setter的公共字段。这些DTO没有逻辑并被编组到JSON或从客户端设置的JSON创建,所以我发现不需要getter和setter。我通常也不会为这些覆盖equals和hashCode。它们尽可能简单。
所以我认为没有正确或错误的方式,这取决于使用情况。
如果您打算创建getter和setter,让IDE为您完成工作。
答案 5 :(得分:0)
您使用的是哪个IDE?在Eclipse中,您可以从源菜单自动创建它们,它们的名称来自字段名称。 代码:
private String myField;
public String getMyField()
{
return this.myField;
}
public void setMyField(String value)
{
//validation stuff
this.myField = value;
}