Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 定义一个不返回特定字段的getter是一种好的做法吗?_Java_Getter - Fatal编程技术网

Java 定义一个不返回特定字段的getter是一种好的做法吗?

Java 定义一个不返回特定字段的getter是一种好的做法吗?,java,getter,Java,Getter,一种简单的问题。像这样的方法是好的实践吗 private NavigableMap<Double, Site> m_sites; private Site getRandomSite() { return m_sites.ceilingEntry(Math.random()).getValue(); } 私有NavigableMap m_站点; 私有站点getRandomSite() { 返回m_sites.ceilingEntry(Math.random()).getV

一种简单的问题。像这样的方法是好的实践吗

private NavigableMap<Double, Site> m_sites;

private Site getRandomSite()
{
    return m_sites.ceilingEntry(Math.random()).getValue();
}
私有NavigableMap m_站点;
私有站点getRandomSite()
{
返回m_sites.ceilingEntry(Math.random()).getValue();
}

或者是因为它是一个getter,并且您可以预期它将返回字段“randomSite”?

getter可以在后面获取任何内容(返回任何内容)。并不意味着它只返回某个字段的值。您当前的方法没有问题。

如果您,代码的作者,认为它与您的代码库的其余部分相混淆/不好,请将名称更改为例如
generateRandomNumber()
。但是,没有约定说“get方法”必须始终返回字段。

不,这是一种不好的做法。这样的方法应该是静态的,并封装在实用程序类中,因为它们没有任何迹象表明它们与封闭类关联。此外,实用程序类应该有一个私有构造函数,这样它就不会被意外实例化


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

该方法很好,尽管我可以理解您不想调用它,因为它看起来像一个getter方法。基于Gio的回答,我建议您调用方法
fetchRandomSite()
,因为正如您所说,此方法不会生成随机站点,它只是从NavigableMap中拾取(或获取)它。

如果您的方法确实计算了某些内容,那么可能使用一个方法名称来明确此行为会更好:

private NavigableMap<Double, Site> m_sites;

private Site pickRandomSite()
{
    return m_sites.ceilingEntry(Math.random()).getValue();
}
私有NavigableMap m_站点;
私有站点picktrandomsite()
{
返回m_sites.ceilingEntry(Math.random()).getValue();
}
在任何情况下,不管它是一个真正的getter(这是一个虚拟方法,因为它缺少C#中的属性,或者害怕
struct
等价物的公共字段),唯一重要的是方法名称反映了它的用途

示例:不要调用将返回随机站点的方法


另一方面,除了使用
getRandomSite
,我更讨厌的是
m_站点。问过之后,我知道这是一个公司惯例,但这对我来说就像是混淆一样(我讨厌前缀成员/方法的范围命名惯例)。

关于getter有一些惯例。如果有一个getter,那么可能有一个相应的setter。此setter必须采用一个与getter类型完全相同的参数。一些框架(如Spring)可能会强制执行这一点

回到您的问题,期望getter最终返回一个字段。这并不意味着必须直接返回字段。例如,可能存在延迟加载或转换(GetDurationInMills、getDurationInSeconds等),但如果未进行任何更改,是否真的期望get方法返回相同的值。Math.random()似乎就是一个很好的例子。它被称为random()而不是getRandom(),因为会返回更改的值


总之,如果一个方法不能满足所有getter期望,那么最好将其命名为其他方法。fetch,search,…

我的实际源代码有点不同。它使用cellingEntry从NavigableMap中获取一个随机条目。我不能用“生成”这个词。我会编辑这篇文章。我宁愿在外部生成随机数,并将其传递给此方法。让这个方法只获取传递号码的
站点
。@RohitJain Ok,但是这个方法会被称为类似“getCellingSite”的东西。问题是,使用以“get”开头而不返回特定字段的方法是好还是好,看到这一点我很难过(因为我删除了我的评论,
m_站点
)。没有问题。只要你的方法名有意义,并且与它的作用同步,就不应该有任何问题。@nodata发现m________________________________________。