在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

我想用java创建一个可切换类 我可以在上面做一个开关盒 诸如此类

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
值进行切换。这是一个很好的解决方法。但是,我需要在同一类的不同实例之间切换,而不是在不同的类之间切换