【问题标题】:Getters and Setters in Java convention [duplicate]Java约定中的Getter和Setter [重复]
【发布时间】:2013-08-05 10:42:50
【问题描述】:

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

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

【问题讨论】:

  • 在 java 中,我们使用 .this 语句来表示 set 方法。我们使用return 语句表示get 方法。
  • 更好的是,支持不变性,使所有字段最终化并且只提供 getter。
  • Java 很冗长……必须写 set 和 get 入 10 个属性

标签: java conventions


【解决方案1】:

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

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

private String _backingString

然后你创建 getter 和 mutators

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

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

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

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

【讨论】:

  • 当我注意到时,我已经纠正了这个问题。 :)
  • 我知道这是个人风格问题,但是这个_伤害了我的眼睛,这不是标准。
  • 请原谅一个 C# 开发人员 - 我知道标准,但有时当上下文切换如此之多时,我的大脑让它滑倒了。 (就像字符串 vs 字符串 .. 即别名一样)。
  • @VaughanHilts 是的,我也在做_ :) 旧习惯很难改掉 :)
  • 啊,你是C#开发者,那就可以理解了:)
【解决方案2】:

您应该编写 getter 和 setter。或者更好 - 让您的 IDE 自动生成它们。否则你会破坏封装。另外,也许您只需要一个吸气剂。

使用 getter 或 setter 的另一个优点是在返回或设置字段之前进行一些检查或预处理。

这里是一个示例代码sn-p:

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;

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

【讨论】:

  • 谢谢,我暗暗希望得到不同的答案:)
  • @Dimitar Dimitrov - 有一个名为 Lombok 的项目来减少样板。我很快就会编辑我的帖子。
  • 而且除了封装..如果你必须改变内部表示更灵活..只需要改变内部的getter方法并且客户不关心内部表示
  • @nachokk - 正确,感谢您的补充。
  • 我正在努力学习,只是想知道,你认为做private String name_; 更好吗?然后 public void setName(String name){ this.name_ = name; }
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    private String myField; 
    public String getMyField()
    {
       return this.myField;
    }
    public void setMyField(String value)
    {
       //validation stuff
       this.myField = value;
    }
    

    【讨论】:

      【解决方案5】:

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

      getBalance()
      {
         return this.staticBalance;
      }
      

      到这里:

      getBalance()
      {
        return calculateBalance();
      }
      

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

      其他好处是:

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

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

      【讨论】:

      • +1 用于解释为什么需要 setter 和 getter
      • 你可以摆脱this.(混乱)
      • @SteveKuo 我将this 放在该字段上以使其作为一个字段脱颖而出,因为我不想做一个完整的类定义,但我同意它对于方法调用来说是混乱的。从方法调用中删除它。
      【解决方案6】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-05-20
        • 2013-03-03
        • 2011-02-26
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        相关资源
        最近更新 更多