You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Main.java中实例化Main类的写法是否属于Java开发良好实践?

关于在main方法中实例化当前Main类写法的合理性解答

你提到的Main main = new Main();写法属于Java的标准良好实践,远优于把所有成员都声明为static的实现方案,理由如下:

  • 避免滥用static带来的设计问题:static成员属于类全局共享,生命周期和JVM中类的加载周期绑定,不仅会提升类之间的耦合度,也无法支持多实例场景的扩展,还容易在多线程场景下引发线程安全问题。你现在的写法将业务逻辑收敛到实例方法中,成员变量由实例独立持有,天然规避了上述问题。
  • 可复用性更强:如果后续需要在其他逻辑中复用Main类的能力,直接实例化即可,不同实例之间的状态完全隔离,互不影响。如果全部用static实现,不仅无法做实例级的定制,单元测试时也很难对依赖做Mock替换。
  • 符合面向对象的设计思路:Java是面向对象的编程语言,将业务逻辑封装在实例中,更方便后续做功能扩展,比如后续要加不同的配置参数、重写实例方法等都可以轻松实现。

如果想要进一步提升代码可复用性,可以采用依赖注入的方式优化Main类的依赖声明,参考实现如下:

public class Main {
    // 成员变量声明为final避免被意外修改
    private final Scanner keyboard;
    private final Instructions instructions;

    // 通过构造方法注入依赖,外部可灵活替换实现
    public Main(Scanner keyboard, Instructions instructions) {
        this.keyboard = keyboard;
        this.instructions = instructions;
    }

    public static void main(String[] args){
        // 入口处统一组装依赖
        Scanner systemScanner = new Scanner(System.in);
        Instructions defaultInstructions = new Instructions();
        Main main = new Main(systemScanner, defaultInstructions);
        main.showInstructions();
    }

    void showInstructions(){
        instructions.welcome();
    }
}

优化后你可以根据场景灵活传入不同的依赖实现,比如做单元测试时可以传入从测试文件读取内容的Scanner实例,不需要强制依赖控制台输入,复用性会更强。

内容的提问来源于stack exchange,提问作者icekomo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:06:05