java - 如何在静态上下文中引用非静态方法(在实例上调用它们以进行方法序列化)
问题描述
现在我的一个 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 不是静态的,所以我该怎么做
现在我知道这可能有抽象问题的味道,但我正在使用外部代码库,所以这是我能做的最好的事情,让程序做我想做的事。我看不出像这样的事情不起作用的任何根本原因,我承认这是一件有点奇怪的事情,但如果有人知道一种简单的方法,那将非常有帮助。
解决方案
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);
至少,如果你说字符串参数总是不变的。
推荐阅读
- ios - Xamarin Forms - iOS 输入字段不会自动调整位置,因为键盘出现在 ScrollView 中的内容
- python - Heroku:ModuleNotFoundError:没有名为“请求”的模块
- dart - 以编程方式返回由父小部件包装的小部件的最佳方法
- c - 如何使用c中的指针反转数组
- javascript - 页面加载时的多个异步调度会产生错误?
- django - 如何在 RedirectView 中自定义 url
- python - 为什么 Python 3 中这个简单的整数除法给我的答案比预期的少一个?
- android - 切换片段时reccyclerview消失
- sql-server - 指定 CollectionAggregate 使用的顺序
- python - 运行带有多个核心的snakemake