导读:本期聚焦于小伙伴创作的《Java中如何优雅地在不同类间共享对象实例并调用其方法》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Java中如何优雅地在不同类间共享对象实例并调用其方法》有用,将其分享出去将是对创作者最好的鼓励。

在Java项目开发过程中,不同类之间共享同一个对象实例并调用其方法是很常见的需求,比如全局配置对象、数据库连接池实例、业务核心服务对象等,都需要保证在多个使用方之间是同一个实例,同时能够正常调用其提供的公开方法。如果采用直接new的方式创建实例,会导致多个类拿到不同的对象副本,不仅浪费资源,还可能出现数据不一致的问题。下面介绍几种优雅的实现方案。

Java中如何优雅地在不同类间共享对象实例并调用其方法

方案一:单例模式实现实例共享

单例模式是最基础的实现方式,核心是保证一个类只有一个实例,并且提供全局访问点。常见的实现方式有饿汉式和懒汉式,下面以双重校验锁的懒汉式为例:

public class UserService {
    // 私有静态实例,volatile保证多线程下的可见性和禁止指令重排
    private static volatile UserService instance;
    // 私有构造方法,防止外部直接new
    private UserService() {}

    // 全局访问方法
    public static UserService getInstance() {
        if (instance == null) {
            synchronized (UserService.class) {
                if (instance == null) {
                    instance = new UserService();
                }
            }
        }
        return instance;
    }

    // 需要被调用的业务方法
    public void queryUser() {
        System.out.println("查询用户信息");
    }
}

其他类调用时,直接通过UserService.getInstance()获取唯一实例,再调用方法即可:

public class OrderService {
    public void processOrder() {
        // 获取共享的UserService实例
        UserService userService = UserService.getInstance();
        // 调用实例方法
        userService.queryUser();
    }
}

方案二:静态变量持有共享实例

如果不想使用单例模式的严格限制,也可以通过一个公共的持有类,用静态变量存储共享实例,适合简单的多类共享场景:

// 实例持有类
public class InstanceHolder {
    // 静态变量存储共享实例,可以自定义初始化逻辑
    public static ConfigService configService = new ConfigService();
}

// 配置服务类
public class ConfigService {
    public String getConfig(String key) {
        return "配置值:" + key;
    }
}

不同类直接通过InstanceHolder.configService获取实例调用方法:

public class LogService {
    public void printLog() {
        ConfigService config = InstanceHolder.configService;
        String logLevel = config.getConfig("log_level");
        System.out.println("当前日志级别:" + logLevel);
    }
}

public class MonitorService {
    public void checkStatus() {
        ConfigService config = InstanceHolder.configService;
        String switchStatus = config.getConfig("monitor_switch");
        System.out.println("监控开关状态:" + switchStatus);
    }
}

方案三:依赖注入实现解耦共享

在Spring等框架中,依赖注入是更优雅的方式,不需要手动管理实例的创建和共享,框架会自动将同一个实例注入到需要的类中。首先定义服务类,添加@Service注解交给Spring管理:

import org.springframework.stereotype.Service;

@Service
public class PayService {
    public void pay() {
        System.out.println("执行支付操作");
    }
}

在需要使用该实例的类中,通过@Autowired注解注入同一个实例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderPayService {
    @Autowired
    private PayService payService;

    public void handleOrderPay() {
        payService.pay();
    }
}

@Service
public class RefundService {
    @Autowired
    private PayService payService;

    public void handleRefund() {
        payService.pay();
    }
}

Spring默认管理的Bean都是单例的,所以OrderPayServiceRefundService中注入的PayService是同一个实例,无需额外处理共享逻辑。

不同方案的选择建议

方案适用场景优点缺点
单例模式无框架的小型项目,需要严格控制实例数量实现简单,不需要额外依赖代码耦合度高,不方便单元测试
静态变量持有简单共享场景,实例初始化逻辑简单使用直观,容易理解静态变量生命周期长,不适合需要动态销毁的场景
依赖注入使用Spring等框架的中大型项目解耦性好,方便测试和维护,无需手动管理实例需要依赖框架,小型项目会增加复杂度

注意事项

  • 共享的对象实例如果是可变状态的,要注意多线程下的线程安全问题,必要时添加同步机制
  • 不要过度使用全局共享实例,避免代码出现过高的耦合度,增加维护难度
  • 使用单例模式时,要避免实现Cloneable接口,防止通过克隆创建新的实例副本
  • 依赖注入场景下,如果需要非单例的共享实例,可以调整Bean的作用域,比如设置为prototype后配合自定义作用域实现共享
在实际开发中,优先根据项目规模和使用的技术栈选择合适的方案,中大型项目建议优先使用依赖注入的方式,既保证实例共享的优雅性,也便于后续的扩展和维护。

Java对象共享实例调用设计模式依赖注入修改时间:2026-06-04 03:26:24

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。