长整数通用算法

2w2cym1i  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(315)

我的想法表明,我有两个类的通用代码,我应该把它作为一个干规则(不要重复你自己)。

class LongPersistence {
    public void storeSomeNiceNumber(@NotNull Long l) {
            if (l < 0) {
                throw new RuntimeException("value should not be negative");
            }
            someNicePersistence.store(new String(l).getBytes());
        }
    }

    public Long retrieveSomeNiceNumber() {
        try {
            byte[] bytesRepr someNicePersistence.retrieve();
            Long value = Long.parseLong(new String(bytesRepr));
            return value;
        } catch (SomeNicePersistenceException e) {
            return 0L;
        }
    }
}

所以我开始工作。。。

class Persistence<N extends Number> {

... 失败原因:
数字不能与0比较。
我不能将0返回到数字。
我认为这在定义良好的语言中应该是可能的,就像我到目前为止一直在考虑的java一样。我错过什么了吗?请建议如何使此算法对long和integer通用(并将其作为任意数字的a+任务)

hvvq6cgz

hvvq6cgz1#

多亏了@vgr,我明白我需要java.lang.number类中的数学逻辑,该类仅用于将数字存储为对象(类似于变量类型),因此我将数学外部化到另一个接口,在我看来这更有意义。

public interface NumberMath<E extends Number> {
    E parse(String string);
    String toString(E e);
    E zero();
    int signum(E e);
}

class NumberPersistence<E extends Number> {

    private final NumberMath<E> math;
    private final SomeNicePersistence someNicePersistence;

    public NumberPersistence(NumberMath<E> math, SomeNicePersistence persistence) {
        this.someNicePersistence = persistence;
        this.math = math;
    }

    public void storeSomeNiceNumber(E l) {

        if (math.signum(l) < 0) {
            throw new RuntimeException("value should not be negative");
        }
        someNicePersistence.store(math.toString(l).getBytes());

    }

    public E retrieveSomeNiceNumber() {

        try {
            byte[] bytesRepr = someNicePersistence.retrieve();
            E value = math.parse(new String(bytesRepr));
            return value;
        } catch (SomeNicePersistenceException e) {
            return math.zero();
        }
    }
}

我已经将e限定为数字,但老实说,在这种情况下,不再需要它了。

相关问题