繁体   English   中英

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

[英]Best way to make many generic objects

背景

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

我有一个ST (符号表)接口。 它很像Map ,但是Map的一些必要操作对我来说太难以实现了。 实现此接口我实现了链表,红黑树,线性探测哈希表和线性链接哈希表。

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

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

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

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

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

您可能还需要提供一个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...
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM