Java Interface 是常量存放的最佳地点吗?
日期:2007年6月29日 作者: 查看:[大字体 中字体 小字体]-
由于java interface中声明的字段在编译时会自动加上static final的修饰符,即声明为常量。因而interface通常是存放常量的最佳地点。然而在java的实际应用时却会产生一些问题。
问题的起因有两个,第一,是我们所使用的常量并不是一成不变的,而是相对于变量不能赋值改变。例如我们在一个工程初期定义常量∏=3.14,而由于计算精度的提高我们可能会重新定义∏=3.14159,此时整个项目对此常量的引用都应该做出改变。第二,java是动态语言。与c++之类的静态语言不同,java对一些字段的引用可以在运行期动态进行,这种灵活性是java这样的动态语言的一大优势。也就使得我们在java工程中有时部分内容的改变不用重新编译整个项目,而只需编译改变的部分重新发布就可以改变整个应用。
讲了这么多,你还不知道我要说什么吗?好,我们来看一个简单的例子:
有一个interface A,一个class B,代码如下:
//file A.java
public interface A{
String name = "bright";
}
//file B.java
public class B{
public static void main(String[] args){
System.out.println("Class A's name = " + A.name);
}
}
够简单吧,好,编译A.java和B.java。
运行,输入java B,显然结果如下:
Class A's name = bright
我们现在修改A.java如下:
//file A.java
public interface A{
String name = "bright sea";
}
编译A.java后重新运行B class,输入java B,注意:结果如下
Class A's name = bright
为什么不是"Class A's name = bright sea"?让我们使用jdk提供的反编译工具javap反编译B.class看个究竟,输入:javap -c B ,结果如下:
Compiled from B.java
public class B extends java.lang.Object {
public B();
public static void main(java.lang.String[]);
}
Method B()
0 aload_0
1 invokespecial #1
4 return
Method void main(java.lang.String[])
0 getstatic #2
3 ldc #3
5 invokevirtual #4
8 return
注意到标号3的代码了吗?由于引用了一个static final 的字段,编译器已经将interface A中name的内容编译进了class B中,而不是对interface A中的name的引用。因此除非我们重新编译class B,interface A中name发生的变化无法在class B中反映。如果这样去做那么java的动态优势就消失殆尽。
解决方案,有两种解决方法。
第一种方法是不再使用常量,将所需字段放入class中声明,并去掉final修饰符。但这种方法存在一定的风险,由于不再是常量着因而在系统运行时有可能被其他类修改其值而发生错误,也就违背了我们设置它为常量的初衷,因而不推荐使用。
第二种方法,将常量放入class中声明,使用class方法来得到此常量的值。为了保持对此常量引用的简单性,我们可以使用一个静态方法。我们将A.java和B.java修改如下:
- [1] [2] 下一页
- Java Interface 是常量存放的最佳地点吗? 相关文章:
- ·免费领养QQ空间五级花最新技巧及代码放送
- ·官方下载:XP SP3最新测试版
- ·下载:Opera 9.25最终正式版
- ·C#实现窗口最小化到系统托盘
- ·QQ空间导航代码最新版使用方法
- ·Vista12个最实用操作技巧的基础课
- ·将最广泛的网络安全功能整合在一个系统中
- ·Linux和Windows系统升级的最大不同
- ·最大限度优化博客文章
- ·卡巴斯基发布8.0版最新特性(附下载)
- Java Interface 是常量存放的最佳地点吗? 相关软件
- ·浴血魔兽3 最后的英雄
- ·商界成功者最推崇的成事法则:先做人后做事
- ·《魔兽世界》最新的场景宣传片
- ·《最高指挥官》3254最新8项属性修改器
- ·《变速齿轮》最新升级版
- ·最高指挥官:虚伪联盟E3宣传片
- ·X360《剑豪 ZERO》最新视频画面
- ·《终极格斗2009》最新游戏视频公开
- ·《吉他英雄III》最新精彩游戏视频公布
- ·《Railfan台湾高铁》最新高清视频
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
精品推荐
热点TOP10
- ·JAVA教程 第五讲 AWT图形用户界面设计
- ·SP 短信开发-基础知识篇
- ·使用JAVAMAIL发邮件的一个例子(转)
- ·J2ME蓝牙程序开发实战入门
- ·用Java实现音频播放
- ·精通必学:Eclipse快捷键指南
- ·用Java实现SMTP服务器
- ·使用SimpleDateFormat必须注意的问题
- ·Java基础:你是否了解KVM的常量池
- ·关于EJB调用原理分析
- ·Java语言数据库操作的基本流程
- ·Leopard新问题 不能用最新版Java
- ·Sun:JavaFX Mobile和JavaFX Script
- ·Java EE6提案的两大主题:拓展性和概要
- ·Java会因为RoR的流行而过时吗?
- ·Java资料:Swing中的事件处理详细资料
- ·Java知识:Web应用下实现定时任务简便方法
- ·技巧:Java中用动态代理类实现记忆功能
- ·新手入门:写Java程序的三十个基本规则
- ·入门:Java初学者入门要注意的基础知识
特别推荐
- ·Java精华积累:初学者都应该搞懂的问题
- ·Java多媒体框架设计自动播放机实例详解
- ·如何有效防止Java程序源码被人偷窥?
- ·Cell插件在J2EE系统中的应用
- ·初学者想学Hibernate,初级基础教程
- ·Java语言实现支持视频点播的WEB服务器
- ·关于Java编程的中文问题的几条分析原则
- ·确保J2ME无线移动商业应用程序的安全性
- ·Java开源技术:Eclipse的使用技巧详解
- ·新手入门:Java中的修饰词使用方法总结
- ·JAVA开发者应该去的20个英文网站
- ·使用JDBC创建数据库访问程序
- ·JDK的命令详解
- ·Java学习从入门到精通(附FAQ)
- ·Tomcat性能调整
- ·JSF:Java中面向Web开发的生旦净末丑
- ·对Java语言入门初学者的一些建议
- ·Java技术的新方向
- ·Jive源代码研究
- ·谨慎使用Date和Time类
