0

0

Java 中如何在不暴露内部结构的前提下复用另一个类的公共字段?

霞舞

霞舞

发布时间:2026-02-03 20:06:08

|

719人浏览过

|

来源于php中文网

原创

Java 中如何在不暴露内部结构的前提下复用另一个类的公共字段?

本文介绍通过组合(composition)方式安全复用外部类的公共成员,避免硬编码字段声明,实现松耦合、易维护的对象封装。

在 Java 开发中,当需要在 SomeOtherFile 类中使用 SetOfThings 类定义的一组可变配置或状态字段(如 someNumber、someString、example),但又不希望重复声明、硬编码字段名,更不希望破坏封装性(例如将所有字段改为 public 并直接访问),最佳实践是采用对象组合(Composition)而非字段复制。

✅ 推荐方案:依赖注入 + 私有持有引用

不要试图“自动提取并重新声明” SetOfThings 的所有 public 字段——这不仅违背面向对象设计原则,还会因反射引入运行时风险、丢失类型安全、破坏编译期检查。正确做法是:将 SetOfThings 实例作为私有成员注入到目标类中,并通过该引用来访问所需数据。

// SetOfThings.java
public class SetOfThings {
    public int someNumber = 1;
    public String someString = "Java is kinda challenging sometimes...";
    public Joystick example = new Joystick(someNumber); // 注意:String 首字母大写,非 string
}
// SomeOtherFile.java
public class SomeOtherFile {
    private final SetOfThings config; // 使用 final 保证不可变引用(推荐)

    // 构造器注入:显式传递依赖,清晰、可控、利于测试
    public SomeOtherFile(SetOfThings things) {
        this.config = things; // 安全持有引用,无需知晓其内部字段细节
    }

    // 示例:安全访问配置值
    public void doSomething() {
        System.out.println("Number: " + config.someNumber);
        System.out.println("Message: " + config.someString);
        config.example.setPower(0.5); // 调用行为,而非仅读取数据
    }
}
⚠️ 注意事项:SetOfThings 中的字段虽为 public,但应视作配置契约(Contract),而非设计缺陷;若需更强封装,后续可将其改为 private + getter 方法(推荐长期演进路径)。若 SetOfThings 实例本身是无状态、可共享的(如纯配置对象),也可在 SomeOtherFile 中直接创建:private final SetOfThings config = new SetOfThings();,但需确保其构造逻辑稳定。避免使用反射自动拷贝字段(如 getDeclaredFields()):它绕过访问控制、无法处理初始化顺序(如 Joystick 依赖 someNumber)、难以调试且违反开闭原则。

✅ 进阶建议:提升封装性与可维护性

  • 将 SetOfThings 升级为不可变配置类(Immutable Configuration):

    public final class SetOfThings {
        private final int someNumber;
        private final String someString;
        private final Joystick example;
    
        public SetOfThings(int number, String str) {
            this.someNumber = number;
            this.someString = str;
            this.example = new Joystick(number);
        }
        // 提供 getter,不提供 setter
        public int getSomeNumber() { return someNumber; }
        public String getSomeString() { return someString; }
        public Joystick getExample() { return example; }
    }

    此时 SomeOtherFile 仍只需持有一个 private final SetOfThings config;,但语义更清晰、线程更安全、意图更明确。

    剪映专业版
    剪映专业版

    一款全能易用的桌面端剪辑软件

    下载

    立即学习Java免费学习笔记(深入)”;

  • 结合依赖注入框架(如 Spring):在大型项目中,可通过 @Autowired 或构造器注入自动管理 SetOfThings 生命周期,彻底解耦实例创建逻辑。

总之,“声明另一个文件中的私有对象”本质上不是关于字段复制,而是关于依赖关系建模。通过组合+构造器注入,你既获得了完全的封装控制权,又保持了对上游变更的弹性适应能力——这才是 Java 工程化开发的核心思维。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

117

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

69

2026.01.26

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

54

2025.11.27

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

568

2023.08.10

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

17

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

24

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

14

2026.02.03

c语言中/相关合集
c语言中/相关合集

本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

2

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.2万人学习

C# 教程
C# 教程

共94课时 | 8.4万人学习

Java 教程
Java 教程

共578课时 | 56.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号