在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
相关产品推荐
相关产品推荐

