Java中定义常量几种方式

在开发中定义常量是很常见的事,但常量定义有哪几种方式可选?各种定义方式有什么优缺点?咱们就用这篇小文来梳理下^_^


1.通过接口Interface来定义(不推荐)

定义方式如下:

我们可以这样使用它:

这种定义方式的优点:

适合懒人使用,为什么呢?

我们知道,在interface中定义的常量默认是public static final类型的。所以我们定义String SUMMER = "Summner";的时候,就相当于默认加了public static final前缀,意思与public static final String SUMMER = "Summer";等价。

在接口中定义常量,可以免去加public static final几个单词,少敲几次键盘,但可以达到同样的效果。嗯,是挺方便的。

但是不推荐这种方式。张罗了几个原因,如下:

1)Java中设计出接口这种语法,就是为了用来实现或者继承的,如果我们在实现类或者子类接口中定义了同名的常量,那么子类接口或者实现类引用同名的常量,就可能不一致。是不是很容易造成混乱。

2)与接口的定义不相符,接口是一种规范,一种协议规定,主要用来定义必须要实现的API。用接口来定义常量,与创造接口的目的不相符,也有点杀鸡用牛刀,大财小用。

3)在interface中定义的常量属于编译型常量,每次更改常量值,都要重新编译所有引用到它的类。

举个小例子,我们将SUMMER常量更改为"Summer_Great"。编译Season后,我们看到接口Season中的SUMMER已经更改。

但是Test中的Season.SUMMER还是原值"Summer",没有改变,必须重新编译Test.java才行。


2.通过常量类来定义

我们知道一个类如果允许被继承,那么它定义的常量就有可能被子类覆盖,子类如果定义了同名的常量,就会造成子类和父类对同一个常量的定义不同,很容易造成困惑。所以呢,如果将一个类定义为常量类,那么这个类就不能允许被继承。所以呢,我们就有了以下两种定义常量类的方式。

1)将常量类定义为final类

2)将构造函数私有化

我们可以这样使用它:

这种方式最常用,但这种定义也是编译型常量,如果更改常量值的话,还是需要重新编译所有引用类。


3.增加static方法的常量类

那么怎么解决编译型常量这个问题呢?增加static方法。

我们可以这样使用它:

这样,如果改变了常量定义,只需要重新编译一下Season.java即可。

4.使用枚举类enum(推荐)

定义方式如下:

我们可以这样使用它:

枚举类限定了季节只能有春夏秋冬,不会引入其他什么季节,很安全;再者enum天生不允许被继承的,非常适合用作常量类。

时间不早了,该睡觉了,今天先讲到这儿了,下周继续开讲^_^。


  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值