`
wilson2job
  • 浏览: 1354 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

如何声明与组织常量

阅读更多
最近涉及了两个项目,两者对声明常量的方式都不尽相同,一个用接口进行封装,另一个用类进行封装。

首先,我们来看看前者的做法:

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








分享到:
评论
7 楼 wilson2job 2008-04-29  
Readonly 写道
1.5还有static import

andy.wang 写道
static import用的多


static import主要有两个优点:
1、简洁的引用,类似于用接口封装的方式。
2、对常量可见性的有效控制,常量只对static import的类可见。

所以,我觉得Tiger推出static import的本意应该是想给“Constant Interface Antipattern”(也就是上面所说的“用接口封装常量”)提供一个解决方案。但SUN自己也承认,static import应该只在“需要对一或两个类的静态变量频繁访问的时候才用”(use it when you require frequent access to static members from one or two classes),滥用有话会严重损害程序的可阅读性和可维护性。

请参考:http://java.sun.com/j2se/1.5.0/docs/guide/language/static-import.html

Anyway,我之所以再次提出“用接口封装常量”来讨论,因为它在组织常量与控制常量的可见性方面,还是非常值得借鉴的。

谢谢大家的讨论,希望有更多人分享自己的经验:)
6 楼 wilson2job 2008-04-29  
Eastsun 写道
Java 1.5已经有enum了。。。


嗯,enum是声明常量的一个不错的选择。但是,对于更有效地组织常量方面,相对于类或接口来说,还是略显逊色。
5 楼 andy.wang 2008-04-29  
static import用的多
4 楼 Readonly 2008-04-29  
1.5还有static import
3 楼 Eastsun 2008-04-29  
Java 1.5已经有enum了。。。
2 楼 wilson2job 2008-04-29  
Readonly 写道
前者为什么不能像后者那样import IConstants使用?还写这么长的文章分析,服了...


Of course you can

但我觉得前者的做法(implements IConstants)有两个优点:
1、更加有效地控制常量的访问——常量只对实现该接口的类可见。
2、引用常量更加简洁。

而import的做法无法发挥这两个优点。
1 楼 Readonly 2008-04-29  
前者为什么不能像后者那样import IConstants使用?还写这么长的文章分析,服了...

相关推荐

    易语言源码易语言取常量源码.rar

    3. **函数或过程**:如果源码包含函数或过程,看看它们是如何与常量交互的,这对于理解程序逻辑至关重要。 4. **程序结构**:观察源码的组织结构,了解易语言中的模块化编程思想。 通过对这份源码的学习,你不仅能...

    apiviewer_gr(常量查询)

    3. **分类查看**:根据常量的分类组织信息,例如按照库、模块或类型进行分类。 4. **代码参考**:在编写或修改代码时,快速查阅相关常量,避免错误使用。 5. **学习新API**:对于不熟悉的API或库,可以通过查询常量...

    易语言源码古木常量查询器.rar

    2. **分类浏览**:常量按类别组织,如系统常量、控制台常量、网络常量等,便于用户按类别查找。 3. **详细信息**:每个常量都附带详尽的解释和示例,帮助用户理解和运用。 4. **快捷复制**:用户可以直接复制常量的...

    15353个常量支持库.rar

    《精易教程:深入理解常量支持库》 ...通过学习和掌握常量库的使用,开发者能够更好地组织和优化自己的代码,从而提高项目的整体质量。在精易教程中,你将有机会深入实践这些概念,提升你的编程技能。

    ThinkPHP系统常量

    4. **IS_LINUX**: 判断操作系统是否为Linux,与上一条常量类似。 5. **IS_FREEBSD**: 判断操作系统是否为FreeBSD,虽然相对较少见,但在特定环境下也十分重要。 #### 四、时间与内存控制常量 1. **NOW_TIME**: ...

    常量与变量教学设计

    常量与变量教学设计 本教学设计旨在帮助学生理解常量与变量的概念及其在程序设计中的应用。通过本节课,学生将了解顺序结构程序的构成,理解常量与变量的概念,并能够定义变量和使用变量在程序设计中。 一、教学...

    VBA 常量值

    3. **简化代码**:通过枚举常量,可以将一组相关的值组织在一起,简化代码并降低出错概率。 4. **版本控制**:当需要更改某些值时,只需要修改常量的定义,而不需要在整个代码库中搜索并替换所有的实例。 **在...

    一种基于Spring的java程序常量管理思路

    本篇文章将探讨一种基于Spring的Java程序常量管理思路,并结合`Properties`类的使用,来深入理解如何在项目中组织和使用常量。 首先,了解常量管理的重要性。常量是程序中不会改变的值,它们通常用来表示固定的配置...

    第四节 常量1

    5. 常量与常量表达式: 常量在编译时就已确定其值,所以它们不能引用任何运行时才能确定的值。这意味着你不能将变量的值赋给常量,也不能在常量定义中使用函数调用(除非该函数返回的是一个常量)。 6. 常量的应用...

    struts2常量详解

    它提供了一种组织和管理应用程序组件的方法,简化了开发过程。本文将深入探讨Struts2中的常量配置,这些常量在框架的运行时扮演着至关重要的角色。 首先,我们要了解Struts2配置文件的层次结构。主要有以下几个核心...

    Java堆、栈和常量池——内存剖析

    它包含类或接口中声明的所有常量(直接量),如文本字符串、被声明为`final`类型的常量等。 - **常量池的特点**: - 常量池中存储的常量不会因为引用它们的代码不再被使用而被垃圾回收。 - 字符串常量和基本类型...

    API常量查询器(很全很好用、本地版)

    描述虽然简洁,但我们可以推断,这个查询器设计得非常实用,可能是通过用户友好的界面,以高效的方式组织和显示API常量。这对于开发者来说是一个宝贵的资源,因为它减少了查找特定常量的时间,提高了开发效率。 ...

    Python程序设计:Python常量和变量.pptx

    在Python程序设计中,了解和掌握常量与变量的概念至关重要,因为它们构成了程序的基本构建块。在本任务中,我们将探讨这些概念以及相关的知识点,包括Python中的数字和运算符、内置函数、字符串、列表、元组、字典和...

    古木常量查询器.rar

    4. **分类浏览**:常量可能按类别组织,如数学、物理、网络等,用户可以通过分类导航找到所需常量。 5. **详情查看**:点击查询结果,会显示常量的详细信息,如常量的值、含义、使用示例等,帮助开发者更好地理解和...

    Labview应用技术 簇和簇常量(教案).doc

    在LabVIEW应用技术中,簇和簇常量是两种非常重要的数据结构,它们在图形化编程环境...通过系统的教学和实践,学生不仅可以掌握这些基本概念,还能锻炼解决问题的能力,为将来在电子与通信工程领域的应用打下坚实基础。

    swift-基于swift4.2常见的全局常量和函数集合

    在Swift编程语言中,全局常量和函数是两个重要的组成部分,它们在代码组织和复用中发挥着关键作用。在Swift 4.2版本中,虽然没有Objective-C中的宏定义,但提供了更安全、类型安全的替代方案。下面将详细探讨Swift中...

    Java中的常量如何避免反模式Java开发Java经验技巧

    这样做有助于代码的组织,使得常量的查找和使用更加方便。 2. **命名规范**: - 常量的命名应遵循大写驼峰命名法(CONSTANT_CASE),例如 `MAX_SIZE` 或 `API_KEY`。这有助于区分常量和其他变量,并符合Java社区的...

    我的第一个支持库--常量库

    1. **常量的定义**:在大多数编程语言中,常量是通过特定关键字来声明的,如在C++中的`const`,Java中的`final`,Python中的`None`或直接赋值(因为变量赋值后不可更改)。常量一旦定义,其值就不能在程序运行过程中...

    API常量查看器.rar

    API常量查看器的工作原理通常涉及到解析API文档或直接从库的源代码中提取常量信息,然后将其组织成易于浏览和搜索的格式。这需要对编程语言的元数据有深入的理解,以及高效的文本处理和数据解析技术。 在使用API...

    古木常量查询器.e.rar

    不同的编程语言对常量的处理方式各异,例如在Java中,我们使用`final`关键字来声明常量;在Python中,虽然没有内置的常量类型,但通常通过全大写变量名来表示常量。 如果“古木常量查询器”是一个编程工具,那么它...

Global site tag (gtag.js) - Google Analytics