【问题标题】:Does a getter with a different return type qualify as a getter?具有不同返回类型的 getter 是否有资格作为 getter?
【发布时间】:2012-03-17 04:35:46
【问题描述】:

我有一个变量叫

List<String> names;

如果我有类似的方法

Iterator getNames() { return names.iterator(); }

它在技术上仍然是一个 getter 方法,因为我将它更改为 Iterator 吗?

【问题讨论】:

  • 我问是因为这没有显示在我的单元测试涵盖的代码下。所以我在是否需要为它编写单元测试用例时陷入两难境地?因为我们一般不会为 Getter 和 Setter 编写测试用例吧?

标签: java getter-setter


【解决方案1】:

尽管 JDK 允许这样做,但这样做并不是一个好主意。

一方面,有一些基于方法命名的约定,它们有一些依赖关系。

  1. JavaBean 对象使用 getter 和 setter 来设置 bean 属性。如果他们不遵守约定,程序就会失败。见JavaBeans spec, section 8.3.1

  2. JSON 对象 - JSONObject 类使用构造函数中的访问器方法。 见:http://www.json.org/javadoc/org/json/JSONObject.html#JSONObject(java.lang.Object)

  3. 如果某些 JPA 实现具有多个名称相同但返回类型不同的 getter,则它们将错误地处理您的实体类。

我敢打赌有更多的依赖,但即使这些不适用于您的解决方案,为了可读性,遵循约定仍然是明智的。您不希望任何其他开发人员在未来某个时候诅咒您违反标准:)

【讨论】:

    【解决方案2】:

    从设计的角度来看,这对我来说似乎是个坏主意。

    我只需要一个吸气剂public List<String> getNames()

    对于“安全发布”,您应该考虑在实现中返回列表的副本

    public List<String> getNames() {
        return new ArrayList<String>(names);
    }
    

    【讨论】:

    • unmodifiable list 也不是什么可怕的想法。它会阻止任何调用你的 getter 的人认为他们可以通过他们得到的 List 添加/更改名称,而不是你类中的正确方法。
    • 是的,但是如果我们返回一个 List,那么使用它的方法也必须是 list 类型。将来如果我们稍后将变量的类型更改为数组。这意味着我必须更改 getter 方法的返回类型。这反过来会影响使用它的方法。
    【解决方案3】:

    如果你的类将被一些 bean 工具自省,getNames() 应该返回名称。 为了清楚起见,称它为:

    getNamesIterator();
    

    【讨论】:

      【解决方案4】:

      你的想法正好相反。 getXxx 形式的方法是一个getter。 Java 约定并不意味着您必须有一个名为 xxx 的字段。这是您的类业务,封装仅提供:将您的数据结构隐藏到其他类的能力。

      抱歉打错字了,手机..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-27
        • 1970-01-01
        • 1970-01-01
        • 2014-12-07
        • 2018-08-30
        • 2014-10-17
        相关资源
        最近更新 更多