为什么用接口存常量是一种不良的习惯

xiaoxiao2021-02-28  71

前言

因为准备考研好久没有更新博客了。今天软件工程实践的项目中,有一个小组成员在项目中使用了接口来存常量。 故来讨论一下为什么用接口存常量是一种不良的习惯!

正题

为什么会用接口存放常量呢? 首先接口不能实例化,并且使用接口中定义的常量可以用接口名直接调用。

public interface InfoInterface { //查询提示 public String SUCCESS="查询成功"; public String FAILURE="查询失败"; public String EXCEPTION="查询异常"; } //访问方式 InfoInterface.SUCCESS

什么是反模式? 反模式是指用来解决问题的带有共同性的不良方法。它们已经经过研究并分类,以防止日后重蹈覆辙,并能在研发尚未投产时辨认出来。 通俗来说就是大家约定都不要用的方法。

接口存常量就是一种反模式

接口中一般都是定义API,而常量不是API。

如果在实现类或子接口中也定义了同名的常量,则通过父,子接口(或实现) 去引用常量是可能不一致的

// 实现类 public class InfoInterfaceImpl implements InfoInterface{ //插入提示 public String SUCCESS="插入成功"; public String FAILURE="插入失败"; public String EXCEPTION="插入异常"; } //子接口 public interface SubInfoInterface extends InfoInterface{ //插入提示 public String SUCCESS="插入成功"; public String FAILURE="插入失败"; public String EXCEPTION="插入异常"; }

则下面的两种访问结果不一致:

//第一种 InfoInterfaceImpl infoInterfaceImpl =new InfoInterfaceImpl(); InfoInterface infoInterface =new InfoInterfaceImpl(); System.out.println(infoInterfaceImpl.FAILURE); //插入失败 System.out.println(infoInterface.FAILURE); //查询失败 //第二种 System.out.println(SubInfoInterface.FAILURE); //插入失败 System.out.println(InfoInterface.FAILURE); //查询失败

注:个人理解是这样,欢迎在评论区批评指正。

由于被实现或继承,造成在继承树中可以用大量的接口、类或实例去引用同一个常量,从而造成接口中定义的常量污染了命名空间。

ps:不是很理解 接口中定义的常量污染了命名空间!!!希望大神mark一下!

正确规范的常量定义

public final class PrintInfoUtils { private PrintInfoUtils() { } public static final String SUCCESS="查询成功"; public static final String FAILURE="查询失败"; public static final String EXCEPTION="查询异常"; }

其中:

class的类型为final,表示该类是不可以继承的;定义了一个私有的构造函数,避免实例化该类;常量的类型为public final static;

参考

https://my.oschina.net/gschen/blog/134794https://unmi.cc/java-constant-interface-anti-pattern/
转载请注明原文地址: https://www.6miu.com/read-66982.html

最新回复(0)