`

集锦:常量的几种定义方式

    博客分类:
  • Java
 
阅读更多

 

本文针对面向对象语言(以Java为例)中常量定义的几种常见方法做一个总结和简单比较。

常见的常量定义方式主要有以下几种:

第一种:使用接口定义常量

定义方法如下:

package com.shansun.staticex;

public interface BadIrrationalConstants {
     public static final double SQRT_TWO = 1.414;
     public static final double SQRT_THREE = 1.732;
}

如果你想在自己的类中使用这些接口中定义的常量的时候,那么你必须要实现这些接口。比如:

public class BadUseOfConstants implements BadIrrationalConstants {

    public static double sinPiOverFour() {
       return SQRT_TWO / 2;
     }

}

EffectiveJava19条对这种方式提出反对,理由如下

1.接口被用作一个类型,通过此类型可以引用这个类的实例,为了其他目的定义接口不合适。

2.类中使用常量,这是实现细节,实现常量接口后,把这个实现细节泄漏到该类的API中,对类的用户也没有价值

3.将来类不需要这些常量了,仍必须实现这个接口,以保证兼容性。

4.一个非final类实现一个常量接口,它的所有子类的名字空间会被接口中的常量污染。

5.接口A中有个常量 接口B中也有个与A中名字一样值不一样的常量。类C 同时实现A B 接口的时候 ,要用这个常量就冲突了

第二种:使用枚举类定义常量,如下:

public enum Test {       //enum相当于class的位置,Test为类名

ONE, TWO, THREE   //枚举的常量名,使用时用Test.ONE表示

}

如果想使用枚举类中定义的常量,只需导入该枚举类,然后直接使用即可,如:

int i = Test.ONE;

枚举类一般是用来是作为一些属性相同或相近的常量,如颜色、年份等;不太适合几个常量之间没有太多相似度或关系的情形。

第三种:使用static import导入需要的常量

这种方式是在1.5之后才添加的。具体使用如下,例如我们在自己的类中要使用上文中定义的BadIrrationalConstants类:

import static com.shansun.staticex.IrrationalConstants. SQRT_TWO;

……

public static double sinPiOverFour() {
       return SQRT_TWO / 2;
}

该方法适合当需要从别的类引入少数几个静态常量的时候,但不宜频繁使用该方法,比如一下子引入了多个常量,这样会影响到了程序的可读性了。

第四种:使用不可实例化的辅助类存放常量

获取这种常量定义方式是大家最常见到也最常用的一种方式了。定义方法如下:

 

public class Constants{

private Constants(){}

public static final double PI=3.14

}

我们一般见到比较多的就是这种用法了,Constants.PI——是不是很眼熟呢?

<!--EndFragment--> p>

 

原文:http://www.shansun123.com

9
8
分享到:
评论
1 楼 love_ai87 2010-08-03  
用接口定义常量的时候为什么一定要implements该接口呢?直接
BadIrrationalConstants.SQRT_TWO 不行吗

相关推荐

    VB趣味程序集锦 朱恩源

    在《VB趣味程序集锦》中,作者朱恩源将带领读者探索以下几个方面的VB知识点: 1. **基础语法与数据类型**:包括变量的声明、常量的设定、基本数据类型(如Integer、Double、String等)的使用,以及运算符的理解和...

    类型转换集锦

    在进行类型转换前,我们需要了解C++中的几种基本数据类型: - **整型** (`int`):用于存储整数值。 - **字符型** (`char`):用于存储单个字符。 - **浮点型** (`double`):用于存储双精度浮点值。 - **字符串** (`...

    嵌入式C_C++语言精华文章集锦.pdf

    文章介绍了几种优化内存访问的方法,包括缓存友好的数据结构设计、减少内存访问次数等。 - 例如,可以使用循环展开技术来减少循环中的内存访问次数,从而提高性能。 - **算法优化:** - 高效的算法是提升程序性能...

    C51源程序集锦

    3. **内存模型与存储器管理**:C51支持几种不同的内存模型,如代码存储在ROM中的"code"段,数据存储在RAM中的"data"段,以及可位寻址的"bit"段。开发者需要理解如何声明变量以确定它们在内存中的位置。 4. **I/O...

    C语言基础知识集锦.docx

    C语言是一种广泛使用的编程语言,...总的来说,C语言基础知识集锦涵盖了从语言的概述到具体的数据类型和变量定义,这些内容是理解和编写C程序的基础。掌握这些知识将有助于开发者编写出高效、可移植且易于维护的代码。

    c++面试集锦

    根据提供的信息,我们可以总结并详细解释与C++面试相关的几个重要知识点。 ### C++面试集锦 #### 一、链表的基本操作 在C++面试中,链表是非常常见的数据结构之一,通常会考察对链表的操作理解以及实现能力。 **...

    C语言编程技巧集锦pdf

    4. **预处理器**:预处理器宏定义(#define)和#include指令是C语言编程的重要部分,它们可以进行条件编译、创建常量和包含头文件。 5. **结构体与联合体**:结构体和联合体允许我们将不同类型的数据组织在一起,...

    java面试问题集锦

    ### Java面试问题集锦 #### 一、运行程序之前: ##### Path与classpath图解 - **Path**:指的是操作系统环境变量中的PATH,它定义了系统查找可执行文件的路径列表。当用户在命令行中输入一个命令时,系统会在PATH...

    c51程序集锦

    4. 宏定义和函数:C51允许使用宏定义(#define)来创建常量和简化的代码,以及函数来封装重复的任务,提高代码的可读性和复用性。 5. 特殊功能寄存器(SFR):8051系列微控制器的许多功能是通过SFR来实现的,如...

    java面试题集锦.doc

    垃圾回收通常分为几种策略,如分代回收、标记-清除和复制算法等。Java的垃圾回收线程在后台运行,开发者无法直接控制何时进行垃圾回收。 4. **线程同步**:Java提供了多种线程同步机制,如synchronized关键字、wait...

    C++ 笔试面试题集锦(找工作必读)

    ### C++ 笔试面试题集锦(找工作必读) #### 1. 求解整数二进制表示中1的个数 ```cpp int func(int x) { int count_x = 0; while (x) { count_x++; x = x & (x - 1); } return count_x; } ``` 这段代码的功能...

    ORACLE编程集锦

    Oracle编程集锦主要聚焦在如何使用TSQL与PL/SQL这两种强大的数据库编程语言进行开发工作。Oracle数据库系统是全球广泛采用的企业级数据库解决方案之一,它提供了丰富的功能和高性能的数据库管理能力。本集锦深入探讨...

    Microsoft.Net常见问题集锦

    26. **列举 ASP.NET 页面之间传递值的几种方式。** - 使用 URL 传递查询字符串参数、ViewState、HiddenField、Session、Application、Cookies 或 Postback。 27. **一列数的规则如下: 1、1、2、3、5、8、13、21、...

    《程序员面试宝典》集锦

    总结来说,文档中的知识点覆盖了C语言编程中的几个重要方面,包括函数参数顺序、if语句中的常量比较、强制类型转换以及运算符优先级。这些知识点都是程序员面试中常见的考察点,深入理解并掌握这些概念对于求职者在...

    富士软通Java面试题

    - **垃圾回收**:了解几种不同的垃圾收集器和垃圾回收策略。 - **调优工具**:JVisualVM、JConsole等JVM监控工具的使用。 9. **设计模式** - **常见设计模式**:单例、工厂、观察者、装饰者、适配器等模式的应用...

    java经典面试2010集锦100题(不看你后悔)

    普通类也可以定义上面四种访问权限,但是通常我们只应用public和default两种访问权限。 题目16:c 程序如下:  abstract class MineBase {  abstract void amethod();  static int i;  } public class Mine ...

    C、C++笔试题集锦(找工作必读)

    共用体是一种特殊的类型,允许几个不同类型的成员共享同一段内存。这意味着: - **内存重用**:所有成员共用相同的内存区域。 - **成员覆盖**:改变一个成员可能会覆盖其他成员的数据。 - **数据对齐**:共用体的...

    Java(达内)面试题集锦

    - 字符串常量池是Java虚拟机用来优化字符串处理的一种机制。 - 当两个字符串字面量相等时,它们指向同一个字符串常量池中的对象。 - 使用 `==` 操作符可以直接比较两个字符串对象是否引用同一个对象。 ### 19. ...

Global site tag (gtag.js) - Google Analytics