如何在Java中使用变量?

时间:2013-10-02 08:28:50

标签: java normalization

这个问题起初可能显得愚蠢,但在与不同的人合作之后,我看到每个人似乎都有自己的,不同的知识,所以这是我的问题。

所以现在我想知道最好的方法是什么,以及为什么(“为什么”对我来说更重要):

我想知道编写Java代码的两种方法:

  1. 您是否始终传递Object或是否可以传递原始数据类型?
  2. 您是否在类实例中使用this.namenamegetName()来调用变量?

    public class MyClass {
        private String someStr;
        private int someNumber;
        private Integer someOtherNumber; // int, Integer ? which one to choose ?
    
        public MyClass(String someStr, int someNumber, int someOtherNumber) { // int someNumber ? Integer someNumber ? why ?
            this.someStr = someStr; // Here, it's clearly this.{name} = {name} because of the variable name conflict
            this.someNumber = someNumber;
            this.someOtherNumber = someOtherNumber;
        }
    
        public int someMethod(boolean first) { // Boolean ? boolean ?
            if (first) {
                return someNumber;
            } else {
                return this.someOtherNumber; // this.{name} ? just {name} or even this.get{name}() or get{name}() ? (supposing getters exists)
            }
        }
    }
    
  3. 我希望有人能为我提供一个很好的解释,告诉我使用哪个来编写更好的代码。

7 个答案:

答案 0 :(得分:4)

  

您是否总是传递Object或者您是否可以传递原始数据类型?

您不能传递Object,只能传递对象的引用。您可以传递原始数据。

  

您是否在类实例中使用this.name,name或getName()调用变量?

我不会让它变得比我需要的更复杂,除非它与局部变量冲突或我的getName()做了一些特别的事情,但这是一种风格问题。

答案 1 :(得分:2)

  

您是否总是传递Object或者您是否可以传递原始数据类型?

您可以根据需要将基元或引用传递给对象。

  

你是否在你的内部使用this.name,name或getName()调用变量   类实例?

this用于指代当前对象。如果存在冲突的变量名称并且您想要区分对象变量和局部变量,则使用this

你似乎对原语和Wrapper类感到困惑。包装类提供了实用程序方法,特别适用于集合。

答案 2 :(得分:1)

  

您是否总是传递Object或者您是否可以传递原始数据类型?

public int someMethod(boolean first) { // Boolean ? boolean ?

}

在以下示例中,您可以成功传递booleanBoolean。在Java中,这称为Autoboxing

N.B。请注意,因为传递对象时可能是null

  

你是否在你的内部使用this.name,name或getName()调用变量   类实例?

取决于。如果name是类成员变量,如果当前作用域中没有任何具有相同名称的其他变量,则可以使用name访问它。在这种情况下,您应该使用this.name完全指向类成员变量。也可以使用getName()。这只是风格问题。

答案 3 :(得分:1)

如果你需要使用原始数据类型,那么你应该使用它们,例如int,double,char,float等。唯一的例外是String,它在Java中是一个特殊的类,它代表一个char数组,也是持有实例方法。

Integer与int的情况是,您需要使用Integer方法(http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html)。但是如果你只需要一个数据类型来保存你的值,那么选择int。

答案 4 :(得分:1)

我保持简单。我正在使用name,但如果我有一个同名的局部变量,我必须使用this.name(我的首选解决方案)而不是getName()。 如果它执行验证等逻辑,则必须使用getName()

答案 5 :(得分:1)

这主要是个人风格和原则问题。

  1. private int someOtherNumber;我几乎总是使用int因为对我来说似乎更自然 - 可能会受到C天的影响。而且,从性能和内存使用的角度来看,使用int是一个更好的选择。根据经验,除非我有充分的理由,否则我不会将对象用于基元。
  2. return this.getSomeOtherNumber();我更喜欢使用getter / setter;因为有时 - 并非总是 - getter方法不仅仅是一个简单的return语句,而是封装了一些逻辑。因此,我不会直接访问类属性(例如this.someAttrsomeClass.somePublicAttr),除非它是final属性。相信我,它更安全。
  3. 继续2:看起来有点奇怪但是我有一个强大的Lisp背景,尽量避免使用偶数getter / setter方法(类状态),而是明确传递所需的参数并使用方法'返回值。请考虑以下示例:

    public class C {
      private int a;
      private int b;
    
      public int getA() { return a; }
      public void setA(int a) { this.a = a; }
      public int getB() { return a; }
      public void setB(int b) { this.b = b; }
    
      // Usual style
      public void someMethod1(int x) {
        mainLogic1(x);
      }
    
      private void mainLogic1(int x) {
        b = a + x;
      }
    
      // My preferred style
      public void someMethod2(int x) {
        setB(mainLogic2(x, getA()));
      }
    
      private int mainLogic2(int x, int a) {
        return x + a;
      }
    }
    

    如您所见,someMethod1mainLogic1都有副作用,在查看代码时很难检测到。另一方面,mainLogic2根本没有副作用,someMethod2副作用更容易被看到。这可能看起来有些过分,但它使我的Java代码更具可读性,更易测试,更容易重构,因为它包含大量小方法,没有副作用。

答案 6 :(得分:1)

    Do you always pass Object or can you pass primitive data type ?

这取决于您的应用和您的需求。如果传递对象的引用,则可以使用相关类型的方法,这些方法可能更安全,更便携。假设您正在使用Double类。 Double有许多经过同行评审和测试的方法,可能对你有所帮助。如果你更喜欢使用原始类型,加倍,你需要小心你的操作,如比较,验证等。 对于性能问题,您可以查看以下的讨论: Why do people still use primitive types in Java?

    Do you call variables using this.name, name or getName() inside your class instance ?

当我引用一个类成员时,我更喜欢使用它,因为我认为阅读我的代码会有助于理解该变量是一个类成员。

最后,无论你喜欢哪种风格,我认为你应该在你的应用中坚持下去。

您是否在类实例中使用this.name,name或getName()调用变量?