代码之家  ›  专栏  ›  技术社区  ›  Russell Zornes

为什么Java使用这个约定?成员?[关闭]

  •  4
  • Russell Zornes  · 技术社区  · 16 年前

    我经常在Java代码中看到下面的命名约定。

    class SomeClass {
        private final String name;
    
        public SomeClass(final String name) {
            this.name = name;
        }
    }
    

    我觉得这有点奇怪。首先,如果你碰巧把方法签名中的变量拼错了,它仍然会编译…

    class SomeClass {
        private final String name;
    
        public SomeClass(final String nane) {
            this.name = name;
        }
    }
    

    编译精细。可能会将nane标记为未使用的变量,但赋值(这只是一个自赋值)会自动编译。

    我发现自己想用“m”来表示成员变量,例如…

    class SomeClass {
        private final String mName;
    
        public SomeClass(final String name) {
            mName = name;
        }
    }
    

    它比。这个变体短,并捕获前面显示的奇怪的拼写错误。

    然而,我的一个同事给了我各种各样的东西,当我把它作为我们新项目的一项公约时,说“在Java中,我们不这么做。”

    只是好奇为什么?

    8 回复  |  直到 16 年前
        1
  •  15
  •   Jon Skeet    16 年前

    就我个人而言,我不喜欢使用前缀——这会使代码更难阅读,依我看。我相信不同的人会以不同的方式阅读——最后我会“在我的脑袋里大声朗读”,而前缀会打断这一过程。很明显你可以习惯,但我宁愿不用。

    但是,声称 没有人 使用了这样的前缀。我曾在Java公司使用过一些不同的前缀,有些则没有。

    我还指出,在您的打字错误示例中,大多数IDE都会警告您不要执行作业。例如,在Eclipse中,我得到:

    The assignment to variable name has no effect
    

    如果你经常忽略警告,我会说你有更大的问题:)

        2
  •  9
  •   bakkal    16 年前

    我宁愿使用 this 只有在 很少有需要的地方 清除歧义,而不是拖动前缀 到处 在代码中。

        3
  •  5
  •   Michael Borgwardt    16 年前

    对成员变量使用特定的前缀是一种匈牙利符号——技术性的,糟糕的类型。信息(什么是和不是成员变量)已经在代码中,不需要复制它。

    正如您所注意到的,一个好的IDE将警告您未使用的变量(并且可能允许您将该警告转换为一个错误)。语法突出显示还将区分局部变量和成员变量。为什么要想出丑陋的代码约定来完成IDE的工作,使一种非常具体的程序员错误不太可能发生?

        4
  •  2
  •   thelost    16 年前

    现代的IDE(如Eclipse)可以自动为您生成getter和setter,这样就可以避免麻烦。

        5
  •  1
  •   mdma    16 年前

    在第一个示例中, this 限定符是显式引用实例成员所必需的 name 相对于局部变量(方法参数) 名称 .

    当您提到参数名可能拼写错误时,您是对的,这是一些令人沮丧的错误的根源。在过去,我还使用了前缀命名约定字段,但是随着Java越来越多地依赖于反射,这确实引入了一些程度的痛苦,所以最近我已经远离它。

    通过使用单元测试,以及在检入前分析代码并为您标记这些错误子代的IDE,可以减少由于拼写错误而导致的错误的可能性。

        6
  •  1
  •   phunehehe    16 年前

    我觉得很奇怪,你的问题假设

    Java使用这个成员的约定。

    这不是真的,因为不同的人有不同的习俗。 在我的代码中有很多this.member,但这只是因为我的IDE(NetBeans)生成了它,我不太在乎重写它。

        7
  •  1
  •   xdevel2000    16 年前

    this.member 不是约定,但当必须显式地将具有本地变量相同名称的实例变量引用到方法中时,这是必需的。

    在其他非强制性的情况下,您可以省略它,因为它是隐式的,并选择您想要的约定。

        8
  •  0
  •   nre    16 年前

    实际上,我有一个讲座,是我的一位教授在任务中给我们提供了下面的Java类:

    public class Person {
        private String name;
        private int age;
    
        public Foo(String __name, int __age) {
            name = __name;
            age = __age;
        }
    
        public String sayHello() {
            return "Hello, my name is " + name + " and I am " + age + " years old";
        }
    }
    

    我提到了 Java Coding Conventions 亲切地问他我是否能重构他的代码。基本上 this 用于编写漂亮的构造器和设置器。当然,对于所有其他情况,我需要将方法参数重命名为 欠下 +参数名或更好 +我经常看到的参数名。