关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »Java中的常量:如何避免反模式

    Java中的常量:如何避免反模式

    2015-09-22 00:00:00 出处:xionghuiCoder
    分享

    在应用中,我们往往需要一个常量文件,用于存储被多个地方引用的共享常量。在设计应用时,我也遇到了类似的情况,很多地方都需要各种各样的常量。

    我确定需要一个单独的文件来存储这些静态公共常量。但是我不是特别确定是应该用接口还是类(枚举不满足我的需求)。我有两种选择:

    使用接口,如:

    package one;
    public interface Constants {
    String NAME="name1";
    int MAX_VAL=25;
    }

    或

    package two;
    public class Constants {
    public static final String NAME="name1";
    public static final int MAX_VAL=25;
    }

    我的观点是使用接口。因为接口会自动将成员变量设置为静态的(static)、不可变的(final),这一点可以防止某些情况下错误地添加新的常量。这也使得代码看起来更简单和清晰。

    同时,一个的简单测试显示,同样的接口(字节码文件)占用的空间是209个字节(ubuntu 14.04机器上),而类(字节码文件)占用的空间是366个字节(同样的操作系统)。更少的字节码文件意味着加载和维护的成本更低。此外,JVM 加载接口的时候,不需要担心类提供的额外特征(如重载、方法的动态绑定等),因此加载更快。

    这看起来非常好,但是这是一个典型反模式的例子。虽然使用接口来保存常量看起很有帮助,但是这给应用后期的扩展留下一个漏洞。

    假设存在在一个类,紧密】依赖于这些常量。开发者在该类中写满了通过接口对常量的引用。如:

    packagename.Constant.CONSTANT_NAME

    所以,为了“清理”这段代码,他可能想实现该接口,这样他就不需要到处写“packagename.Constants”,所有的常量可以直接访问。

    但是,一旦他实现了该接口,所有的常量就都变成“契约”(因为所有的常量都是公共的、静态的)的一部分。这导致为这个类增加了不必要的常量。这会动摇整个基础,并引起混乱。Java 中没有一种方式可以阻止类实现接口。

    而另一种方式,我们可以将类设置为final,这样就不能扩展。甚至,我们可以将构造器设置为私有的,以防止对这个类实例化,这样就永远不会破坏约定。此外,如果一个特殊的常量在同一个类中被多次使用,则开发者可以使用静态引入。

    所有对于常量类,比较好的设计应该是:

    package three;
    //make the class non-extendable by adding final 增加final关键字来避免继承
    public final class Constants {
    //Hide the constructor 隐藏构造器
    private Constants(){}
    public static String NAME="name";
    }

    静态引入的例子:

    import static three.Constants.NAME;
    public class UseConstants {
      public static void main(String[] args) {
          System.out.println("the value of constants is"+NAME);
      }
    }

    这个设计问题也称为接口常量反模式(Constant Interface Anti-pattern)。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    小米路由器买哪款?Miwifi热门路由器型号对比分析

    IT头条

    Synology 对 Office 套件进行重大 AI 更新,增强私有云的生产力和安全性

    01:43

    StorONE 的高效平台将 Storage Guardian 数据中心占用空间减少 80%

    11:03

    年赚千亿的印度能源巨头Nayara 云服务瘫痪,被微软卡了一下脖子

    12:54

    国产6nm GPU新突破!砺算科技官宣:自研TrueGPU架构7月26日发布

    01:57

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    技术热点

    最全面的前端开发指南

    Windows7任务栏桌面下角的一些正在运行的图标不见了

    sql server快速删除记录方法

    SQL Server 7移动数据的6种方法

    SQL Server 2008的新压缩特性

    每个Java程序员必须知道的5个JVM命令行标志

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。