我有一个类,其类型为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
不是一个好的解决方案,因为那时库的其他部分也无法引用它们。
如果我想继续使用枚举,是否有任何可行的替代方法?
答案 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)
protected
,private
和package-private
是您提供的主要工具。如果你对类的层次结构有足够的考虑,你可以用它们做点什么。
你应该考虑组成。拥有TypeDetails
课程,并让CarType
的每个成员都包含TypeDetails
成员。然后,您可以将TypeDetails
getter的访问权限仅限于那些应该访问它的人,同时TypeDetails
本身对您库的所有部分都可见。
答案 3 :(得分:0)
如果必须将country
属性隐藏到用户代码,则可以获得标准可见性(未使用public
,protected
或private
限定符声明的属性,这些属性只对同一包中的类可见。我希望这有用,但我知道这只是一个补丁。
无论如何,我无法完全理解您的设计和必需品,所以可能您没有其他选择,但如果您想保护代码免受API滥用,可能需要重新设计并考虑封装