51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3224|回复: 0
打印 上一主题 下一主题

关于java常量的踩坑总结

[复制链接]
  • TA的每日心情

    2021-6-10 16:09
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2021-7-7 15:33:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    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());
            }
    }
    运行结果如下:



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

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



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



    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());
            }
    }

    以下是反编译后的内容,





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

    最后小编在学习过程中整理了一些学习资料,可以分享给做软件测试工程师的朋友们,相互交流学习,需要的可以加入我的学习交流群 323432957 或加微dingyu-002即可免费获取Python自动化测开及Java自动化测开学习资料(里面有功能测试、性能测试、python自动化、java自动化、测试开发、接口测试、APP测试等多个知识点的架构资料)
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-18 21:44 , Processed in 0.060602 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表