合并两个相似的数值 Class 实现

Combine Two Similar Numeric Class Implementations

我有两个 类,它们几乎为两种不同的数字类型实现了相同的操作(getHexadecimalValue() 方法除外):

public class IntegerType
{
    private int value;

    public IntegerType()
    {
        value = 0;
    }

    public void setValue(int value)
    {
        this.value = value;
    }

    public int getValue()
    {
        return value;
    }

    public String getHexadecimalValue()
    {
        int integerValue = (int) getValue();

        String hexadecimal = ValueConversions.toHexadecimal(integerValue);

        return hexadecimal;
    }
}

public class FloatingPointType
{
    private float value;

    public FloatingPointType()
    {
        value = 0;
    }

    public void setValue(float value)
    {
        this.value = value;
    }

    public float getValue()
    {
        return value;
    }

    public String getHexadecimalValue()
    {
        float floatingValue = (float) getValue();

        int intBits = Float.floatToRawIntBits(floatingValue);

        return ValueConversions.toHexadecimal(intBits);
    }
}

我想知道减少这种冗余的最佳方法是什么,例如像这样定义一个名为 NumberType 的超类:

public abstract class NumberType
{
    protected Number value;

    public NumberType()
    {
        setValue(0);
    }

    public void setValue(Number value)
    {
        this.value = value;
    }

    public Number getValue()
    {
        return value;
    }

    public abstract String getHexadecimalValue();
}

现在的问题是,任何数字都可以传递给我的继承 类,但我只想分别接受 intsfloats,同时仍将冗余保持在最低限度:

public class IntegerType extends NumberType
{
    @Override
    public String getHexadecimalValue()
    {
        // Crashes on runtime if the value doesn't happen to be of the expected type
        int integerValue = (int) getValue();

        String hexadecimal = ValueConversions.toHexadecimal(integerValue);

        return hexadecimal;
    }
}

这是否可以通过仍然保持适当的类型检查来完成?

这可以通过重载来完成

例如:

public abstract class NumberType
{
    private Number value;

    public NumberType()
    {
        setValue(0);
    }

    public void setValue(float value)
    {
        this.value = value;
    }

    public void setValue(int value)
    {
        this.value = value;
    }

    public Number getValue()
    {
        return value;
    }

    public abstract String getHexadecimalValue();
}

您还可以添加:

public int getIntValue()
{
        return value.intValue();
}

public float getFloatValue()
{
        return value.floatValue();
}

你可以这样试试

public abstract class NumberType<T extends Number> {
    protected T value;

    public NumberType(T value) {
        this.value = value;
    }

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    public abstract String getHexadecimalValue();
}

public class FloatingPointType extends NumberType<Float> {
    public FloatingPointType() {
        super(0f);
    }

    public String getHexadecimalValue() {
        return ValueConversions.toHexadecimal(Float.floatToRawIntBits(value));
    }
}

注意:Float和Integer,class都有静态的toHexString方法,如果你习惯使用它们,你可以直接使用它们。

  1. public static String toHexString(float f)
  2. public static String toHexString(int i)

理想情况下,setValue(Number value) 不得允许在 FloatingPointType 中输入任何值但 float 并且 setValue(Number value) 不得允许在 IntegerType 中输入任何值但 int。您可以使用 class Number 中的 intValue() 和 floatValue() 方法进行检查,如果输入的值不合适则抛出异常。 Number class methods

在 IntegerType 的 setValue(Number value) 中会是这样的

if(value.intValue()!= value) throw new IllegalArgumentException()