final与static 的慎用

版权声明:喜欢可以转载,但是必须注明出处。技术要分享,专利要维护。 https://blog.csdn.net/wzcyamadie/article/details/88893680

##情景再现
原来代码这样的,我想根据 “nowTime ”的值,来执行不同的内容。

private final int nowTime = Integer.parseInt(new SimpleDateFormat("HH").format(new Date()));

public IntegralResult sendMessage() {	
	if( nowTime > 19 ){
		***
	}else if ( nowTime > 12 ){
		***
	}else if ( nowTIme > 6 ){
		***
	}
	......
}

结果并不如我意。结果经常不能正确的进入相应的 i f语句。

最后查出原因。是定义nowTime 的问题。使用了 final 。
final修饰的字段,在运行时被初始化得到值。也就是项目齐时候,这个值已经确定了,而且不可更改了。
所以,项目启动时间决定了我的 nowTime时间,而不是我想得到的结果:这个方法执行的时候,才拿到这个 nowTime 。

##解决方案:
把定义final的语句,放在方法里,不使用final。如下:

public IntegralResult sendMessage() {	
	int nowTime = Integer.parseInt(new SimpleDateFormat("HH").format(new Date()));
	if( nowTime > 19 ){
		***
	}else if ( nowTime > 12 ){
		***
	}else if ( nowTIme > 6 ){
		***
	}
	......
}

##拓展:
final修饰的字段在运行时被初始化,可以直接赋值,也可以在实例构造器中赋值,赋值后不可修改。
static修饰的字段在加载过程中准备阶段被初始化,但是这个阶段只会赋值一个默认的值(0或者null而并非定义变量设置的值)初始化阶段在类构造器中才会赋值为变量定义的值。

static final修饰的字段在javac编译时生成comstantValue属性,在类加载的准备阶段直接把constantValue的值赋给该字段。
可以理解为在编译期即把结果放入了常量池中。

final 修饰的变量为常量一旦赋值不能修改,
被修饰的方法为最终方法不能被重写,
被修饰的类是最终类,不能被继承

static 修饰的变量和方法,为该整个类及其类的对象所共享,一个类或对
象修改了被定义的类或方法,其他的也会跟着变量。。这就是说被static修饰的
是大家共用的。。

猜你喜欢

转载自blog.csdn.net/wzcyamadie/article/details/88893680