java - 接口与单例中的全局变量
问题描述
我需要有几个全局变量(例如:数据库名称),这些变量将被我的程序中的其他一些类使用。
我可以创建一个包含变量的 Singleton 类,但我发现我也可以简单地创建一个包含变量的接口(没有任何方法)。由于接口中的变量是静态的和最终的,这似乎是一个干净的实现。
我读到认为在接口中声明变量是糟糕的设计,那么为什么会这样,创建全局变量的最佳方法是什么?
解决方案
根据Sonar 规则,仅使用接口来保存常量是一种代码异味:
Constants should not be defined in interfaces (squid:S1214)
根据“Effective Java”的作者 Joshua Bloch 的说法: 常量接口模式是对接口的不良使用。
一个类在内部使用一些常量是一个实现细节。
实现一个常量接口会导致这个实现细节泄漏到类的导出 API 中。类实现一个常量接口对类的用户来说无关紧要。事实上,它甚至可能使他们感到困惑。更糟糕的是,它代表了一种承诺:如果在未来的版本中修改了类以使其不再需要使用常量,它仍然必须实现接口以确保二进制兼容性。如果一个非final类实现了一个常量接口,
它的所有子类的命名空间都会被接口中的常量污染。
推荐阅读
- java - 使用 Jose4J 将 JWT 的主体提取为 JSON
- android - Android Jetpack Compose 中的 Modifier.wrapContentWidth() 与 Modifier.width(IntrinsicSize.Max)
- excel - Excel Power Query 自定义函数编辑器以捕获未找到的值
- database - TYPO3 中的高效 Flexform 数据库查询
- django - 如何在 Django 模型中获取所有反向关系名称?
- c# - 已发布的托管 Blazor wasm 应用仅显示正在加载
- python - 如何使用 ./ 运行方法而不是通过 Python3 调用
- reactjs - 在 setInterval 中反应 setState
- python - 裁剪图像并粘贴到与源相同的坐标中
- python - Python Pandas:在 lambda / TypeError 中使用映射函数:(“int() 参数必须是字符串、类似字节的对象或数字,而不是“列表””