在 Java 的构造函数中声明和设置私有最终成员变量的正确方法?

2023-12-26

有多种方法可以从构造函数设置成员变量。我实际上正在讨论如何正确设置最终成员变量,特别是由辅助类加载条目的映射。

public class Base {
    private final Map<String, Command> availableCommands;
    public Base() {
        availableCommands = Helper.loadCommands();  
    }
}

在上面的示例中,辅助类如下所示:

public class Helper {
    public static Map<String, Command> loadCommands() {
        Map<String, Command> commands = new HashMap<String, Command>();
        commands.put("A", new CommandA());
        commands.put("B", new CommandB());
        commands.put("C", new CommandC());

        return commands;
    }
}

我的想法是,使用一种方法在构造函数中设置此类变量是更好的做法。所以基类看起来像这样:

public class Base {
    private final Map<String, Command> availableCommands;
    public Base() {
        this.setCommands();  
    }
    private void setCommands() {
        this.availableCommands = Helper.loadCommands();
    }
}

但现在我无法维护最终修饰符并收到编译器错误(无法设置最终变量)

另一种方法是:

public class Base {
    private final Map<String, Command> availableCommands = new HashMap<String, Command>();
    public Base() {
        this.setCommands();
    }
    private void setCommands() {
        Helper.loadCommands(availableCommands);
    }
}

但在这种情况下,Helper 类中的方法将更改为:

public static void loadCommands(Map<String, Command> commands) {
    commands.put("A", new CommandA());
    commands.put("B", new CommandB());
    commands.put("C", new CommandC());
}

所以区别在于我在哪里创建新地图new HashMap<String, Command>();?我的主要问题是,考虑到部分功能来自此 Helper 的静态方法,是否有推荐的方法来执行此操作,作为加载带有条目的实际地图的方法?

我是在 Base 类还是 Helper 类中创建新地图吗?在这两种情况下,Helper 都会进行实际的加载,而 Base 对持有具体命令的地图的引用将是私有的和最终的。

除了我正在考虑的选项之外,是否还有其他更优雅的方法来做到这一点?


根据您的第一个代码片段,对我来说,帮助程序类创建地图似乎是完全合理的。你are在构造函数中设置变量 - 我看不到问题。

正如哈欠所说,使地图不可变将是一个很好的接触,但除此之外,我只使用第一个片段中的代码。

(顺便说一下,我认为在现实生活中这确实需要是一个实例变量,而不是静态变量?)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 的构造函数中声明和设置私有最终成员变量的正确方法? 的相关文章

随机推荐