【发布时间】:2016-09-02 07:03:12
【问题描述】:
我有一个类,它有几个表示不同类型设备名称的枚举。
public class DeviceNames {
public enum Microsoft {
DeviceName1, DeviceName2, DeviceName3
}
public enum Apple {
DeviceName1, DeviceName2, DeviceName3
}
}
我有不同的具体设备将实现的接口(接口指定了它可以通信的方式)
public interface IPDevice{
//factory method
Device createNewIPDevice(DeviceNames.Enum<E> deviceName);
}
public interface USBDevice{
//factory method
Device createNewUSBDevice(DeviceNames.Enum<E> deviceName);
}
我有一个抽象类
public abstract class Device {
String deviceName;
protected Device(String deviceName) {
this.deviceName = deviceName;
}
}
以及实现一个或多个接口的抽象类的具体实现
public class MicrosoftDevice implements IPDevice{
@Override
public Device createNewIPDevice(DeviceNames.Microsoft deviceName) {
return super(deviceName.toString());
}
}
public class AppleDevice implements IPDevice, USBDevice {
@Override
public Device createNewIPDevice(DeviceNames.Apple deviceName) {
return super(deviceName.toString());
}
@Override
public Device createNewUSBDevice(DeviceNames.Apple deviceName) {
return super(deviceName.toString();
}
}
我想使用枚举来确保它们只提供有效的设备名称(而不是传递字符串)
如何让接口方法接受一个可以采用通用枚举类型但只能采用 DeviceNames 类中的枚举的参数?
【问题讨论】:
-
我不确定将域值作为枚举是否是个好主意,但如果这是一个硬编码的哈希,II 将使用单个制造商/设备枚举,它具有所有组合
APPL_NAME1("Apple", "Name1"), APPL_NAME2("Apple", "Name2"), MSFT_NAME1("Microsoft", "Name1")等. -
@eckes 问题在于它允许调用者传入任何枚举。 (即,他们可以将
APPL_NAME1传递给MicrosoftDevice中的方法)。如果使用了错误的制造商,我可以通过抛出异常来解决这个问题,但我想知道是否有办法导致编译错误,所以不需要抛出异常。