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

3

背景

我做了一个线性链接哈希表作为课程项目。它存储了一个链表数组,每当调用getput方法时,键被散列并取模于数组大小。然后在结果链表上调用getput方法(我也实现了该方法)。

我有一个ST(符号表)接口。它与Map类似,但是我无法实现Map所需的一些操作。通过实现这个接口,我实现了一个链表、红黑树、线性探测哈希表和线性链接哈希表。

我想制作一个类似于线性链接哈希表的东西,它可以接受任意委托符号表类型。例如,用红黑树类型初始化它将创建一个红黑树表,并且getput函数将委托给这些红黑树。

我知道我的实现几乎肯定比库提供的慢,而且在真正的代码中最好使用那些实现。我只是在尝试实验和学习。

问题

最佳方式是什么,以便向我的哈希表提供一个类型,使得哈希表由该类型的表组成,并且调用将委托给这些符号表?

我不能使用泛型,因为我无法对其进行初始化,并且我需要在构建和调整大小时初始化。

我考虑过提供所需类型的空白符号表,然后在它上面使用copy方法,但似乎应该有更好的方法。是否存在这样的方式?


3
您可以要求提供一个“工厂”,以创建所需支持结构的实例。 - Boris the Spider
参考:工厂模式 - dimo414
2个回答

4

你可能需要提供一个工厂,以创建所需支持结构的实例。

一个简单的示例是使用委托给另一个MapMap

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 HashtableSupplier<Integer, Integer>(new LinkedListSupplier<Integer, Integer>())。有什么避免这种情况的技巧吗? - raptortech97
创建一个名为FactoryFactory的类,它包含静态方法,用于返回不同实现的Supplier实例。 - Boris the Spider
谢谢你的回答!虽然你的方法可行,但我发现在我的客户端中只需创建几个静态供应商实例就更容易了。 - raptortech97

2
由于类型擦除,在运行时对象不会自动跟踪其类型参数,这就是为什么new T()无法编译的原因。
您可以通过要求调用者提供类型参数的Class对象来解决此问题,然后可以使用它来创建新实例。当然,使用反射绕过了编译时检查(特别是编译器将不检查符号表实现是否具有所需的构造函数),以及您的IDE可能提供的任何静态分析(构造函数的调用层次结构不会显示任何调用者)。
或者,您可以要求调用者提供一个工厂对象,该对象可以按需创建符号表实现。这更加灵活(例如,调用者可以选择构造函数参数)并且在静态类型上更安全,但也更加冗长……

谢谢!我选择了工厂对象选项(这个选项由bmorris591更详细地解释了)。 - raptortech97

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接