我正在研究java中的一个项目,对语言和OOP来说还是一个新手。我的困境是我想根据变量的值从特定的类中执行任务/函数。
这是我想要实现的目标。
class mainClass{
String option;
public static void main(String[] args) {
mainClass main = new mainClass();
}
mainClass(){
secondClass sC = new secondClass();
thirdClass tC = new thirdClass();
switch (option){
case "1" :
sC.doSomething();
case "2" :
tC.doSomething();
}
}
}
class secondClass{
void doSomething(){
System.out.println("1");
}
}
class thirdClass{
void doSomething(){
System.out.println("2");
}
}
我不想这样做的原因是因为如果我想添加第四,第五,第六类等......我将不得不更新开关。
我尝试使用hashmap。我在其中为secondClass分配了“1”的键。但是我必须抛弃这个对象,但是这让我回到最初的头痛,不知道需要事先调用什么类。
然后我尝试使用这样的hashmap,
HashMap<String, Object> map = new HashMap<String, Object>();
然后我可以做map.get(“1”),但现在我不能调用相关类的任何方法。
如果我需要使用大型开关语句,我会,但我正在积极寻求更有效的替代方案。
答案 0 :(得分:1)
如果你想避免使用Reflection(这里不鼓励),你应该考虑一个简单的SAM接口:
public interface Doable { public void doSomething(); }
让所有类实现接口(这些类中不需要进行其他更改)并拥有Map<String, Doable>
并调用
if (map.containsKey(option)) map.get(option).doSomething();
// Or (may be a little faster)
Doable opt = map.get(option);
if (opt != null) opt.doSomething();
如果您的实现有不同的方法,那么您很可能必须使用Reflection来获取声明的方法并按String进行比较。
答案 1 :(得分:1)
你使用Map
是正确的,但你也不愿意在施法时使用。但是,现在有了泛型,你可以解决所有问题:
interface DoesSomething {
// An object implementing this interface does something.
public void doSomething();
}
// Class that does something.
class FirstClass implements DoesSomething {
@Override
public void doSomething() {
// What FirstClass does.
}
}
// Another class that does something.
class SecondClass implements DoesSomething {
@Override
public void doSomething() {
// What SecondClass does.
}
}
// How I know what to do. Map the string to a DoesSomethng.
Map<String, DoesSomething> whatToDo = new HashMap<>();
{
// Populate my map.
whatToDo.put("1", new FirstClass());
whatToDo.put("2", new SecondClass());
}
public void doSomethingDependingOnSomething(String something) {
// Look up the string in the map.
DoesSomething toDo = whatToDo.get(something);
// Was it in there?
if (toDo != null) {
// Yes! Make it do it's thing.
toDo.doSomething();
}
}