4

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

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

4

6 回答 6

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;

代码生成在编译时完成。

于 2013-08-04T18:22:54.070 回答
6

最好让 getter/setter 返回字段,以便您可以封装字段的计算方式。尽管这种情况很少发生,但有时您可能想要更改如下内容:

getBalance()
{
   return this.staticBalance;
}

对此:

getBalance()
{
  return calculateBalance();
}

在 Java 中,在不更改大量代码(或者更糟的是要求您的 API 用户更改大量代码)的情况下更改字段行为的唯一方法是使用 getter 和 setter。

其他好处是:

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

编写样板文件很乏味,但一个好的 IDE 只会根据字段名称为您生成这些方法。

于 2013-08-04T18:29:08.287 回答
3

您必须创建手动功能才能做到这一点。

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

private String _backingString

然后你创建 getter 和 mutators

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

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

这是 Java 约定 - 没有其他方法可以解决它。但是,您会很高兴知道大多数 IDE 都有生成这些的工具。只需搜索您最喜欢的 IDE 生成器工具即可。

你可以看到这个关于如何在 Eclipse 中执行此操作的问题。

于 2013-08-04T18:22:11.900 回答
1

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

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

如果您要创建 getter 和 setter,让您的 IDE 为您完成工作。

于 2013-08-05T02:53:56.373 回答
1

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

于 2013-08-04T18:23:18.650 回答
0

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

private String myField; 
public String getMyField()
{
   return this.myField;
}
public void setMyField(String value)
{
   //validation stuff
   this.myField = value;
}
于 2013-08-04T18:28:29.043 回答