背景:
目前,我正在尝试创建两个任务运算符。一个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/