2012-01-02 17 views
0

与えられたクラスのブール値を変更する方法が問題になっています。再び発生すると最後に値が設定されます。ブール値を格納する

public void purchase(Sandwich s) { 
    boolean owned = s.owned; 

    //I tried also with accessor and mutator here but then changed to public 
    String type = s.getType(); 
    if (owned == false) { 
     if (money <= 0){ 
      System.out.println("Worker " + this.name + " can not buy " + type + " sandwich, cuz he doesn't have enough money"); 
     } else { 
      System.out.println("Worker " + this.name + " can buy " + type + " sandwich"); 
      this.money = money; 
      owned = true; 

      //this is the place where it is supposed to change value to true (sandwich was bought and has owner now 
      s.owned = owned; 
     } 
    } else if (owned == true) { 
     System.out.println("Worker " + this.name + " can not buy " + type + " sandwich cuz it was bought"); 
     System.out.println("Test"); 
    } 
} 

問題は、与えられたサンドイッチが過去に購入したものの、その所有値は毎回falseに設定されていることである:これは私のクラス

public class Sandwich { 
    private String type; 
    private double price; 
    private String ing; 
    public boolean owned; 

    Sandwich (String t, double p, boolean o){ 
     type = t; 
     price = p; 
     owned = o; 
    } 

    public boolean getO(){ 
     return this.owned; 
    } 

    public void setO(boolean o){ 
     this.owned = o; 
    } 

    public String getType(){ 
     return this.type; 
    } 
} 

、それがアクセスして変更することになっている場所であります私はこのコードを実行しようとします。私はサンドイッチのために所有の変更された値を記録する必要がありますので、次回には所有する状態を実行する== true。方法

+1

アプリケーションの実行の間にそれを維持する必要がありますか?または、アプリケーションが実行されているとき? – Joe

+1

'(所有)'と '(所有している)'を使用してください。この場合、 '!owned'テストの反対のことは重複しています、'!owned'ではなく、 。 –

+1

あなたはどんな問題を抱えていても、それは 'Sandwitch'クラスのブール値とは何の関係もありません。あなた自身の機能をテストする場合は、それを設定し、正しく読むことがわかります。投稿していないコードで何かしているのですが、所有しているのは「false」に設定されています –

答えて

3

に置き換えることができます。ワーカーとサンドイッチタイプの間に関係を作成する必要があります。

あなたができることは、購入したサンドイッチタイプのリストをワーカークラスに実装し、ワーカーがサンドイッチを購入するたびにそれを比較することです。

または、必要に応じて、タイプが既に購入されているかどうかを示すブール値を持つすべてのサンドイッチタイプのハッシュマップを持つことができます。

+0

コードを実行するたびに、新しいサンドイッチのインスタンスが作成されます。それは同じ目的ではありません。 – ryandlf

+0

コードを変更して同じオブジェクトにするにはどうすればいいですか? – aretai

+0

このリストは購入クラスまたはコード内の他の場所に作成する必要がありますか?ありがとうございました – aretai

2

getルーチンとsetルーチンを作成し、使用しませんでした。私はこのコードを変更します。

public void purchase(Sandwich s){ 
      String type = s.getType(); 
      if (!(s.getO())){ 
       if (money <= 0){ 
        System.out.println("Worker " + this.name + " can not buy " + type + " sandwich, cuz he doesn't have eno 

ugh money"); 
       } else { 
        System.out.println("Worker " + this.name + " can buy " + type + " sandwich"); 
        this.money = money; 
        s.setO(true); 
       } 
      } else { 
       System.out.println("Worker " + this.name + " can not buy " + type + " sandwich cuz it was bought"); 
       System.out.println("Test"); 
      } 
    } 
+0

それは間違いありませんが、それは事を変更しません。問題は、クラスまたはその 'owned'フィールドではありません。 –

+0

@Brian Roach - 第2の考えでは、あなたは正しいだろう。問題はどこかにある。森の木々〜! –

+0

私はsetter/getterを使用し、フィールド自体をプライベートにすることをお勧めします。とにかく公にされているフィールドのためのプレーンなセッターとゲッターを持っているのはなぜですか?私から+1: – Thomas

1

だけ

boolean owned = s.owned; 

削除して、あなたが使用しているs.getO()を使用owned

例えば

if (owned == false){ 

if (!s.getO()){ 

ことそして、それを変更するためにsetterメソッドs.setO(true/false)を使用することができます。

owned = true; 
s.owned = owned; 

は、デザインに欠陥があるように思わ

s.setO(true); 
+0

それは間違いありませんが、それは事を変更しません。問題は、クラスまたはその 'owned'フィールドではありません。 –

+0

修正。私は単にゲッターとセッターで別のバージョンを試してみましたが、うまくいきませんでした。 – aretai

+0

それに応じてあなたの投稿を更新してください。 –

関連する問題