在Java中创建可切换类
我想用java创建一个可切换类 我可以在上面做一个开关盒 诸如此类在Java中创建可切换类,java,switch-statement,Java,Switch Statement,我想用java创建一个可切换类 我可以在上面做一个开关盒 诸如此类 public class MySwitchableClass implements Comparable<MySwitchableClass> { @Override public int compareTo(MySwitchableClass arg0) { // TODO Auto-generated method stub return 0; } } MySwi
public class MySwitchableClass implements Comparable<MySwitchableClass>
{
@Override
public int compareTo(MySwitchableClass arg0) {
// TODO Auto-generated method stub
return 0;
}
}
MySwitchableClass s = new MySwitchableClass();
MySwitchableClass s1 = new MySwitchableClass();
switch(s){
case s1:
//do something
break;
default break;
}
不可能。发件人:
表达式的类型必须是char、byte、short、int、Character、byte、short、Integer、String或枚举类型(§8.9),否则会发生编译时错误
Java switch使用数量有限的数据类型,而不是自定义对象 请参阅说明(适用于Java 7) 如果使用Java 7,可以重写类中的
Object.toString
方法,并使用yourInstance.toString
进行切换
使用
开关
和实现可比
是两件截然不同的事情 switch语句的值只能是基元数据类型、枚举或字符串。您试图做的事情无法实现。相反,您可以对该类调用一个函数,该函数将返回一个基本数据类型。switch语句不接受类,但它接受枚举。您可以创建一个enum
类型来保存类类型,并将它们设置为每个类中的字段。然后可以通过接口方法公开枚举类型,该方法在switch
语句中使用
MyClassType枚举
public enum MyClassType {
CLASSA, CLASSB
}
可发现的接口
public interface Discoverable {
public MyClassType getType();
}
public static void main(String[] args) {
Discoverable a = new ClassA();
Discoverable b = new ClassB();
switch (a.getType()) {
case CLASSA:
System.out.println("class a");
break;
case CLASSB:
System.out.println("class b");
break;
}
}
public static void main(String[] args) {
Discoverable a = new ClassA();
Discoverable b = new ClassB();
a.doWork();
}
ClassA
public class ClassA implements Discoverable {
private MyClassType type = MyClassType.CLASSA;
public MyClassType getType() {
return type;
}
}
ClassB
public class ClassB implements Discoverable {
private MyClassType type = MyClassType.CLASSB;
public MyClassType getType() {
return this.type;
}
}
public class ClassB implements Discoverable {
public void doWork() {
System.out.println("class b");
}
}
用法
public interface Discoverable {
public MyClassType getType();
}
public static void main(String[] args) {
Discoverable a = new ClassA();
Discoverable b = new ClassB();
switch (a.getType()) {
case CLASSA:
System.out.println("class a");
break;
case CLASSB:
System.out.println("class b");
break;
}
}
public static void main(String[] args) {
Discoverable a = new ClassA();
Discoverable b = new ClassB();
a.doWork();
}
更好的方法是将此逻辑放入ClassA
和ClassB
中,并通过接口公开它
界面更改
public interface Discoverable {
public void doWork();
}
public class ClassA implements Discoverable {
public void doWork() {
System.out.println("class a");
}
}
ClassA变化
public interface Discoverable {
public void doWork();
}
public class ClassA implements Discoverable {
public void doWork() {
System.out.println("class a");
}
}
ClassB
public class ClassB implements Discoverable {
private MyClassType type = MyClassType.CLASSB;
public MyClassType getType() {
return this.type;
}
}
public class ClassB implements Discoverable {
public void doWork() {
System.out.println("class b");
}
}
用法
public interface Discoverable {
public MyClassType getType();
}
public static void main(String[] args) {
Discoverable a = new ClassA();
Discoverable b = new ClassB();
switch (a.getType()) {
case CLASSA:
System.out.println("class a");
break;
case CLASSB:
System.out.println("class b");
break;
}
}
public static void main(String[] args) {
Discoverable a = new ClassA();
Discoverable b = new ClassB();
a.doWork();
}
谢谢你的回答。我不知道Java和普通类一样支持这个丰富的枚举 我使用了一个枚举并定义了所有需要的字段和方法。我还实现了一个所需的接口,默认情况下枚举是一个可切换类型 所以,enum可以做我需要的一切。 我的枚举定义如下
public enum GearType implements ConfigurationParameter {
Automatic("Automatic"), Manual("Manual");
private String type;
GearType(String _type) {
type = _type;
}
@Override
public String toString() {
return type;
}
@Override
public void doSomeFunction(Object caller) {
//TODO function code
}
}
你到底为什么要那样?您希望在
MySwitchableClass
中有什么行为?嗯,尝试使用枚举。@RohitJain:OP想创建一个类,该类可以作为switch
@justhalf的参数。是的,我看到了。我不是问什么?
,而是问为什么?
开关使用byte、short、char和int基元数据类型。它还适用于枚举类型(在枚举类型中讨论)、字符串类和一些特殊的类,这些类包装了某些基本类型:字符、字节、短字符和整数。
或字符串
(从Java 7开始)。我从Java5获取了一个链接。我更新了指向Java7JLS的链接。谢谢。因为Java7也String
Hmmm,所以到现在还没有使用Java7。我不知道。谢谢,我不想用可比的。但我认为可能还有另一个接口需要实现,它可以使我的类被接受为switch case语句的参数。@IslamIbrahim正如我提到的,如果您将toString
方法重写为可以在开关中使用的东西(并且您使用Java 7,它允许String
开关)然后您可以切换yourInstance.toString”。否则您也可以覆盖
hashCode`方法并使用int
值进行切换。这是一个很好的解决方法。但是,我需要在同一类的不同实例之间切换,而不是在不同的类之间切换