【问题标题】:Java convention on reference to methods and variables关于引用方法和变量的 Java 约定
【发布时间】:2012-08-29 09:17:48
【问题描述】:

Java 约定的第 10.2 节建议使用类名而不是对象来使用静态变量或方法,即 MyClass.variable1MyClass.methodName1() 而不是

MyClass Obj1 = new MyClass();    
Obj1.variable1;
Obj1.methodName1();

没有解释这背后的基本原理,尽管我怀疑这与内存使用有关。如果有人可以解释这一点,那就太好了。

【问题讨论】:

  • 如果方法是静态的,则从类本身调用它——这样就不会那么混乱了。例如BigInteger.ONE.valueOf("10") 对它的实际操作感到困惑。

标签: java object coding-style naming-conventions


【解决方案1】:

我猜你的意思是“用于静态方法和变量”。

在内存方面没有区别,当然除非您创建实例只是为了调用该方法。约定不是为了内存效率,而是为了编码器效率,这与代码的可读性直接相关。

理由是通过阅读

MyClass.methodName1()

您知道这是一个静态方法,它不能使用或更改您的 Obj1 实例。

如果你写了

obj1.variable1; // note the "o" instead of "O", please do follow conventions

那么读者必须阅读您的源代码才能知道 variable1 是否是静态的。

【讨论】:

  • 关于它为什么会令人困惑的有趣帖子:stackoverflow.com/a/1439847/829571
  • @assylias 有趣的例子,是的。
  • @dystroy:谢谢,所以主要的想法是立即知道变量或方法是否是静态的。
【解决方案2】:

如果您使用对象进行静态变量访问,那么编译器将仅将其替换为 Class Name

所以

MyClass Obj1 = new MyClass();    
Obj1.variable1;
Obj1.methodName1();

同理

MyClass.variable1;
MyClass.methodName1();

Now Why to differentiate? Answer is - It is for better reading If someone see method being called on Class then he immediately come to know that it is static method. Also it prevents generation of one additional object to access the method.

【讨论】:

【解决方案3】:

这与public static 方法和变量有关。由于这些方法/变量与相应的类而不是类的实例相关联,因此最好将这些方法或变量称为className.methodName()className.variableName

"Understanding Instance and Class Members" 是学习使用 static 关键字创建属于类而不是类实例的字段和方法的一个很好的起点

【讨论】:

    【解决方案4】:

    只是因为,公共静态方法或公共静态变量不与任何对象相关联,而是与类相关联。尽管语言设计者提供了在对象上调用它们的灵活性,但代码的读者会混淆它们是静态变量/方法还是实例方法/变量。所以可读性是要求开发人员在类上调用它们的原因。

    【讨论】:

      【解决方案5】:

      您可以使用类名表示法或使用对象访问静态成员。不建议使用对象表示法,因为它可能会非常混乱。

      public class TheClass {
          public static final staticValue = 10;
          public static void staticMethod() {
              System.out.println("Hello from static method");
          }
      
          public static void main(String ... args) {
              TheClass obj = null;
      
              // This is valid
              System.out.println(obj.staticValue);
              // And this too
              System.out.println(obj.staticMethod());
      
              // And this is also valid
              System.out.println(((TheClass)null).staticValue);
              // And this too
              System.out.println(((TheClass)null).staticMethod());
      
          }
      }
      

      如果使用类名表示法调用静态方法和变量会更清楚。

      【讨论】:

        【解决方案6】:

        静态变量属于类而不属于对象(实例)。 静态变量可以通过类名直接访问,不需要任何对象。 它节省了空间,不必为每个类的相同数据设置变量。

        Syntax : <class-name>.<variable-name>
        
        public class AA{
        
         static int a =10;
        
        
        }
        

        您可以拨打电话

        System.out.println(AA.a);
        System.out.println(aObject.a);
        

        两次调用没有区别,但保持编码约定以保持更多可读性

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多