背景:

当前,我正在尝试创建两个任务运算符。 SettingOperator类和MessageOperator类。下面,我提供了两个类的学习背景。

我的SettingOperator的目的-创建播放器首选项,例如普通的桌面应用程序,并将它们存储到data文件夹中的文件中。这些首选项可以通过播放器命令,配置文件等进行更新。

我的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作为事件而不是String。另外,您可以扩展它并向类添加一个或多个侦听器。但是想法是一样的。

10-06 02:10