【问题标题】:Java: Is it bad practice to write methods that start with "get" when they aren't getters? [closed]Java:当方法不是 getter 时,编写以“get”开头的方法是不好的做法吗? [关闭]
【发布时间】:2013-08-11 17:42:54
【问题描述】:

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

在java中,如果方法不是getter,那么编写以“get”开头的方法会是不好的做法吗?

【问题讨论】:

  • 你有什么想要的理由吗?
  • 除非万不得已,否则不要将get 用作非吸气剂
  • 如果不是真正的 getter,最好使用“create”或“fetch”

标签: java oop syntax getter-setter


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    最好将附加功能提取到一个名称能描述其意图的新方法中。

    【讨论】:

      【解决方案3】:

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

      看看这个博客。

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

      【讨论】:

        【解决方案4】:

        尽管根据 JavaBeans 约定,getter 的名称必须以 get 开头,但并非所有以 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;
            }
        }
        

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2011-07-07
            • 1970-01-01
            • 2020-07-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-22
            • 1970-01-01
            • 2021-05-07
            相关资源
            最近更新 更多