Java约定中的Getters和Setter

Dim*_*rov 3 java conventions

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

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

public class Person 
{
   public string Name { get; set; }
   public int Age { get; set; }
   // say 10+ properties
}
Run Code Online (Sandbox Code Playgroud)

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

public class Person {
   public String name;
   public int age;
   // rest of the stuff here
}
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*hev 9

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

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

以下是示例代码段:

private String name;

public String getName() {
   return this.name;
}

public void setName(String name) {
   this.name = name;
}
Run Code Online (Sandbox Code Playgroud)

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

@Getter @Setter
private String name;
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,我暗暗希望得到一个不同的答案:) (2认同)

lre*_*der 6

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

getBalance()
{
   return this.staticBalance;
}
Run Code Online (Sandbox Code Playgroud)

对此:

getBalance()
{
  return calculateBalance();
}
Run Code Online (Sandbox Code Playgroud)

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

其他好处是:

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

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