2012-02-09 18 views
0

私はコンピュータサイエンスの学生です。私は昨晩早く宿題を勉強していました。私は冗長だと思った私の本の中の関数につまずいたが、私は、私はこれを見たよう関数のパラメータに定数を渡すことができますか?

public int refundBalance() { 
    int amountToRefund = balance; 
    balance = 0; 
    return amountToRefund; 
} 

を「混同」という得ている詳細な検査をすると、私は店に新しいローカル変数を作成する必要があると考え

refundBalance(balance); 
public int refundBalance(int amount) { 
    balance = 0; 
    return amount; 
} 

しかし、明らかに、私はちょうど「トレーディング・ライン」だ:。むしろ冗長だったので、私はこれを考えたの周りにデータを渡します

質問:は常ににどのような方法は、コールに値を渡すことなく、関数に同じパラメータを渡すありますか?

オプションの質問:この機能をどのように最適化できますか?

おかげで、すべての< 3(さえ可能であれば)(P.S.これは宿題ではない、それだけで基本的な好奇心です。)

+0

私はあなたの質問を理解しているかどうか分かりません。最初の例では 'balance'は' refundBalance() 'が宣言されているクラスのインスタンス変数(つまりフィールド)ですか?あなたの 'refundBalance(int amount)'はどのように使うのですか? 'amount'はそのまま返されるので、' refundBalance() 'を呼び出す唯一の効果は' balance'をゼロに設定することです。また、同じパラメータを渡すことについてのあなたの言葉は不明です:同じ*値*(その場合はハードコーディング)、同じ*変数*(それをカプセル化する必要がある閉鎖のいくつかの種類で)? –

+0

関数に同じパラメータを渡す場合は、関数内で宣言してみませんか? –

+0

@DanielPryden関数のコンテキストは実際問題ではありません。それは基本的にあなたの質問です:バランスを保存してゼロに設定し、完了したら保存された残高を返します。私は同じ_variable_を渡すことを考えていました。私はデフォルトのパラメータについて考えましたが、あなたがメソッドをオーバーロードしない限り、Javaはそれをサポートしません...しかし、私の考えは_variable_バランスとしてデフォルトのパラメータを設定することでした。 – yackyackyack

答えて

1

元のコードは、標準オブジェクト指向の上級クラスです。

公的な方法でしか変更できない状態であるプライベートフィールドbalanceがあり、会計処理が安全であることを保証します。ローカル変数せずに機能を実行するために今すぐ

public int refundBalance() { 
    try { 
     return balance; 
    } finally { 
     balance = 0; 
    } 
} 

この実行する必要がありますバランス

  • 店舗0の

    • プッシュ値をバランス
    • リターン
  • +1

    もちろん、私たちは同僚がこのようなコードをどれだけ愛しているかを知っています。 –

    +0

    私はコードを疑うことはありません。私はばかげた最適化のために言語を "ハックする"方法があるかどうかを確認するのが好きです:) – yackyackyack

    +0

    @yackyackyack:どのような "ばかげた最適化"を望んでいますか?このメソッドの最初のバージョンを最適化する方法はまったくありません。コンパイラとJITは、レジスタに格納できる場合はローカル変数のスタックスロットの割り当てを取り除くことを含め、あらゆる種類の最適化を自由に行うことができます。あなたはそれ以上に速くなることはありません。 –

    0

    デフォルトのパラメータを経由して意味ならば、いいえ。 refundBalanceはパブリックメソッドであり、それを囲むクラスはバランス変数を格納しているので、外部のオブジェクトが払い戻し量を判断できるのは意味がありません。もし必要なら、amountパラメータでrefundAmountメソッドを提供することができますその機能。

    オプションの質問については、その機能を最適化しようとすると無意味だと思います。それはそのままで、パフォーマンスは向上しません。

    +0

    もう一度、誰かがこれに対して何らかの最適化(存在する場合)を思い付くことができるかどうかは、好奇心から外れています。それは問題ではありません、あなたを気にしてください。 "心のゲーム"の詳細。しかし、はい、あなたは答えが良い洞察力を私に提供しました。ありがとうございました。 – yackyackyack

    2

    実際には、バランスを原子的にアクセスし、それをアクセス可能な複数のスレッドから保護したいと思うかもしれません。そのような場合は、を使用してAtomicIntegerを使用してワンショットでこれを行うことができます。

    import java.util.concurrent.atomic.AtomicInteger; 
    
    private final AtomicInteger balance = new AtomicInteger(); 
    
    public int refundBalance() { 
        return balance.getAndSet(0); 
    } 
    

    これは、あなたが上記の持っているように、私はこの方法で​​を使用して、それを書くの上にお勧めしますどのような実際にあります。それはまた、1つの行になる:-)。

    関連する問題