0

我只是好奇,因为我习惯了 objC,我们使用点符号来调用 getter,所以当方法以 get 开头时,它不一定与实例变量有任何关系。

在java中,当它们不是getter时编写以“get”开头的方法会是不好的做法吗?

4

5 回答 5

3

get对服务于比简单目的更大的方法使用前缀getter可能会产生误导,因为该方法可能会产生调用者未预料到的意外后果。

将附加功能提取到名称描述其意图的新方法中将是一种更好的做法。

于 2013-08-09T17:51:27.257 回答
2

如果您这样做,它不会终结世界,但请从 5 年后将要查看您的代码的人那里考虑一下。就我个人而言,我不会将 get 用于实际上不是 getter 的方法。如果你愿意,你可以使用 fetch 。但只是个人喜好。

看看这个博客。

http://blog.joda.org/2011/08/common-java-method-names.html

于 2013-08-09T17:52:47.867 回答
2

尽管get根据 JavaBeans 约定,getter 的名称必须以 开头,但并非所有以 开头的名称都get必须代表“哑”getter,即由简单变量支持的名称。如果一个方法得到一些东西,即使是一个与你的对象相关联的计算的东西,给它一个开头的名字get是完全合适的。

下面是一个不代表变量支持属性的“get”方法示例:

public class Person {
    private Date dob;
    // DOB is a "classic" property
    public Date getDob() {
        return dob;
    }
    public void setDob(Date dob) {
        this.dob = dob;
    }
    // Although ageInYears is a calculated property,
    // a name that starts in "get" is appropriate for it.
    int getAgeInYears() {
        Calendar now = Calendar.getInstance(Locale.US);
        now.setTime(new Date());
        Calendar old = Calendar.getInstance(Locale.US);
        old.setTime(dob);
        int diff = now.get(YEAR) - old.get(YEAR);
        if (old.get(MONTH) > now.get(MONTH) || 
        (old.get(MONTH) == now.get(MONTH) && old.get(DATE) > now.get(DATE))) {
            diff--;
        }
        return diff;
    }
}
于 2013-08-09T17:53:55.560 回答
1

这实际上取决于您如何使用它,除非它使代码混淆或误导您的方法名称。

于 2013-08-09T17:51:00.253 回答
0

我想,答案是肯定的。Java 中的大多数程序员习惯于将 getter 作为返回私有字段值的方法。

由于“get”对于方法名称来说非常笼统,因此更喜欢一个更精确的名称,它可以告诉您有关意图(问题“为什么”)或算法(问题“如何”)的一些信息。sortNames(...) 或 applyQuicksort(...) 比 getPhoneBook() 好得多。此外,findNumberForName(...) 比 getNumber(...) 好得多。“查找”表示它具有 O(log(n)) 或 O(n) 的复杂性,但不是 O(1),因为它通常用于 getter。

有时您需要或希望保持名称非常笼统。我总是使用“provide”而不是“get”来避免混淆。

于 2013-08-09T18:19:51.340 回答