2013-10-02 27 views
1

这个问题起初看起来很愚蠢,但是在与不同的人合作后,我发现每个人似乎都有自己的不同的知识,所以这是我的问题。如何在Java中使用变量?

所以现在我想知道什么是做到这一点的最好办法,为什么(为什么对我来说更重要):

我想了解一下两种方法来编写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) 
         } 
        } 
    } 
    

我希望我清楚这件事,我希望有人会为我提供哪些为了让我写出更好的代码(也许帮助别人也用的很好的解释!:) )

感谢您的帮助。

+0

问题的主题很不清楚。它不应该是“如何在Java中传递变量”?另外,我敢说这是一个普遍而广泛的问题。如果您单独搜索这些内容,您可以轻松找到答案。 – Dariusz

+0

我用Google搜索了一下,没有发现任何有用的东西,因此这个问题。这个话题可能不清楚,但这是因为我不清楚如何处理这些问题(再次,因此这个问题)。 –

回答

4

你总是传递Object还是可以传递原始数据类型?

您无法传递对象,只能引用对象。你可以传递原始数据。

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

我不使问题更加复杂,比我需要的,除非它是冲突与局部变量或我getName()做一些特别的东西,但是这是一个风格问题。

+0

你的方法签名是什么原因是......(Integer someVar)'而不是'...(int someVar)'?一个特定的或没有理由? –

+0

@CyrilN。有些人使用'Integer'而不是'int',因为a)它可以是'null',b)使用原语是开发人员并不担心的一个复杂因素。我倾向于尽可能避免使用包装,甚至使用原始的集合,例如要明确指出'null'不是一种选择,有时是因为速度更快。 –

+0

好吧,没有“你必须这样做”,但更多的是“每个人都写代码不同”,对吧? –

1

你总是传递Object还是可以传递原始数据类型?

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

} 

在下面的例子中,你可以通过booleanBoolean用同样的成功。在Java中,这称为Autoboxing

N.B.要小心,因为当传递一个对象时,它可能是null

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

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

+0

主题“autoboxing”:小心'null' ...你应该知道,你在做什么! – Fildor

+0

谢谢你,你是对的!我会更新我的答案。 –

2

你总是传递对象,或者您可以通过原始数据类型?

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

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

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

而且你似乎混淆了原语和包装类。包装类提供了实用程序方法,特别适用于集合。

1

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

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

+0

字符串是什么的例外?这只是一个类,尽管是一个不可改变的类。字符串经过特殊处理的唯一方法是在Java 7的'case'中。 – Dariusz

1

我保持简单。我正在使用name,但是如果我有一个具有相同名称的本地变量,我必须使用this.name(我的首选解决方案),而不是getName()getName()必须使用,如果它做一些像验证一样的逻辑。

+0

它很清晰,精确,我喜欢:)而方法签名呢? –

1

它主要的个人风格和原则问题。

  1. private int someOtherNumber;我几乎总是使用int,因为它似乎更自然 --perhaps由C天的影响。而且,从性能和内存使用角度来看,使用int是更好的选择。作为一个经验法则,除非我有充分的理由,否则我不会将对象用于基元。
  2. return this.getSomeOtherNumber();我更喜欢使用getter/setter方法;因为有时候并不总是 - getter方法不仅仅是一个简单的return语句,而是它封装了一些逻辑。因此,我不直接访问类属性(如this.someAttrsomeClass.somePublicAttr),除非它是final属性。相信我,这更安全。

持续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代码更具可读性,更易于测试,并且更容易重构,因为它由大量小方法组成,没有副作用。

+0

感谢您的回复,这非常有趣。和你喜欢的风格的例子是帮助我做出我的决定:) –

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()调用变量?

+0

我通常尝试通过getter调用它们并通过setter设置它们:)感谢您的回复! –