首页 > 解决方案 > 如何在静态上下文中引用非静态方法(在实例上调用它们以进行方法序列化)

问题描述

现在我的一个 java 程序中有一个类,它定义了一系列做不同事情的非静态消费者:

public class Foo {
    //pretend these methods have bodies
    public void addWood(String s) ... 
    public void addMetal(String s) ...
    public void addFish(String s) ...
    public void addFood(String s) ...

    public void process() {}
}

以及将调用这些函数的“进程”方法。

但是,我希望将调用这些函数的确切函数和顺序存储在类的某个静态状态中,所以我对此的想法起初很简单:

我只是创建了一个 HashMap<Parameter,Method> (参数总是唯一的,因为它们是供应商对象)。然后在一些外部函数中,当我想添加一个由 Foo 实例调用的函数时,我只需在外部函数中执行类似的操作:

Foo.hash_map.put( parameter, Foo::addWood );

但是我不能这样做,因为 addWood 不是静态的,所以我该怎么做

现在我知道这可能有抽象问题的味道,但我正在使用外部代码库,所以这是我能做的最好的事情,让程序做我想做的事。我看不出像这样的事情不起作用的任何根本原因,我承认这是一件有点奇怪的事情,但如果有人知道一种简单的方法,那将非常有帮助。

标签: javamethodsstatic

解决方案


Foo::addWood工作得很好。它适用于任何接受Foo以及 a的实例String并且不返回任何内容的 FunctionalInterface:

private final Map<String, BiConsumer<Foo, String>>;

会做的工作。

但是,我不确定这是否是最合适的;我会List<>改为Consumer

List<Consumer<Foo>> list = ..;
list.add(foo -> foo.addWood("Hello"));
list.add(foo -> foo.addMetal("Goodbye"));

...


Foo foo = ...;
for (var consumer : list) list.accept(foo);

至少,如果你说字符串参数总是不变的。


推荐阅读