项目中的常量是放在接口里还是放在类里呢?

接口只用于定义类型

??当类实现接口时,接口就充当可以引用这个类的实例的类型(type)。因此,类实现了借口,就表明客户端可以对这个类的实例实施某些动作。为了任何其他目的而定义接口是不恰当的。

??有一种接口被称为常量接口(constant interface),亚布妈祖上面的条件。这种接口没有包含任何方法,它只包含静态的final域,每个域都导出一个常量。使这些常量的类实现这个借口,以避免类名来修饰常量名。

// Constant interface antipattern - do not use
public interface PhysicalConstants{
  // Avogadro‘s number
  static final double AVOGADROS_NUMBER = 6.02214199e23;
  // Boltzmann constant
  static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
  //Mass of the electron
  static final double ELECTRON_MASS = 9.109381883-31;
}

常量接口模式是对接口的不良使用。类在内部使用某些变量,这纯粹是实现细节。实现常量接口,这会导致把这样的实现细节泄漏到该类的导出API中。类实现常量接口,这对于这个类的用户来讲并没有什么价值。实际上,这样做反而会使他们更加糊涂。更糟糕的是,它代表着一种承诺:如果将来版本中,这个类被修改了,它将不再需要这些常量了,它依然必须实现这个接口,以确保二进制兼容性。如果非final类实现了常量接口,它的所有类的命名空间也会被接口中的常量所“污染”。

??在Java平台类库中有几个常量接口,例如java.io.ObjectStreamConstants。这些接口应该被认为反面的典型,不值得效仿。

??如果到出常量,可以有集中合理的选择方案。如果这些常量与某个相关的类或者接口紧密相关,就应该把这些常量添加到这个类或者接口中。例如Java平台类库中所有的数值包装类,如Integer和Double,都导出了MIN_VALUE和MAX_VALUE常量。如果这些常量被看成枚举类型的成员,就应该用枚举类型(enum type)来导出这些常量。否则应该使用不可实例化的工具类来导出这些常量。

// Constant utility class
public class PhysicalConstants{
  private PhysicalConstants(){}
  // Avogadro‘s number
  public static final double AVOGADROS_NUMBER = 6.02214199e23;
  // Boltzmann constant
  public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
  //Mass of the electron
  public static final double ELECTRON_MASS = 9.109381883-31;
}

工具类通常要求客户端要用类名来修饰这些常量名,例如PhysicalConstants.AVOGADROS_NUMBER。如果大量利用工具类导出的常量,可以通过利用静态导入(static import)机制,避免用类名来修饰常量名,不过静态导入机制是Java发行版本1.5中才引入的。

??简而言之,接口应该只被用来定义类型,他们不应该被用来导出常量。

时间: 2024-08-03 18:12:38

项目中的常量是放在接口里还是放在类里呢?的相关文章

java web项目(spring项目)中集成webservice ,实现对外开放接口

什么是WebService?webService小示例 点此了解 下面进入正题: Javaweb项目(spring项目)中集成webservice ,实现对外开放接口步骤: 准备: 采用与spring兼容性较好的cxf来实现 cxf 的  jar下载地址: http://cxf.apache.org/download.html 选择zip格式下载,解压后的lib目录下的jar 需要最少的jar如下: cxf-2.3.3.jargeronimo-annotation_1.0_spec-1.1.1.

用于对项目中密码生成MD5摘要和加盐的工具类

import java.security.MessageDigest; /** * 用于对项目中密码生成MD5摘要和加盐的工具类 * @author 彭锋 */ public final class MD5Util { private static final char[] hexadecimal = {'0','1','2','3','4','5','6', '7','8','9','a','b','c','d','e','f'}; /** * 根据指定的字符串,返回对应的MD5摘要结果 *

Maven项目中mvn clean后找不到測试类问题

在Maven项目中进行单元測试,但mvn clean后又一次mvn install项目,再次进行单元測试.会有下面的错误. <span style="font-family:KaiTi_GB2312;font-size:18px;">Class not found com.core.order.service.impl.OrderServiceImplTest java.lang.ClassNotFoundException: com.core.order.service.

web项目中全局常量的添加

1.继承HttpServlet 2.实现init方法 3.在init方法中得到配置文件,然后解析把配置文件中的配置放到servletContext中. 方法如下: public class GlobalInitParam extends HttpServlet{ private static final long serialVersionUID = 1L; @Override public void init(ServletConfig config) throws ServletExcept

java web项目中后台控制层对参数进行自定义验证 类 Pattern

Pattern pattern = Pattern.compile("/^([1-9]\\d+元*|[0]{0,1})$/");//将给定的正则表达式编译到模式中 if(!"".equals(mmshop.getOriginalPrice().trim())){ if(!pattern.matcher(mmshop.getOriginalPrice().trim()).matches()){ map.put("msg","请输入数字或x

android官方技术文档翻译——Case 标签中的常量字段

本文译自androd官方技术文档<Non-constant Fields in Case Labels>,原文地址:http://tools.android.com/tips/non-constant-fields. 本文地址:http://blog.csdn.net/maosidiaoxian/article/details/41574853.转载请注明出处.翻译如有错讹,敬请指正. Case 标签中的常量字段 在正常的 Android 项目中,资源R类里的常量是这样声明的: public 

Android省市区三级联动滚轮选择(真实项目中提取出来的组件)

最近项目要做一个,类似淘宝手机客户端的,选择收货地址的三级联动滚动选择组件,下面是它的大致界面截图: 在IOS中有个叫UIPickerView的选择器,并且在dataSource中定义了UIPickerView的数据源和定制内容,所以用只要熟悉它的基本用法,要实现这么个三级联动滑动选择是挺简单的. 言归正传,今天讨论的是在Android里面如何来实现这么个效果,那么如何实现呢??? 相信部分童鞋首先想到的是android.widget.DatePicker和android.widget.Time

在unity项目中使用live2D,以及Render Texture的简单使用。

好久没有写博客了,前段时间找到了一个二次元手游开发的工作,职位是客户端主程(虽然工资不高就是了),作为个unity新人现在想想还是有点后怕,不过车到山前必有路嘛. 言归正传,这次的项目中用到了live2d,总的来说导入的很顺利,也没碰上什么坑~ 首先这里有对应的教程和sdk下载(需FQ): http://www.live2d.com/usermanual/cubism2_cn/lets-do-it/my-first-lapp.html SDK里包括了几个demo,不要一口气把里面的东西全部拖到u

在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式,虽然Web API或者WCF方式的调用,相对直接连接数据库方式,响应效率上略差一些,不过扩展性强,也可以调动更多的设备接入,包括移动应用接入,网站接入,Winfrom客户端接入,这样可以使得服务逻辑相对独立,负责提供接口即可.这种方式中最有代表性的就是当前Web API的广泛应用,促进了各个接入端