簡體   English   中英

Java-如何將對象作為參數傳遞給該對象類的構造函數

[英]Java - How do you pass an object as an argument into a constructor from that objects class

我有一個充當下注者的類,在該類中,下注者可以將下注放入創建下注的方法中。 但是,下注類的構造函數需要從下注類中獲取該下注者的相同引用。 如何做到這一點?

這是我試圖用於此的代碼。 我意識到可以重新引用下注者類別,但我想還是應該嘗試一下

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類看起來像這樣(它是Bet類的子類,其中包含Bettor參考和下注金額)。

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

我將如何將原始Bettor作為參數傳遞給我的PassBet子類,然后將其存儲在超類Bet中?

你可以通過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似乎是枚舉的一個很好的候選者,在這種情況下,您可以使用switch代替else if等。這是一個粗糙的示例:

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);
}

這甚至可能不是最佳解決方案,但我希望它至少為您提供了一些可能性。

只需this關鍵字作為下注者實例即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM