合并两个相似的数值 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();
}
现在的问题是,任何数字都可以传递给我的继承 类,但我只想分别接受 ints
和 floats
,同时仍将冗余保持在最低限度:
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
方法,如果你习惯使用它们,你可以直接使用它们。
理想情况下,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()
我有两个 类,它们几乎为两种不同的数字类型实现了相同的操作(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();
}
现在的问题是,任何数字都可以传递给我的继承 类,但我只想分别接受 ints
和 floats
,同时仍将冗余保持在最低限度:
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
方法,如果你习惯使用它们,你可以直接使用它们。
理想情况下,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()