定义一个不返回特定字段的getter是一种好习惯吗?

时间:2014-08-27 07:47:01

标签: java getter

一个简单的问题。像这样的方法是好的做法吗?

private NavigableMap<Double, Site> m_sites;

private Site getRandomSite()
{
    return m_sites.ceilingEntry(Math.random()).getValue();
}

或者它是不好的,因为它是一个吸气剂,你可以期望它会返回“randomSite”字段?

6 个答案:

答案 0 :(得分:3)

如果您(代码的作者)认为对于其余代码库感到困惑/不好,那么将名称更改为例如generateRandomNumber()。但是,没有任何惯例表明&#34; get方法&#34;必须总是返回一个字段。

答案 1 :(得分:3)

方法很好,虽然我可以理解你不想把它称为getRandomSite(),因为它看起来像一个getter方法。基于Gio的答案,我建议你调用方法fetchRandomSite(),因为正如你所说,这种方法不会生成随机网站,它只是从NavigableMap中挑选(或取出)。

答案 2 :(得分:2)

一个吸气剂可以得到任何东西(返回任何东西)。并不意味着它只返回某个字段的值。您当前的方法没有问题。

答案 3 :(得分:1)

不,这是不好的做法。这样的方法应该是静态的,并且封装在实用程序类中,因为它们没有任何暗示它们与封闭类相关联。此外,实用程序类应该有一个私有构造函数,因此不能意外地实例化它。

可能有用的情况是MyClass.allocateNextUniqueKey()。但是在这种情况下,该方法不应该分配已经使用过的密钥,因此它肯定与MyClass有关联。

答案 4 :(得分:0)

如果你的方法确实计算了某些东西,那么表示这种行为的方法名称可能更好:

private NavigableMap<Double, Site> m_sites;

private Site pickRandomSite()
{
    return m_sites.ceilingEntry(Math.random()).getValue();
}

在任何情况下,它是否是一个真正的吸气者(这是一种虚拟方法,缺乏像C#这样的属性或者对于struct等效的公共领域的恐惧),是唯一的问题是方法名称反映了它的目的。

示例:不要给getSite()一个会返回随机网站的方法。

另一方面,getRandomSite的错误是什么 - 比使用m_sites还要多。我知道这是一个公司惯例,但它对我来说是混淆(我讨厌前缀成员/方法的范围命名约定)。

答案 5 :(得分:0)

有一些关于吸气剂的约定。如果有吸气剂,则可能存在相应的设定器。此setter必须使用与getter完全相同类型的一个参数。一些框架,例如Spring可以强制执行此操作。

回到你的问题,预计getters最后会返回一个字段。这并不意味着必须直接返回该字段。可能有例如延迟加载或转换(getDurationInMillis,getDurationInSeconds,...),但是如果没有进行任何更改,它是否真的需要get-Methods返回相同的值。 Math.random()似乎是一个很好的例子。它被称为random()而不是getRandom(),因为会返回更改值。

总之,如果一种方法不能满足所有的吸气剂期望,那么最好另外命名。获取,搜索,......