java - 循环引用替代方案

标签 java minecraft bukkit

背景:

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

相关文章:

java - 使用圆形物体求圆柱体的体积

java - Spring AMQP : error with annotation-driven listener endpoints

java - 在 IntelliJ IDEA 中禁用 "Constant conditions & exceptions"字段检查

java - Bukkit Maven sk89q的命令框架

java - 比较列表中对象的属性

EJB 离线时的 JavaEE 通知

java - Spring Boot使用ClientDetailsUserDetailsS​​ervice加载ClientDetails

java - 使用 IntelliJ 引用 jar lib 会导致 ClassNotFoundException

java - Minecraft Forge 方法数据类型

java - Bukkit - 轨道射弹