Java:我可以为同一个变量获得不同的类实例吗?

时间:2015-07-19 02:54:46

标签: java

假设有三个类:Class1,Class2和Class3加上一个变量值。

我想做的是:

??? value;
switch (someInt) {
   case 1: value = new Class1(); break;
   case 2: value = new Class2(); break;
   case 3: value = new Class3(); break;
}    

我希望在JavaFX中使用这个构造来处理各种类似于许多getter和setter的类,但也有一些不同(因此不同的类名都是从同一个父类派生的)。

有没有办法实现上述目标?

我已经评估了一些答案,但我仍然无法找到问题的答案,所以这里有一个具体的例子:

以下是我尝试分配给阴影的三个课程(我知道我不能这样做,仅仅是为了说明):

Shadow shadow;
DropShadow shadow;
InnerShadow shadow;

switch (sType) {
    case "SHADOW" : shadow = new Shadow(); break;
    case "DROPSHADOW" : shadow = new DropShadow(); break;
    case "INNERSHADOW" : shadow = new InnerShadow(); break;
}

// All these classes share the same parameters

shadow.setColor(Color.BLACK);
....
shadow.setRadius(2.0); 

fieldContent.setEffect(shadow); 
// This will then set any one of the three shadows

2 个答案:

答案 0 :(得分:0)

如果Class1Class2Class3实现了公共接口,或者扩展了公共基类,则可以使用它。发布后,您可以使用所有Java实例的共同祖先(Object)。您还需要break语句,因为case(s)属性。像,

Object value;
switch (someInt) {
case 1:
    value = new Class1(); 
    break; 
case 2: 
    value = new Class2(); 
    break;
case 3: 
    value = new Class3(); 
    break;
} 

答案 1 :(得分:0)

当然可以。默认情况下,Java中的所有类都以Object为根,因此您可以使用

Object value;

//...
switch (someInt) {
    case 1: value = new Class1(); break;
    case 2: value = new Class2(); break;
    case 3: value = new Class3(); break;
}

或者,如果所有类都实现或扩展了其他功能:

public interface AwesomeClass {
    public void method();
}

public class Class1 implements AwesomeClass {
    public void method() {
        // do class1 thing
    }
}

public class Class2 implements AwesomeClass {
    public void method() {
        // do class2 thing
    }
}

// ...

AwesomeClass value;
switch (someInt) {
    case 1: value = new Class1(); break;
    case 2: value = new Class2(); break;
}

如果类扩展了基类

,这是另一个例子
public class Animal {
    public void eat() { }

    public void walk() { }
}

public class Cat extends Animal {
    public void eat() {
        // eat like a cat
    }

    public void walk() {
        // walk like a cat (on four legs)
    }

public class Horse extends Animal {
    public void eat() {
        // eat like a horse
    }

    public void walk() {
        // walk like a horse
    }
}

Animal myAnimal;
switch(typeOfAnimal) {
    case 1: myAnimal = new Cat(); break;
    case 2: myAnimal = new Horse(); break;
}