2013-04-03 36 views
0

我有一個充當投注者的類,在那個類中,投注者可以在創建投注的方法中下注。然而,投注類的構造者需要從投注者類中獲取與該投注者相同的參考。人們如何去做這件事?Java - 你如何將一個對象作爲參數傳遞給構造函數中的對象類

這是我正在嘗試使用的代碼。我認識到,使投注者類的一個新的參考,但我想我會試試看,反正

public Bet placeBet(Bet.BetType betType, double amount) 
{ 
    if(betType.equals(Bet.BetType.passBet)) 
    { 
     this.bankroll=bankroll-amount; 
     return new PassBet(new Bettor(this.name,this.bankroll),amount); 
    } 
    else if(betType.equals(Bet.BetType.any7)) 
    { 
     this.bankroll=bankroll-amount; 
     return new Any7Bet(new Bettor(this.name,this.bankroll),amount); 
    } 
    else if(betType.equals(Bet.BetType.hard8)||betType.equals(Bet.BetType.hard10)) 
    { 
     this.bankroll=bankroll-amount; 
     return new HardWayBet(new Bettor(this.name,this.bankroll),amount); 
    } 
    return null; 
} 

而PassBet類看起來就像這樣(這是賭注類的子類,它持有Bettor參考和賭注金額)。

public PassBet(Bettor b, double amount) 
{ 
    super(b,amount); 
} 

我會如何傳入原始投注者作爲參數到我PassBet子類,然後將其存儲在超打賭嗎?

+0

您提問並非100%清楚。根據您的代碼,您必須知道'this'指向當前實例,因爲您正在使用它來訪問字段。你也可以簡單地將'this'傳遞給另一個方法/構造函數,就像任何其他引用一樣 - 是否可以回答這個問題? –

+0

@PaulBellora在構造函數中傳遞* this *實在是個不錯的主意。看看[這裏](http://stackoverflow.com/questions/2419410/passing-this-in-java-constructor)和[這裏](http://www.ibm.com/developerworks/java/library/j -jtp0618/index.html中)。 – Jayamohan

+0

@Jayamohan是的,我意識到這一點 - 但如果我理解正確的話,它會從'placeBet'傳遞。我只是想澄清問題,否則這將是一個答案。 –

回答

1

只是通過this關鍵字作爲bettor實例。

+0

在構造函數中傳遞* this *實際上是一個壞主意。看看[這裏](http://stackoverflow.com/questions/2419410/passing-this-in-java-constructor)和[這裏](http://www.ibm.com/developerworks/java/library/j -jtp0618/index.html中)。 – Jayamohan

+0

@Jayamohan從設計的角度來看,這是真的,但是這回答了他的問題。 –

+0

@Jayamohan我想知道你是否真的閱讀並理解了你提供的鏈接? placeBet()不是Bettor的構造函數,並且我們沒有將「this」傳遞給Bettor的構造函數中的其他方法/構造函數。 –

2

您可以將this傳遞給其他方法/構造函數,如其他任何引用。例如:

public Bet placeBet(Bet.BetType betType, double amount) 
{ 
    if(betType.equals(Bet.BetType.passBet)) 
    { 
     this.bankroll=bankroll-amount; 
     return new PassBet(this,amount); 
    } 
    else if(betType.equals(Bet.BetType.any7)) 
    { 
     this.bankroll=bankroll-amount; 
     return new Any7Bet(this,amount); 
    } 
    else if(betType.equals(Bet.BetType.hard8)||betType.equals(Bet.BetType.hard10)) 
    { 
     this.bankroll=bankroll-amount; 
     return new HardWayBet(this,amount); 
    } 
    return null; 
} 

順便說一句,我建議你不要返回null當沒有條件匹配的。例如,考慮投擲IllegalArgumentException。像rcook指出,BetType似乎是一個很好的候選人的enum,在這種情況下,你可以,如果使用switch,而不是別的,等這裏有一個粗略的例子:

public enum BetType { 
    PASS, 
    ANY_7, 
    HARD_8, 
    HARD_10; 
} 

... 

public Bet placeBet(BetType betType, double amount) { 

    final Bet bet; 

    switch (betType) { 
     case PASS: 
      bet = new PassBet(this, amount); 
      break; 
     case ANY_7: 
      bet = new Any7Bet(this, amount); 
      break; 
     case HARD_8: 
     case HARD_10: 
      bet = new HardWayBet(this, amount); 
      break; 
     default: 
      throw new IllegalArgumentException("Invalid bet type: " + betType + "."); 
    } 

    this.bankroll -= amount; 

    return bet; 
} 

該解決方案仍可能更對象 - 例如,爲什麼不給BetType一種創建Bet的方法?我們可以利用多態:

public enum BetType { 
    PASS { 
     @Override 
     public Bet makeBet(Bettor bettor, double amount) { 
      return new PassBet(bettor, amount); 
     } 
    }, 
    ANY_7 { 
     @Override 
     public Bet makeBet(Bettor bettor, double amount) { 
      return new Any7Bet(bettor, amount); 
     } 
    }, 
    HARD_8 { 
     @Override 
     public Bet makeBet(Bettor bettor, double amount) { 
      return new HardWayBet(bettor, amount); 
     } 
    }, 
    HARD_10 { 
     @Override 
     public Bet makeBet(Bettor bettor, double amount) { 
      return new HardWayBet(bettor, amount); 
     } 
    }; 

    public abstract Bet makeBet(Bettor bettor, double amount); 
} 

... 

public Bet placeBet(BetType betType, double amount) { 

    this.bankroll -= amount; 

    return betType.makeBet(this, amount); 
} 

這甚至可能不是最好的解決辦法,但我希望它至少開闢了一些可能性爲您服務。

相關問題