最近涉及了两个项目,两者对声明常量的方式都不尽相同,一个用接口进行封装,另一个用类进行封装。
首先,我们来看看前者的做法:
public interface IConstants {
public static String CONSTANT_STRING = "iconstant_string";
}
注意在引用该常量前,必须先实现IConstants接口,然后直接引用即可:
public class Main implements IConstants {
public static void main(String[] args) {
// Access constants in interface
System.out.println(CONSTANT_STRING);
}
}
接着,我们再来看看后者的做法:
public class Constants {
/**
* A private constructor to suppress the default constructor.
*/
private Constants() {
}
public final static String CONSTANT_STRING = "constant_string";
}
在需要使用常量的地方引用即可:
// Access constants in class
System.out.println(Constants.CONSTANT_STRING);
简单地比较两者,我们很容易看出:
1、前者直接引用常量,显得非常简洁。但一旦实现了IConstants接口,便间接包含了其声明的所有常量,略显冗余。
2、虽然后者的引用方式相对有点复杂(其实也不会
),但有效避免了冗余。
我个人倾向于后者的做法,因为我觉得声明与组织常量可以遵循以下几个原则:
1、常量只对有需要的客户(类或接口)可见。
2、常量对客户而言应该是“只读”。
3、常量的声明和组织容易阅读。
其中最重要的应该是可见性的问题。前者(使用接口封装常量)确实可以更好地控制可见性,因为接口声明的常量只对实现了该接口的类可见,而后者(使用类封装常量)默认是全局可见。诚如Josh Bloch在《Effective Java》中论述过,假设一个类实现了IConstants接口,当然,它可以轻松获得常量。但是,这样一来,该类的所有子类也默认继承了IConstants的所有常量,也许这并不是我们想要的。
最后我引用Josh Bloch的一段话作为结束吧,呵呵,希望大家能分享一下自己的经验
引用
The constant interface pattern is a poor use of interfaces. That a class uses some constants internally is an implementation detail. Implementing a constant interface causes this implementation detail to leak into the class's exported API. It is of no consequence to the users of a class that the class implements a constant interface. In fact, it may even confuse them. Worse, it represents a commitment: if in a future release the class is modified so that it no longer needs to use the constants, it still must implement the interface to ensure binary compatibility. If a nonfinal class implements a constant interface, all of its subclasses will have their namespaces polluted by the constants in the interface
分享到:
相关推荐
3. **函数或过程**:如果源码包含函数或过程,看看它们是如何与常量交互的,这对于理解程序逻辑至关重要。 4. **程序结构**:观察源码的组织结构,了解易语言中的模块化编程思想。 通过对这份源码的学习,你不仅能...
3. **分类查看**:根据常量的分类组织信息,例如按照库、模块或类型进行分类。 4. **代码参考**:在编写或修改代码时,快速查阅相关常量,避免错误使用。 5. **学习新API**:对于不熟悉的API或库,可以通过查询常量...
2. **分类浏览**:常量按类别组织,如系统常量、控制台常量、网络常量等,便于用户按类别查找。 3. **详细信息**:每个常量都附带详尽的解释和示例,帮助用户理解和运用。 4. **快捷复制**:用户可以直接复制常量的...
《精易教程:深入理解常量支持库》 ...通过学习和掌握常量库的使用,开发者能够更好地组织和优化自己的代码,从而提高项目的整体质量。在精易教程中,你将有机会深入实践这些概念,提升你的编程技能。
4. **IS_LINUX**: 判断操作系统是否为Linux,与上一条常量类似。 5. **IS_FREEBSD**: 判断操作系统是否为FreeBSD,虽然相对较少见,但在特定环境下也十分重要。 #### 四、时间与内存控制常量 1. **NOW_TIME**: ...
常量与变量教学设计 本教学设计旨在帮助学生理解常量与变量的概念及其在程序设计中的应用。通过本节课,学生将了解顺序结构程序的构成,理解常量与变量的概念,并能够定义变量和使用变量在程序设计中。 一、教学...
3. **简化代码**:通过枚举常量,可以将一组相关的值组织在一起,简化代码并降低出错概率。 4. **版本控制**:当需要更改某些值时,只需要修改常量的定义,而不需要在整个代码库中搜索并替换所有的实例。 **在...
本篇文章将探讨一种基于Spring的Java程序常量管理思路,并结合`Properties`类的使用,来深入理解如何在项目中组织和使用常量。 首先,了解常量管理的重要性。常量是程序中不会改变的值,它们通常用来表示固定的配置...
5. 常量与常量表达式: 常量在编译时就已确定其值,所以它们不能引用任何运行时才能确定的值。这意味着你不能将变量的值赋给常量,也不能在常量定义中使用函数调用(除非该函数返回的是一个常量)。 6. 常量的应用...
它提供了一种组织和管理应用程序组件的方法,简化了开发过程。本文将深入探讨Struts2中的常量配置,这些常量在框架的运行时扮演着至关重要的角色。 首先,我们要了解Struts2配置文件的层次结构。主要有以下几个核心...
它包含类或接口中声明的所有常量(直接量),如文本字符串、被声明为`final`类型的常量等。 - **常量池的特点**: - 常量池中存储的常量不会因为引用它们的代码不再被使用而被垃圾回收。 - 字符串常量和基本类型...
描述虽然简洁,但我们可以推断,这个查询器设计得非常实用,可能是通过用户友好的界面,以高效的方式组织和显示API常量。这对于开发者来说是一个宝贵的资源,因为它减少了查找特定常量的时间,提高了开发效率。 ...
在Python程序设计中,了解和掌握常量与变量的概念至关重要,因为它们构成了程序的基本构建块。在本任务中,我们将探讨这些概念以及相关的知识点,包括Python中的数字和运算符、内置函数、字符串、列表、元组、字典和...
4. **分类浏览**:常量可能按类别组织,如数学、物理、网络等,用户可以通过分类导航找到所需常量。 5. **详情查看**:点击查询结果,会显示常量的详细信息,如常量的值、含义、使用示例等,帮助开发者更好地理解和...
在LabVIEW应用技术中,簇和簇常量是两种非常重要的数据结构,它们在图形化编程环境...通过系统的教学和实践,学生不仅可以掌握这些基本概念,还能锻炼解决问题的能力,为将来在电子与通信工程领域的应用打下坚实基础。
在Swift编程语言中,全局常量和函数是两个重要的组成部分,它们在代码组织和复用中发挥着关键作用。在Swift 4.2版本中,虽然没有Objective-C中的宏定义,但提供了更安全、类型安全的替代方案。下面将详细探讨Swift中...
这样做有助于代码的组织,使得常量的查找和使用更加方便。 2. **命名规范**: - 常量的命名应遵循大写驼峰命名法(CONSTANT_CASE),例如 `MAX_SIZE` 或 `API_KEY`。这有助于区分常量和其他变量,并符合Java社区的...
1. **常量的定义**:在大多数编程语言中,常量是通过特定关键字来声明的,如在C++中的`const`,Java中的`final`,Python中的`None`或直接赋值(因为变量赋值后不可更改)。常量一旦定义,其值就不能在程序运行过程中...
API常量查看器的工作原理通常涉及到解析API文档或直接从库的源代码中提取常量信息,然后将其组织成易于浏览和搜索的格式。这需要对编程语言的元数据有深入的理解,以及高效的文本处理和数据解析技术。 在使用API...
不同的编程语言对常量的处理方式各异,例如在Java中,我们使用`final`关键字来声明常量;在Python中,虽然没有内置的常量类型,但通常通过全大写变量名来表示常量。 如果“古木常量查询器”是一个编程工具,那么它...