class Money {
// 省略
Money(int amount, Currency currency) {
if (amount < 0) {
throw new IllegalArgumentException("金額には0以上を指定してください。");
}
if (currency == null) {
throw new NullPointerException("通貨単位を指定してください。");
}
this.amount = amount;
this.currency = currency;
}
}
P.33 3.3のリスト3.18
import java.util.Currency;
class Money {
final int amount;
final Currency currency;
Money(final int amount, final Currency currency) {
if (amount < 0) {
throw new IllegalArgumentException("金額には0以上を指定してください。");
}
if (currency == null) {
throw new NullPointerException("通貨単位を指定してください。");
}
this.amount = amount;
this.currency = currency;
}
Money add(final Money other) {
if (!currency.equals(other.currency)) {
throw new IllegalArgumentException("通貨単位が違います。");
}
final int added = amount + other.amount;
return new Money(added, currency);
}
}
P.39 Column 種類の異なる言語と本書のノウハウにおけるRubyのコード(リスト3.19)
class Money
attr_reader :amount, :currency
def initialize(amount, currency)
if amount < 0
raise ArgumentError.new('金額には0以上を指定してください。')
end
if currency.nil? || currency.empty?
raise ArgumentError.new('通貨単位を指定してください。')
end
@amount = amount
@currency = currency
self.freeze # 不変にする
end
def add(other)
if @currency != other.currency
raise ArgumentError.new('通貨単位が違います。')
end
added = @amount + other.amount
Money.new(added, @currency)
end
end
function Money(amount, currency) {
if (amount < 0) {
throw new Error('金額には0以上を指定してください。');
}
if (!currency) {
throw new Error('通貨単位を指定してください。');
}
this.amount = amount;
this.currency = currency;
Object.freeze(this); // 不変にする
}
Money.prototype.add = function(other) {
if (this.currency !== other.currency) {
throw new Error('通貨単位が違います。');
}
const added = this.amount + other.amount;
return new Money(added, this.currency);
}
P.109 6.2.7のリスト6.39,魔法「紫電」の値オブジェクト導入版のコードの一部
本来変数valueを使うべきところが数値になっていました。
誤
return new AttackPower(10);
正
return new AttackPower(value);
下記のコードも参照してください。
class Shiden implements Magic {
private final Member member;
Shiden(final Member member) {
this.member = member;
}
public String name() {
return "紫電";
}
public MagicPoint costMagicPoint() {
final int value = 5 + (int)(member.level * 0.2);
return new MagicPoint(value);
}
public AttackPower attackPower() {
final int value = 50 + (int)(member.agility * 1.5);
return new AttackPower(value);
}
public TechnicalPoint costTechnicalPoint() {
return new TechnicalPoint(5);
}
}
P.172 8.2.4の脚注10番
誤
privateに限らす
正
privateに限らず
P.215-216 10.2.5のリスト10.1
/** サービス利用料 */
class ServiceUsageFee {
final int amount;
/**
* @param amount 料金金額
*/
private ServiceUsageFee(final int amount) {
if (amount < 0) {
throw new IllegalArgumentException("金額には0以上を指定してください。");
}
this.amount = amount;
}
/**
* サービス利用料を確定する。
*
* @param salesPrice 販売価格
* @param salesCommissionRate 販売手数料率
* @return サービス利用料
*/
static ServiceUsageFee determine(final SalesPrice salesPrice, final SalesCommissionRate salesCommissionRate) {
int amount = (int)(salesPrice.amount * salesCommissionRate.value);
return new ServiceUsageFee(amount);
}
}