gpt4 book ai didi

java - 循环引用替代方案

转载 作者:太空宇宙 更新时间:2023-11-04 09:21:56 25 4
gpt4 key购买 nike

背景:

目前,我正在尝试创建两个任务运算符。一个SettingOperator 类和一个MessageOperator 类。下面我提供了关于我试图通过这两个类实现的目标的背景。

SettingOperator 的用途 - 创建玩家首选项(例如普通桌面应用程序)并将它们存储到数据文件夹中的文件中。这些首选项可以通过播放器命令、配置文件等进行更新。

我的 MessageOperator 的用途 - 处理记录本地化消息并配置插件当前区域设置(只要插件当前支持,否则默认为英语)。

问题:

目前,我正在 onEnable() 方法上初始化两个运算符

private static PluginName instance;
private SettingOperator setting;
private MessageOperator message;

@Override
public void onEnable() {
instance = this;

// TASK OPERATORS
setting = new SettingOperator(this);
message = new MessageOperator(this);
}

/* CLASS INSTANCES */

@Contract (pure = true)
public static AdminConsole getInstance() {
return instance;
}

public static SettingOperator getSettingOP() {
return setting;
}

public static MessageOperator getMessageOP() {
return message;
}

然后我尝试调用对这两个类的引用,因为两者可以互换使用。

*** These Classes Are Into Separate Files, but for the sake of easy readability, I put them in one code block ***

public class SettingOperator {
private final MessageOperator message = PluginName.getMessageOP();
}

public class MessageOperator {
private final SettingOperator message = PluginName.getSettingOP();
}

问题:

是否有更好的方法来做到这一点,因为我倾向于捕获溢出异常并且不告诉我它导致了什么样的问题?感谢任何帮助,并希望得到一些建设性的批评。

最佳答案

使用事件监听器。

这是这个想法。

public interface PropertyChangeListener {
void onPropertyChanged(Object source, String propertyName, String propertyValue);
}

public class SettingOperator implements PropertyChangeListener {

private PropertyChangeListener listener;

public void setPropertyChangeListener(PropertyChangeListener listener){
this.listener = listener;
}

public void onPropertyChanged(Object source, String propertyName, String propertyValue) {
if(!Objects.equal(getProperty(key), value)) {
setProperty(key, value);
}
}

public void setSetting(String key, String value){
properties.setProperty(key, value);
listener.onPropertyChanged(this, key, value);
}
}

public class MessageOperator implements PropertyChangeListener {

private PropertyChangeListener listener;

public void setPropertyChangeListener(PropertyChangeListener listener){
this.listener = listener;
}

public void onPropertyChanged(Object source, String propertyName, String propertyValue) {
consoleLog("Property Set)";
}

public void setLocale(String key, String value){
listener.onPropertyChanged(this, key, value);
}
}


public void onEnable() {
instance = this;
// TASK OPERATORS
setting = new SettingOperator(this);
message = new MessageOperator(this);
setting.setPropertyChangeListener(message);
message.setPropertyChangeListener(setting);
}

您可以扩展方法onPropertyChanged并使用一些bean作为事件而不是字符串。您还可以扩展它并向类添加不是单个监听器,而是多个监听器。但想法是一样的。

关于java - 循环引用替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58224357/

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