Java约定中的Getters和Setter

时间:2013-08-04 18:20:32

标签: java conventions

我的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
}

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

6 个答案:

答案 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生成工具。

You can see this SO question on how to do this in Eclipse.

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