- 浏览: 83743 次
- 性别:
- 来自: 北京
最新评论
-
hkliya:
itway 写道非常感谢,谢谢不客气,有用就好。另外,博客已转 ...
adsl拨号命令 -
itway:
非常感谢,谢谢
adsl拨号命令 -
just_zx:
Linux下最好的开源查字字典:Openyoudao Ope ...
使用linux下的词典StarDic -
wangheid:
Mybeautiful 写道下半年将5公里控制在20分钟内。
...
程序员要锻炼好身体 -
Mybeautiful:
下半年将5公里控制在20分钟内。已经相当快了啊,速度是 6.6 ...
程序员要锻炼好身体
事出有因:
农历xx月xx日,是一个特别的日子,因为用户发邮件说:要将上传附件的大小从原来的5MB提高到10M。
这是多么简单多么合理的一个小变更,处理起来是多么的easy...
在代码中,我们是将这个数字定义为常量的:
public static final long MAX_SIZE = 5 * 1024 * 1024;
那修改也很简单,将5改成10即可。
但是当我们将新的class替换到系统上时,发现没有生效,再替换,还是不生效...
就在西二旗城铁站晚高峰快要结束的时候,突然,我灵光一闪,仿佛领悟到了什么,遂将引用这个常量的类也重新编译并替换到生产系统,It works!
由此我推测是因为编译器在编译时会对常量进行优化,将其替换为实际的值……
柳暗花明:
为了验证我的想法,我写了两个类来测试,
T1.java
T2.java
然后我编译,执行,删除T2.class,再执行。
有点出乎意料啊,和预想的结果并不一致……
就在二路汽车快要收工的时候,突然,我灵光又一闪,仿佛又领悟到了什么,遂将 Long 改成 long:
再次编译,执行,删除T2.class,再执行:
It works again!
后来又测试了int, Integer, double, Double, String等类型,
并且使用javap -c T1查看反编译结果发现:
编译器在编译时会对基本数据类型和String类型进行优化。
最佳实践:
当系统在线上运行时,如果需要修改某个的常量值(基本类型或String类型),那么引用该常量的所有class都应当重新编译。换句话说:如果A类中使用了B类中的常量(基本类型或String类型),那在系统运行的过程中,你删除掉B.class,不会影响系统的使用。
所以如果你不想在后期维护时这么麻烦的话,最好定义变量时使用包装类(Long, Integer等),或者换一种设计方式。
比如原来的代码是这样:
HttpUtil类中有一个保存附件的方法
public class HttpUtil { public static final long MAX_SIZE = 5 * 1024 * 1024; public static void saveFile(HttpServletRequest req, long maxSize) {...} }
在别的模块如信息发布中有上传附件的功能,会调用HttpUtil的保存文件方法
因为没有对附件的特殊限制,所以使用默认的MAX_SIZE即可:
… HttpUtil.save(req, HttpUtil.MAX_SIZE); …
这样的代码就存在前面提到的问题,如果修改常量值就需要重新编译引用常量的类。
但我们可以换一种方式,
在HttpUtil类中增加一个重载方法:
public static void saveFile(HttpServletRequest req) { saveFile(req, MAX_SIZE); }
这样在别的模块需要上传附件并且仅使用默认文件大小限制的时候,就可以调用这个方法。
好处就是现在你再修改MAX_SIZE的值,只需要编译这一个类就可以了。
评论
是在编译过程中做了解箱吗? 不然按您后来的逻辑应该成功才对。。。
看到最后就这点困惑。。。呵呵
有收获
谢谢,看的很认真呢。
前面是我写错了,应该是long而不是Long
是在编译过程中做了解箱吗? 不然按您后来的逻辑应该成功才对。。。
看到最后就这点困惑。。。呵呵
有收获
但是您提到用包装类去实现常量的功能,我真的不建议这样做,因为仅仅为了一个常量问题增加额外的对象在堆上没有太多必要,效率不高;以上个人意见...
另外我也有赶西二旗地铁的习惯,呵呵呵...
谢谢,有道理,我们也通常是写到properties文件中的,但没做内存和文件的同步。
其实这种配置写到数据库也行,用户量不大,上传文件操作不频繁的情况下。
但是您提到用包装类去实现常量的功能,我真的不建议这样做,因为仅仅为了一个常量问题增加额外的对象在堆上没有太多必要,效率不高;以上个人意见...
另外我也有赶西二旗地铁的习惯,呵呵呵...
不是的,编译完就删除掉T2.class,T1一样能运行
通过反编译也能看出来
发表评论
-
谨慎地使用第三方代码
2012-06-28 11:41 991需求 《Clean Code》 ... -
谨慎地使用第三方代码
2012-06-28 11:32 1需求 《Clean Code》一书中有一章专门讲如 ... -
使用jacobe格式化java代码
2011-03-29 06:04 1575安装: 1、将插件解压缩,将 jar 包扔到 e ... -
Windows环境下用jwplayer+Nginx搭建视频点播服务器
2011-03-07 15:32 6187flv 视频可以采用两种方式发布: 一、普通的 ... -
由Autoboxing\unboxing(自动装包\拆包)引起的问题
2010-12-16 21:52 869在工具类 HttpUtil 中有一个方法,它的返回 ... -
sqlserver企业管理器修改记录时提示“在流水模式下,事务无法启动”的解决办法
2010-09-20 09:34 721右键-》最后一个,也就是把整个表的数据全部查出来后就可以保存了 ... -
subclipse导致eclipse jvm崩溃
2010-09-01 22:40 1014今天遇到一个奇怪的现象,在myeclipse里打开关闭的项目时 ... -
网站变黑白只要一行css代码
2010-03-25 16:22 1636最简洁的把页面变成灰色的代码是在head 之间加 <st ... -
asp取当前url
2010-01-05 14:36 1260http://<%=Request.ServerVari ... -
为什么不动手试一下
2009-12-29 10:17 706我幼稚地认为datediff函数只是单纯的把时间的各部份拿出来 ... -
win下也要注意大小写
2009-12-21 09:20 707昨天写了一个swing程序,在myeclipse里边运行没有问 ... -
Myeclipse下使用Code Folding插件来进行代码折叠
2009-12-01 17:22 2640插件地址:http://eclipse.realjenius. ... -
myeclipse注册机算法
2009-11-29 09:20 791import java.io.BufferedReader; ... -
Date和String不能乱转
2009-11-10 17:22 790使用DateFormat类parse或format的时候,最关 ... -
Java条件操作符的小发现
2009-11-09 21:50 659突然发现在jdk1.4以前,三元操作符的“冒号”两边必须是同种 ... -
junit只运行某一方法
2009-10-21 15:01 814在Package Explorer中选择测试类,点击测试类左边 ... -
tomcat配置虚拟主机的两种方法
2009-10-15 14:18 803tomcat配置虚拟主机有两种方法: 1. <Hos ... -
myeclipse里启动tomcat变得贼慢的原因
2009-09-28 13:35 2047突然发现,从myeclipse里启动tomcat6变得很慢 ... -
动态加载flash问题
2009-09-21 16:20 1003用js往div里插入添加flash的代码时,在ie6上不知 ... -
hibernate分页代码
2009-09-18 17:42 879public String getLimitString(S ...
相关推荐
易语言 常量支持库.fne 常量支持库 常量支持库 常量支持库 常量支持库
15353个常量支持库.rar 精易教程
常量指针是指--指向常量的指针,顾名思义,就是指针指向的是常量,即,它不能指向变量,它指向的内容不能被改变,不能通过指针来修改它指向的内容,但是指针自身不是常量,它自身的值可以改变,从而指向另一个常量。
第五章 数据查询 常量、变量 课程目标 常量 1.字符串常量 字符串是指用单引号或双...一个十六进制值通常指定为一个字符串常量,每对十六进制数字被转换为一个字符,其最前面有一个大写字母“X”或小写字“x”。 4.日
vc++ 键盘按键的虚拟常量。vvc 键盘虚拟常量vc 键盘虚拟常量
ListView Messages (LVM_)ListView控件类的消息常量常量
程序中用#define命令定义一个标识符代替一个常量,这个标识符被称为符号常量。这个符号常量的值在其作用域内不能被改变,也不能被重新赋值。如: #define PI 3.1415926 另外,习惯上,符号常量用大写字母表示,变量...
在C/C++的学习中,有人经常搞不清楚“常量指针”和“指针常量”这两个概念。其实简单一点讲,“常量指针”所指向的地址上的数据是常量,而“指针常量”所指向的地址是常量,地址上面的数据是可以变化的。
在C#中定义常量的方式有两种,一种叫做静态常量(Compile-time constant),另一种叫做动态常量(Runtime constant)。前者用“const”来定义,后者用“readonly”来定义。 对于静态常量(Compile-time constant),...
6万多个api常量,消息常量,非常全,txt格式 .
常量指针和指针常量的区分,如果有人需要,可以下载看看,如果有误,请帮忙改正!谢谢!
windows API常量查询,windows API常量查询windows API常量查询windows API常量查询windows API常量查询
ThinkPHP系统常量,好东西就是拿出来分享。
常量 变量 详细实例代码 常量 变量 详细实例代码常量 变量 详细实例代码常量 变量 详细实例代码常量 变量 详细实例代码常量 变量 详细实例代码
易语言常量查询器源码,常量查询器,载入常量列表,是否为数值,删除所选项,读入文件到列表框,写列表框到文件
java 常量与变量 java 常量与变量
关于glsl常量整理
API常量表 宏 常量值 常量名 各种的常量 方便各种语言使用 C C++ C#
易语言常量支持库源码,常量支持库
VB 常量做实参举例 VB 常量做实参举例