在Java中创建可切换类

6
我希望在Java中创建一个可切换的类,可以在它上面使用switch case语句,就像这样。
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;
    }

你为什么需要那个?你想在 MySwitchableClass 中实现什么行为? - Rohit Jain
4
尝试使用枚举。 - Matthias
1
@RohitJain:OP想要创建一个类,可以作为“switch”的参数。 - justhalf
@justhalf。是的,我看到了。我不是在问“什么?”,我是在问“为什么?” - Rohit Jain
A switch works with the byte, short, char, and int primitive data types. It also works with enumerated types (discussed in Enum Types), the String class, and a few special classes that wrap certain primitive types: Character, Byte, Short, and Integer . - Deepak Ingole
显示剩余4条评论
5个回答

9

switch语句不接受类,但是可以接受枚举。您可以创建一个enum类型来保存类类型,并在每个类中将其设置为字段。然后,可以通过接口方法公开枚举类型,该方法在switch语句中被使用。

MyClassType 枚举类型

public enum MyClassType {
    CLASSA, CLASSB
}

可发现接口

public interface Discoverable {
    public MyClassType getType();
} 

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 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;
    }

}

一个更好的方法是将这个逻辑放到ClassAClassB中,并通过接口暴露出来。 接口变更
public interface Discoverable {
    public void doWork();

}

ClassA更改

public class ClassA implements Discoverable {

    public void doWork() {
        System.out.println("class a");
    }
}

ClassB

public class ClassB implements Discoverable {

    public void doWork() {
        System.out.println("class b");
    }
}

使用方法

public static void main(String[] args) {
    Discoverable a = new ClassA();
    Discoverable b = new ClassB();
    a.doWork();    
} 

很好的解决方法。不过,我需要在同一个类的不同实例之间进行切换,而不是在不同类之间进行切换。 - Isyola

9

不可能的。根据JLS所述:

表达式的类型必须是char、byte、short、int、Character、Byte、Short、Integer、String或枚举类型(§8.9),否则将出现编译时错误。


2
从Java 7开始,或者String - Matthew Gilliard
1
真的。我从Java 5中获取了一个链接。我用Java 7 JLS的链接进行了更新。谢谢。 - Arnaud Denoyelle

1
< p > switch语句的值只能是原始数据类型、枚举或字符串。你所尝试的操作无法实现。你可以调用该类上的一个函数来返回一个原始数据类型。


自Java 7起,String也是如此。 - Mark Rotteveel
嗯,我到现在还没有使用过Java 7。我不知道这一点。谢谢。 - Aashray

0
感谢你的回答。我之前不知道 Java 也支持像普通类一样丰富的枚举。
我使用了一个枚举类型并定义了所有需要的字段和方法。我还实现了所需的接口,而这个枚举默认是可切换类型。
因此,枚举类型可以完成我需要的所有功能。 我的枚举定义如下:
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
    }
}

0

Java switch 仅适用于有限数量的数据类型,不适用于自定义对象。

请参见此处的解释here(适用于Java 7)。

如果您使用Java 7,则可以在类中覆盖Object.toString方法并使用yourInstance.toString进行切换。

使用switch和实现Comparable是两个非常不同的事情。


我并不是想使用Comparable接口,但我认为可能有另一个接口可以实现,使得我的类能够作为参数被switch-case语句接受。 - Isyola
@IslamIbrahim 嗯,正如我所提到的,如果你重写 toString 方法并将其转换为可以在 switch 中使用的形式(并且你使用允许 String switch 的 Java 7),那么你就可以使用 yourInstance.toString 进行 switch。否则,你也可以重写 hashCode 方法并使用 int 值进行 switch。 - Mena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接