interface还是final class?还是enum?
- 很久没老老实实写过技术的博客了,最近事情很多很杂也很乱,很难沉下心去做一件事情,最终找到一个合理的答案,懒!原本我是计划今年写满100篇博客的,因为各种“懒”,呵呵了,估计又要成为明年的计划了。。。。。。?,言归正传
最近无论是在写代码和看别人代码的时候,经常看见各种常量的定义,有很简单粗暴的硬编码,也有接口,枚举各种百花齐放,充分体现我等高超技艺,花式代码,但是怎么说呢,首先
- 除非作死,千万别硬编码,review代码首先你过不了,其次,代码难维护,害自己也可能害接手你代码的人
- interface
public interface Const {
Integer PAGE_SIZE = 10;
}
写个接口定义常量总可以吧。看起来似乎不错,但是似乎错了interface的本质,我们通常定义api才去用接口,而不是为了方便。而且,也不是那么方便,比较,如果你取名不形象,生动,直观…那你注释也少不了。这些还不是最主要的,既然是接口,然后就允许有子接口和类去实现,那问题来了,那天我不小心把最上层的内容改了,这些子类或者字接口不是也要去改吗?有个资料把这种方式修饰成“poor use”,不推荐使用。
- final class
public final class Const {
private Const() {
}
public static final String SUCCESS="成功";
public static final String FAILURE="失败";
public static final String EXCEPTION="异常";
}
个人觉得这种方式还是不错的,首先这个“鸡肋”是不能被继承的,然后有个私有的构造函数,那么别人也不能去实例化该类,常量都是static final 去修饰,static 强调只有一份,final 说明是一个常量,你该懂的它的含义了吧。
-Enum
public class Constants {
private Dict(String value,String name){
this.value=value;
this.name=name;
}
private final String value;
private final String name;
public String getValue() {
return value;
}
public String getName() {
return name;
}
}
写法比上面稍微复杂了点,但是用起来还是不错的,而且可以根据你的业务需求创造出适合你的枚举,比较好。
最后两种,很难说哪个好,那个坏,适合当前业务需求我觉得才是最好的,前两种还是谨慎使用
如果是定一个什么单个字符常量什么的,我觉得第三种不错,如果是经常有什么status,type的这种,我觉得enum会更好。
既然今天都说了interface,那么,下次做一个老生常谈的话题,interface和抽象类专访。