2017-09-04 16 views
1

我這裏有這樣的代碼,我試圖使用方法:何時應該在方法中使用它?

public class RationalNumber() { 
    private int num; 
    private int den; 

    public RationalNumber(int n, int d) { 
     num = n; 
     den = d; 
    } 

    public void multiply(RationalNumber r) { 
     /* missing code */ 
    } 

    public int getNum() { 
     return num; 
    } 

    public int getDen() { 
     return den; 
    } 
} 

在公共無效乘法方法,我需要的方法乘以r的分子乘以有理數的分子,並在此分母RationalNumber由r的分母組成。以下哪項可用於替換/ *缺少代碼* /以便multiply()。

我已經將範圍縮小到:

num = num * r.num; 
den = den * r.den; 

this.num = this.num * r.num; 
this.den = this.den * r.den; 

num = num * r.getNum(); 
den = den * r.getDen(); 

有人能告訴我這些哪一個(或多個)會讓方法按預期工作?

+1

爲什麼不嘗試一下,看看? – OldProgrammer

+1

只是以第四種/第五種方式查找:'num * = r.num;'或'num * = r.getNum();'。 –

回答

1

我覺得最後一個將工作打算:

num = num * r.getNum(); 
den = den * r.getDen(); 
+2

其他人也是如此。 – Andreas

+0

是的,你是對的所有的方法工作;) – Dayana

2

的三種方式是corret,因爲:

1. num = num * r.num; 
2. den = den * r.den; 

1行:指定NUM(實例變量)* r.num( r)的實例變量結果爲num。即使numden有私人訪問權限,當您處理其內部的同一類時,您可以訪問私有成員。

第2行:將den(實例變量)* r.den(r的實例變量)結果賦值給den。

this.num = this.num * r.num; 
this.den = this.den * r.den; 

在此代碼,您使用的是this關鍵字explicetely說,NUM和DEN是類的實例變量。在這種情況下,這是沒有必要的,因爲你沒有陰影(當一個局部變量隱藏實例變量的名字時)。邏輯與上面相同。

num = num * r.getNum(); 
den = den * r.getDen(); 

您只是使用訪問方法(get)來獲取私有字段的值。邏輯繼續相同。正如我已經說過的那樣,因爲當前對象可以訪問同一類的對象的私有成員,所以它將是不必要的。

我會用第一種方式在這種情況下,)

0

試試這個,我認爲這是最正確的正式:

this.num = this.num * r.getNum(); 
this.den = this.den * r.getDen(); 
+0

它不是比任何其他更正確。如果你真的認爲是這樣,請解釋原因。 – Andreas

+0

我會說,因爲你調用方法調用者傳遞的參數上的getters,而'this.num'或'this.den'說明你正在爲當前對象調用變量。注意我正在談論形式化。 – leodali

2

所有這些在功能上等同。

只有當您需要確保引用實例變量而不是局部變量或參數時,您才需要this。如果你的構造已經PARAMS命名爲numden,你需要寫

this.num = num; 
this.den = den; 

指定要帕拉姆num分配給實例變量num

但是由於方法中沒有歧義,它們都可以工作。您也可以直接訪問變量r.numr.den,因爲即使它們是私有的,它們仍然可以訪問相同的,而不僅僅是相同的實例。

我會把它寫成

num *= r.num; 
den *= r.den; 
+0

它們在功能上並不完全等價:您可以重寫子類中的getter以完成不同的操作:然後第三個將與第一個和第二個不同。如果你最終決定了課程,他們會是一樣的。 –

5

簡而言之:這三個應該工作,沒有與上次變種只有一個區別是:你的類不是最終允許子類改變getNum和getDen的行爲。

另外,創建表示數字的類是可變的是非常罕見的。也許是更好的改變multiply簽名是

public RationalNumber multiply(RationalNumber) 

,與相乘的結果返回一個新RationalNumber,而不是改變當前的內部狀態。在這種情況下,實施將

return new RationalNumber(num * r.num, den * r.num); 

(或您所提供的任何其他變體)

1

其實,有相反的意見:使用this類變量始終,以確保誰該變量屬於至。或者另一種:如果局部變量和類變量之間存在衝突,則使用一個。

在我的工作中,我使用第二個:只有在必須時才使用this。儘可能減少代碼中的單詞,減少問題。

所以在你的例子中,你可以使用任何變種。

0

繼Lothar的回答之後,如果multiply方法返回一個新的RationalNumber數,那將會更好。

我甚至會讓該方法對類是靜態的,因爲它只是一個在RationalNumber之間的常用操作,而不是與修改它的類的單個交互操作的東西。

通過這種方式,你會說它是這樣的:那麼

RationalNumber mul = RationalNumber.multiply(rn1,rn2); 

方法的定義是:

public static RationalNumber multiply(RationalNumber rn1, RationalNumber rn2){ 
    return new RationalNumber(rn1.getNum() * rn2.getNum(), rn1.getDen() * rn2.getDen()); 
} 
+0

所以你也認爲['BigDecimal.multiply(BigDecimal multiplicand)'](https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#multiply-java.math.BigDecimal - )應該是'靜態'?這隻會使它更加麻煩,即不用'bd1.multiply(bd2)',你必須編寫'BigDecimal.multiply(bd1,bd2)'。 – Andreas

+0

這是一個很好的觀點,雖然我不得不承認使用起來不方便,但我覺得可能會有更大的原因,比如線程安全 –

+0

如何使靜態方法提高線程安全性?使對象*不可變*,就像[Lothar建議](https://stackoverflow.com/a/46043585/5221149)那樣。使它成爲「靜態」不會造成功能上的差異,只會使其使用起來很麻煩。 – Andreas

相關問題