2013-10-02 28 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設置它們:)感謝您的回覆! –