如何使用toString创建一个返回get的供应商?

时间:2015-11-19 15:21:24

标签: java

我想让Map值解析延迟,所以考虑为供应商提供toString函数。但是下面的代码不能编译:

  

默认方法不能覆盖java.lang.Object

中的方法

任何人都知道如何以一种整洁的方式解决这个问题?

@FunctionalInterface
private static interface ToStringSupplier extends Supplier<String>
{
    default public String toString() {
        return get();
    }
}

我想要的原因是我的消费者(位于另一个存储库中)首先可以更新他们的代码:

自:

String value = (Strint)map.get(key);

要:

String value = map.get(key).toString();

之后我可以将实现更改为惰性方法:

自:

String value = expensiveCalculation();
map.put(key,value);

要:

Supplier<String> supplier () -> expensiveCalculation();
map.put(key, supplier);

3 个答案:

答案 0 :(得分:1)

我发现下面的代码可以解决我的问题:

private static Object getToString(Supplier<String> s) {
    return new Object()
    {
        @Override
        public String toString() {
            return s.get();
        }
    };
}

Supplier<String> supplier = () -> expensiveCalculation();
map.put(key, getToString(supplier));

答案 1 :(得分:1)

正如路易斯·瓦瑟曼(Louis Wasserman)在问题的评论部分中提到的那样,不可能用default覆盖实例方法。可以通过将#toString调用委托给所提供的供应商的#get方法的新类来完成。

这是可以完成的方法:

import java.util.Map;
import java.util.function.Supplier;

class Scratch {

    public static final class ToStringSupplier implements Supplier<String> {

        private final Supplier<String> supplier;

        public ToStringSupplier(Supplier<String> supplier) {
            if (supplier == null) {
                throw new NullPointerException();
            }
            this.supplier = supplier;
        }

        @Override
        public String toString() {
            System.out.println("Invoked ToStringSupplier#toString.");
            return get();
        }

        @Override
        public String get() {
            System.out.println("Invoked ToStringSupplier#get.");
            return supplier.get();
        }
    }

    public static void main(String[] args) {
        final var supplier = new ToStringSupplier(() -> {
            System.out.println("Invoked Supplier#get.");
            return "The result of calculations.";
        });
        final var key = "key";
        final var map = Map.of(key, supplier);

        System.out.println("The map has been built.");
        final var calculationResult = map.get(key).toString();
        System.out.println(calculationResult);

        System.out.flush();
    }
}

输出为:

The map has been built.
Invoked ToStringSupplier#toString.
Invoked ToStringSupplier#get.
Invoked Supplier#get.
The result of calculations.

答案 2 :(得分:-4)

default是switch语句中的保留字

您可能想要使用抽象