gpt4 book ai didi

java - 如何在静态上下文中引用非静态方法(在实例上调用它们以进行方法序列化)

转载 作者:行者123 更新时间:2023-12-04 14:02:20 25 4
gpt4 key购买 nike

现在我的一个 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 (参数始终是唯一的,因为它们是供应商对象)。然后在一些外部函数中,当我想添加一个由 Foo 的实例调用的函数时,我只需在外部函数中做这样的事情:

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

但是我不能这样做,因为 addWood 不是静态的,所以我该怎么做,我如何引用一个非静态方法,静态地,被非静态地调用,如果这有意义的话

现在我知道这可能存在抽象问题,但我正在使用外部代码库,所以这是我能做的最好的事情,让程序按照我的意愿行事。我看不出任何潜在的原因,比如这样的事情行不通,我承认想要做这件事有点奇怪,但如果有人知道一种简单的方法来做这件事,那将非常有帮助。

最佳答案

Foo::addWood工作得很好。它适合任何采用 Foo 实例的 FunctionalInterface以及 String并且什么都不返回:

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);

至少,如果如您所说,字符串参数始终保持不变。

关于java - 如何在静态上下文中引用非静态方法(在实例上调用它们以进行方法序列化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69610058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com