制作许多通用对象的最佳方法

时间:2013-03-24 16:44:47

标签: java oop class

背景

对于课程,我制作了一个线性链接哈希表。它存储一组链表,每当调用get或put时,键都会被数组大小进行散列和模数化。然后在结果链表上调用get或put(我也实现了)。

我有一个ST(符号表)界面。它与Map非常相似,但Map所需的一些操作对我来说太难以实现了。实现此接口我实现了链表,红黑树,线性探测哈希表和线性链接哈希表。

我想做一个类似于线性链接哈希表的东西,它接受一个任意的委托符号表类型。例如,使用红黑树类型初始化它会生成一个红黑树表,而get和put函数将委托给那些红黑树。

我认识到我的实现几乎肯定比库提供的实现慢,而且我最好在实际代码中使用它们。我只是想尝试和学习。

问题

向哈希表提供类型的最佳方法是什么,以便哈希表由该类型的表组成,并且调用将委托给那些符号表?

我不能使用泛型,因为我无法初始化那些,我需要初始化构造和重新调整大小。

我考虑过提供一个所需类型的空白符号表,然后使用copy方法,但似乎应该有更好的方法。有吗?

2 个答案:

答案 0 :(得分:4)

您可能还需要提供Factory来创建所需背景结构的实例。

Map代表另一个Map的简单示例:

public static interface Supplier<T> {

    T get();
}

public static class DelegatingMap<K, V> implements Map<K, V> {

    private final Map<K, V> backingMap;

    public DelegatingMap(final Supplier<Map<K, V>> backingMapSupplier) {
        backingMap = backingMapSupplier.get();
    }

    @Override
    public int size() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public boolean isEmpty() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    //etc...
}

答案 1 :(得分:2)

由于类型擦除,在运行时对象不会自动跟踪其类型参数,这就是new T()无法编译的原因。

您可以通过要求调用者为您提供type参数的Class对象来解决此问题,然后您可以使用该对象创建新实例。当然,使用反射绕过编译时检查(特别是,编译器不会检查符号表实现是否具有所需的构造函数),以及IDE可能提供的任何静态分析(构造函数上的调用层次结构不会显示任何来电者。)

或者,您可以要求调用者为您提供工厂对象,该工厂对象可以按需创建符号表实现。这样更灵活(例如,调用者可以选择构造函数参数)和静态类型安全,但也更冗长...