如何在没有实现的情况下将枚举公开给公共API?

时间:2014-01-24 08:57:33

标签: java api enums api-design

我有一个类,其类型为Enum。例如:

enum CarType {
    TOYOTA("Japan"),
    AUDI("Germany"),
    BMW("Germany");

    public final String country;
    private CarType(String country) { this.country = country; }
}

class Car {
    private CarType type;
    public CarType getType() { return type; }
}

Car是库的一部分,我想公开它的功能,所以我创建了一个接口,它将成为公共API的一部分,让类Car实现它:

interface ICar {
    CarType getType();
}

class Car implements ICar {
    private CarType type;
    @Override public CarType getType() { return type; }
}

这种方法的问题在于,这需要发布整个CarType枚举。 CarType枚举可能包含我不想公开/发布的其他属性和方法(在此示例中为country)。

如果我想隐藏CarType的实现,我还能做什么,但我仍然希望以某种方式公开可能的值(声明的枚举值),以便API用户可以在{{1}中引用它们像这样的switch语句:

if

制作其他属性和方法ICar car = ...; // Get an instance somehow. if (car.getType() == CarType.TOYOTA) System.out.println("It's Toyota."); protected不是一个好的解决方案,因为那时库的其他部分也无法引用它们。

如果我想继续使用枚举,是否有任何可行的替代方法?

4 个答案:

答案 0 :(得分:1)

您可以为公共API提供Enum,并将其转换为另一个Enum以供私人使用 例如。使用Map,其中key是public Enum instance和value - private Enum instance 问题是每次调用API时都必须转换数据。可能需要在很多地方进行更改。

答案 1 :(得分:1)

虽然已故的人想加我的想法 -

枚举也可以实现一个只显示需求详细信息的界面:

 public enum CarType implements ICarType {
     ...
      public String getTypeName(){
        return name();
      }
   }

   public interface ICarType {
      public String getTypeName();
   }

因此,您计划在if()/ switch

中使用它
  ICarType carType; //Not referencing the enum

  if("TOYOTA".equalsIgnoreCase(carType.getTypeName())){
     print("Toyota....");
  }

答案 2 :(得分:0)

protectedprivatepackage-private是您提供的主要工具。如果你对类的层次结构有足够的考虑,你可以用它们做点什么。

你应该考虑组成。拥有TypeDetails课程,并让CarType的每个成员都包含TypeDetails成员。然后,您可以将TypeDetails getter的访问权限仅限于那些应该访问它的人,同时TypeDetails本身对您库的所有部分都可见。

答案 3 :(得分:0)

如果必须将country属性隐藏到用户代码,则可以获得标准可见性(未使用publicprotectedprivate限定符声明的属性,这些属性只对同一包中的类可见。我希望这有用,但我知道这只是一个补丁。

无论如何,我无法完全理解您的设计和必需品,所以可能您没有其他选择,但如果您想保护代码免受API滥用,可能需要重新设计并考虑封装