无法解析符号,抽象类工厂

时间:2014-01-03 03:43:22

标签: java

我是Java的新手,我正在跟随测试驱动开发实例。在第8章中,我们将法郎和美元的子类严格划分为Money。我已经创建了法郎和美元的工厂方法,但是当我尝试运行测试时,我得到“无法解析符号美元”(或法郎)的测试行:

Money five= new Money.dollar(5);
Money four= new Money.franc(5);

我已经从头开始两次尝试谷歌搜索,但我不确定我错过了什么。

金钱类:

public abstract class Money {

    abstract Money times(int multiplier);

    protected int amount;

    static Money dollar(int amount){
        return new Dollar(amount);
    }

    static Money franc(int amount){
        return new Franc(amount);
    }

    public boolean equals(Object object){
        Money money = (Money) object;
        return amount == money.amount
        && getClass().equals(money.getClass());
    }

}

法郎(美元是一样的):

public class Franc extends Money {


    Franc(int amount){
        this.amount = amount;
    }

    Money times(int multiplier){
        return new Franc(amount * multiplier);
    }

}

测试:

import org.junit.Test;

import static org.junit.Assert.*;

public class MoneyTest {
    @org.junit.Test
    public void testMultplication(){
        Money five= new Money.dollar(5);
        assertEquals(new Dollar(10), five.times(2));
        assertEquals(new Dollar(15), five.times(3));
        Money four= new Money.franc(5);
        assertEquals(new Franc(10), four.times(2));
        assertEquals(new Franc(15), four.times(3));
    }

}

2 个答案:

答案 0 :(得分:3)

Money five= new Money.dollar(5);

语法错误。将其更改为:

Money five= Money.dollar(5);

因为new关键字用于创建实例,但您想要调用静态方法。此外,无法实例化抽象类。

答案 1 :(得分:1)

你正在使用工厂模式;您根本不需要使用new关键字。

相反,请使用工厂:

Money five= Money.dollar(5);
Money four= Money.franc(5);

我也鼓励对你的对象有特殊性;一个是Dollar,另一个是Franc;你应该使用那些实例而不是更抽象的Money。如果您的子类明显不同(例如,如果Franc有一个方法来指示它被接受的国家/地区),那么这样做不会对您产生影响。