2012-07-11 29 views
2

如果我有一个简单的标记接口(不包含方法),其中包含在我的应用程序中使用的常量,导入接口的类和实际实现接口之间是否有区别?标记接口,实现与导入

接口:

public interface MyConstants { 
    String constant1 = "constant1"; 
    String constant2 = "constant2"; 
} 

实现:

public class MyClass implements MyConstants { 
    public MyClass(){ 
     System.out.println(constant1); 
    } 
} 

导入:

import common.constants.MyConstants 
public class MyClass { 
    public MyClass(){ 
     System.out.println(MyConstants.constant1); 
    } 
} 
+3

这是*常数界面*工作中的反模式。 – 2012-07-11 14:20:34

+0

这不是标记接口,而是一个常量接口。 – 2012-07-11 14:23:24

+0

更不用说,如果你想要方便的,非范围的访问,你总是可以使用静态导入。我会说,简单地实现一个接口来获取常量是不好的形式。 – Matt 2012-07-11 16:58:57

回答

3

实施这将是一个反模式:

在Java编程语言,不断接口模式 描述了使用界面的单独定义常量和 有类实现,以便接口实现方便的 句法访问这些常量。然而,由于常量只是一个实现细节,并且一个类实现的接口是其导出的API的一部分,所以这种做法相当于 将实现细节放入API中,这被认为是 不适当。 [1] [2]一般来说,将系统常量收集为与行为无关的类,可能会创建一个不良的面向对象的设计,因为它往往是内聚性较低的标志。对于这些 原因,实现常量接口被认为是反模式 。

http://en.wikipedia.org/wiki/Constant_interface

以及有关标记接口,你可以检查它here

1

我只会把它称为一个标记接口,如果打算真正马克类作为有一个特定的财产,在这种情况下,他们必须我修复instanceof检查工作的接口。如果它只是作为常量的一个方便位置,那么我不会将它称为标记接口,并且我也不会有任何类实现它,因为它会为实现类的公共面添加一些东西,这只是一个实现细节。