2017-09-04 4 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()のように/ * missing code * /を置き換えるために以下のどれを使うことができますか?

私はそれを絞り込むました:誰かが私にこのことは、これらの1つ(または複数)を教えてもらえ

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();」のように4番目または5番目の方法でチャックするだけです。 –

答えて

1

私が意図したとおり、最後の1がうまくいくと思う:

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

他の人も同様です。 – Andreas

+0

はい、すべての方法が正しく動作しています;) – Dayana

2

3つの方法があるため、corretです:

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

1行目:(r.num * NUM(インスタンス変数)を割り当てrのインスタンス変数)はnumになります。 numまたはdenでもプライベートアクセスがある場合は、同じクラスを内部で処理すると、プライベートメンバーにアクセスできるようになります。

行2:den(インスタンス変数)* r.den(インスタンス変数r)の結果をdenに割り当てます。このコードで

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

、あなたはexplicetely NUMとdenは、クラスのインスタンス変数であることを言ってthisキーワードを使用しています。この場合は、シャドウイングをしていないので(ローカル変数がインスタンス変数の名前をシャドーするとき)、必要ではありません。ロジックは上記と同じです。

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

'this.num'または' this.den'が現在のオブジェクトの変数を呼んでいる間に、メソッド呼び出し側が渡したパラメータでgettersを呼び出すので、私は言うでしょう。私は形式について話しています。 – leodali

2

は、それらのすべては、機能的に同等です。

ローカル変数またはパラメータの代わりにインスタンス変数を参照する必要がある場合にのみ、thisが必要です。あなたのコンストラクタはnumden paramsという名前を持っていた場合、あなたはインスタンス変数numへのparam numを割り当てることを指定する

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

を記述する必要があります。

しかし、メソッドにあいまいさがないので、それらはすべて動作します。変数r.numr.denに直接アクセスすることもできます。これは、非公開であっても、同一のクラスにアクセスできるためです。

私は要するに

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

彼らは機能的には同等ではありません。サブクラスのgetterをオーバーライドして、何か違うことをすることができます.3番目は1番目と2番目のものとは違うでしょう。あなたがクラスを最終的にした場合、彼らは同じになります。 –

5

としてそれを記述します。すべての3つの作業をする必要があり、最後の変種との唯一の違いがある:あなたのクラスは、サブクラスがgetNumとgetDenの動作を変更することを可能にする最後のではありません。

また、Numberを表すクラスを作成して変更可能であることはまれです。多分それは、現在の1の内部状態を変更するのではなく、乗算の結果と新しいRationalNumberを返し

public RationalNumber multiply(RationalNumber) 

するmultiplyの署名を変更する方が良いでしょう。その場合、実装は

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

(またはあなたが提供してきた他の変異体)になり

1

実際には、反対意見があります。この変数が属する誰確認するために、常にクラスの変数にthisを使用しますに。または、別のもの:ローカル変数とクラス変数の間に矛盾がある場合は、1つを使用します。

私の仕事では、私は第二のものを使用しています:私がする必要がある場合にのみthisを使用してください。できるだけコード内の単語が少ないほど、問題は少なくなります。

この例では、任意のバリアントを使用できます。

0

Lotharの答えに従えば、multiplyメソッドが新しいRationalNumberのすべてを返す方が良いでしょう。

私は、クラスを静的にすることさえしたいと思っています。それは、それを変更するクラスの1つのアイシャントと対話する何かの代わりに、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 - )は 'static'でなければなりませんか?つまり、 'bd1.multiply(bd2)'の代わりに 'BigDecimal.multiply(bd1、bd2)'を書く必要があります。 – Andreas

+0

それは良い点であり、使用するのが不便であることを認めなければならない間に、スレッド安全性のような大きな目的のために行われるかもしれないと感じています –

+0

メソッドを静的にするとスレッドの安全性は向上しますか?オブジェクトを* immutable *にすることは、[Lotharが提案](https://stackoverflow.com/a/46043585/5221149)のように行います。それを静的にすることは機能的な違いにはなりません。単に使用するのが面倒です。 – Andreas

関連する問題