关于java常量的踩坑总结

Posted Javachichi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于java常量的踩坑总结相关的知识,希望对你有一定的参考价值。

1、背景

在我的日常工作中,时隔几日就会进行一次发版,来解决生产环境遇到的各种bug和优化,但是由于一些日积月累的原因,更新某些项目时,不可以对jar包进行整包替换,通常都是以包内的class单个替换,尽量让这套年迈的系统能够多挺些时日,但是在一次发版过程中,遇到了一点点小问题,我们只修改了常量类,所以当时只更新了这一个类,在测试过程中发现修改内容未生效,经过一番排查后发现是因为常量实用不当引发的问题,下面就针对这次踩坑的经历,讲一下java中的常量以及避坑的措施。

2、什么是常量

常量是指在整个操作过程中其值保持不变的数据,通常在命令或程序中直接给出其值,用做常量的数据类型有数值型、字符型、日期型、逻辑型和货币型等类型。

3、java中的常量

在Java语言中,主要是利用final关键字来定义常量,通常我们会以public static final 来修饰(编译时常量)。

 package com.kevin.test01;

    public class Const {
      public static final String sun = "SUN";
      public static final String supperFileType = "exe;jar;class";
    } 

4、实例调试

我们先写一个常量使用的一个实例

package com.kevin.test01;

public class Const {
	 public static final String sun = "SUN";
         public static final String supperFileType = "exe;jar;class";
} 
package com.kevin.test01;

public class Common {
	public static void main(String [] args){
		StringBuffer txt = new StringBuffer();
		txt.append("支持的文件类型");
		txt.append(Const.supperFileType);
		System.out.println(txt.toString());
	}
} 

运行结果如下:

image.png

我们通过反编译工具jd-gui来反编译这2个class,来看看被编译后的内容是什么样的

如果你觉得自己学习效率低,缺乏正确的指导,可以加入资源丰富,学习氛围浓厚的技术圈一起学习交流吧!
[Java架构群]
群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的JAVA交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

先看看Const类的内容,这里没什么问题。

image.png

我们再看看引用常量的Common类,我们发现反编译后,在引用常量的地方竟然不是常量名称,而是常量的值,如果我们在代码中有很多地方以这种方式引用常量的话,那就只能对jar包进行整包更新了,而且也增加里出现其他问题的风险,那么怎么规避在无意中挖了这种坑或者踩了这种坑呢。

image.png

5、关于常量使用的建议之一

1、在引用常量时不要直接引用常量名,而是再常量类中加入get方法。

package com.kevin.test01;

public class Const {
	 static final String sun = "SUN";
	 static final String supperFileType = "exe;jar;class";
	 public static String getConst(String constName){
	    switch(constName){
	    	case "sun" :
                    return sun;
		case "supperFileType":
                    return supperFileType;
	    	default: 
                    return null;
	    	}
	    }
} 

在需要引用常量的地方,我们直接用常量类中的静态方法获取

package com.kevin.test01;

public class Common {
	public static void main(String [] args){
		StringBuffer txt = new StringBuffer();
		txt.append("支持的文件类型");
		txt.append(Const.getConst("supperFileType"));
		System.out.println(txt.toString());
	}
} 

以下是反编译后的内容,

image.png

image.png

反编译后,我们看到引用常量的地方,不再是常量值,而是调用了静态方法,这种方式就可以完美的避开直接引用带来的诸多不确定性问题,还有很多非常好的方法,等后续更文再仔细讲述。

最后

粉丝福利:以下是Java面试1—到5年以上开发必问到的面试问点,也都是一线互联网公司Java面试必备技能,下面是参照阿里年薪50W所需具备的技能图,大家可以参考下!
在这里插入图片描述

同时针对这12个技能,我在这整理了一份Java架构进阶面试专题PDF文档(含450题解析,包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发,设计模式,MySQL等知识点解析,内容丰富,图文结合!)

蚂蚁金服Java研发岗三面:MySQL+秒杀+Redis+JVM等(终获offer)
这份专题文档是免费分享的,有需要的朋友可以看向下面来获取!!

需要完整版文档的小伙伴,可以一键三连,下方获取免费领取方式!
在这里插入图片描述

以上是关于关于java常量的踩坑总结的主要内容,如果未能解决你的问题,请参考以下文章

RxDB:indexedDB的踩坑之路

关于[JS] forEach循环return无法跳出的踩坑和解决方案

webpack 1.x升级过程中的踩坑总结大全

关于vue+axios上传文件的踩坑分析

Java项目生产环境部署,遇到FTP连接加密服务器的踩坑及爬坑过程

关于黎曼几何初学者的踩坑经历