编程语言
首页 > 编程语言> > 在Java中延迟加载接口

在Java中延迟加载接口

作者:互联网

我正在尝试使用Java Lists创建一个延迟加载方法,它接受索引,向List添加元素直到索引有效,并返回该索引处的值.

例如,假设我有一个像[0,1,2,3]这样的列表.如果我用它调用我的方法并传入索引1,它应该返回1而不以任何方式更改List.如果我用它调用我的方法并传入索引5,它应该返回0(默认的Integer值),我的List现在应该看起来像这个[0,1,2,3,0,0].

最初实现起来似乎相当简单,但是当我尝试传入Lists(如List< List< String>>)时会遇到问题.我知道你不能实例化一个列表,所以我尝试创建一个ArrayList,但它不起作用.

这是我方法的当前化身

protected <T> T getOrCreateAt(int index, List<T> list, Class<T> elementClass) {
    while (list.size() < index + 1) {
        try {
            list.add(elementClass.newInstance());
        } catch (InstantiationException e) {
            e.printStackTrace();
            System.exit(1);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    return list.get(index);
}

这是我称之为的地方

List<List<String>> solutionText = new ArrayList<List<String>>();

for (Node node : solution) {
    List<String> row = getOrCreateAt(node.rowNo, solutionText, ArrayList.class);
    getOrCreateAt(node.colNo, row, String.class);
    row.set(node.colNo, String.valueOf(node.cellNo));
}

对getOrCreateAt的第二次调用有效,但第一次调用不能编译.

如何让我的延迟加载方法在接口和抽象类上工作?

解决方法:

我过去遵循的这种类似工厂行为的模式是通过匿名类完成的.

interface Factory<T> {
    T newInstance() throws InstantiationException, IllegalAccessException;
}

然后是你需要的实现

Factory<List<String>> arrayListFactory = new Factory<List<String>>() {
    @Override
    public List<String> newInstance() throws InstantiationException, IllegalAccessException {
        return new ArrayList<String>();
    }
};
Factory<String> stringFactory = new Factory<String>() {
    @Override
    public String newInstance() throws InstantiationException, IllegalAccessException {
        return String.class.newInstance();
    }
};

当然,改变你的方法来接受工厂的东西,而不是一个类.

protected static <T> T getOrCreateAt(int index, List<T> list, Factory<T> factory) {
    while (list.size() < index + 1) {
        try {
            list.add(factory.newInstance());

所以用法看起来像

for (Node node : solution) {
    List<String> row = TestThing.getOrCreateAt(node.rowNo, solutionText, arrayListFactory);
    getOrCreateAt(node.colNo, row, stringFactory);
    row.set(node.colNo, String.valueOf(node.cellNo));
}

如果我不需要在一个文件之外,我可能会将它们全部作为内部成员粘贴在该源文件中.

标签:java,generics,lazy-loading
来源: https://codeday.me/bug/20190901/1787106.html