【问题标题】:Method code depending on value of Instance?方法代码取决于实例的值?
【发布时间】:2014-04-15 16:18:15
【问题描述】:

我有一个关于 Android (Java) 的问题。

假设我有一个命令列表(每个命令都有命令名称和执行方法)。
执行方法有不同的代码,具体取决于命令名称(即命令“GET GPS LOCATION”-> 执行方法返回位置值)。

因此,我可以在执行方法中使用带有 switch-case 的单个 Command 类来检查命令的名称并执行代码。
或者为每个命令创建一个类(我猜这不是最好的方法,因为我有 80 多个命令)。
还是我应该使用接口?
还是有更好的方法?

感谢您的帮助!

【问题讨论】:

  • 如果您的命令名称遵循严格的命名约定,您可以使用反射来调用相应的方法。它为您省去了大开关盒。但就个人而言,开关盒似乎更强大。
  • 是的,这些命令遵循严格命名约定。使用 switch case 也是我的第一个想法,但这需要为方法定义一个特殊的返回类型,对吧?

标签: java android class interface command-pattern


【解决方案1】:

从Java8开始,你可以使用method references简洁地做到这一点:

public class Test {

  Map<String, Runnable> map = Maps.newHashMap();
  map.put("foo", Test::foo);
  map.put("bar", Test::bar);

  public static void foo() {

  }


  public static void bar() {

  }
}

那么,拨打map.get(methodName).run()就够了。

【讨论】:

  • 这对我来说非常完美!我只在 java 版本中看到一个问题。是否有类似的方式与旧版本一起运行?不过谢谢。
  • 由于Map的值是Runnable,所以还是可以显式写Runnable:map.put("foo", new Runnable() { public void run() {foo()});
  • 我刚刚检查了您的解决方案,它在 Java 中运行良好。为了让它适用于 Android(不是 Java 8),我使用了这个 map.put("foo", this.getClass().getDeclaredMethod("foo")); 并将每个 runnable 替换为 Method。我想这个解决方案也是正确的方法吗? @Arnaud Denoyelle
【解决方案2】:

你如何创建一个抽象的 Command 类并使用映射来检索正确的命令,例如:

abstract class Command<T>
{
    public static final Map<String, Command> commands = new HashMap<>();

    public Command(final String executeCommand)
    {
        commands.put(executeCommand, this);
    }

    public abstract T execute();
}

然后实现:

class LocationCommand extends Command<LocationValue>
{
    public LocationCommand()
    {
        super("GET GPS LOCATION");
    }

    @Override
    public LocationValue execute()
    {
        System.out.println("Getting GPS location");
        return null;
    }
}

然后你可以像这样检索它们:

public static void main(String[] args)
{
    new LocationCommand();
    Command.commands.get("GET GPS LOCATION").execute(); //Output: Getting GPS location
}

【讨论】:

  • 这个接缝也是一个非常简洁的解决方案!但我想保持独立于返回类型和东西。
猜你喜欢
  • 2017-09-12
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
相关资源
最近更新 更多