有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

逻辑是用Java编程的最有效的方法

好吧,假设你有一个简单的程序,它使用字母a-z,如果你输入“c”,它会做一些事情,例如“e”可能会添加两个随机数,“h”显示单词“hello”,x显示时间等等

现在我试图通过26种不同的方法来解决这个问题,每个字母一个,然后是一个代码主体,扫描用户输入,然后调用适当的方法

现在他们显然有100种方法来解决这个问题,但我考虑的主要两种方法是,你可以有26个if或switch语句(例如,if(userInput.equals(“a”)),然后调用方法a等等)。或者我正在考虑的另一种方法是将方法标记为a-z,然后假设用户输入“f”,而不是检查它是哪个字母,而是信任用户并调用他们输入的字母

例如:

->;用户输入Y

用户输入=y

userInput();-(本质上是调用y(),这是一个方法名)

我相信有一种方法可以通过阅读这里的“反射”来做到这一点,但我听说可以避免过早优化,但在这种情况下,这不是最合乎逻辑的做法吗


共 (5) 个答案

  1. # 1 楼答案

    我的看法是:

    • 1) 设置一个大的if/else if树来检查用户输入
    • 2) 设置一些 片状、不稳定、反射慢的材料
    • 3) 使用“字符串”为字母和CmdHandler的映射 将是一个具有要调用的函数的类。(命令模式)

    对于这样一个简单的例子来说#3的体系结构稍微好一点,但它更适合扩展

    编辑:快速n脏示例

    public class Testing {
        public static void main(String[] args) {
        CmdHandler ch = null;
    
        /* Setup & populate our map */
        HashMap<String, CmdHandler> cmdMap = new HashMap<String,CmdHandler>();
    
        ch = new AKeyHandler();
        cmdMap.put(ch.getCmd(), ch);
    
        ch = new BKeyHandler();
        cmdMap.put(ch.getCmd(), ch);
        /* ..etc.. */
    
        /* Actually use the system now! */
        String input = "";
        input = "a"; /* Get our input from... whereever */
    
        /* Do any input validation/manipulation here */
    
        CmdHandler handler = cmdMap.get(input.toUpperCase());
        if (handler != null)
            handler.doWork();
        else
            System.err.println("Egads!  A null!");
    
        }
    
    public static abstract class CmdHandler {
        private final String cmd;
        public CmdHandler(String cmd) {
            super();
            this.cmd = cmd.toUpperCase();
        }
        public String getCmd(){
            return this.cmd;
        }
        public abstract void doWork();
    }
    public static class AKeyHandler extends CmdHandler{     
        public AKeyHandler() {
            super("a");
        }
        public void doWork() {
            System.out.println("Executing the A Key cmd doWork()");
        }
    }
    public static class BKeyHandler extends CmdHandler{     
        public BKeyHandler() {
            super("b");
        }
        public void doWork() {
            System.out.println("Executing the B Key cmd doWork()");
        }
    }
    
    /* ...etc... */
    

    }

  2. # 2 楼答案

    我会考虑使用^ {CD1>}。

    enum Letter{
        A("a"){
            @Override
            void foo(){
                // do stuff
            }
        }, 
        B("b"){
            @Override
            void foo(){
                // do stuff
            }
        },
        .
        .
        .
        Z("z"){
            @Override
            void foo(){
                // do stuff
            }
        };
    
        private final String text;
        Letter(final String text){
            this.text = text;
        }
    
        abstract void foo();
        public static final Letter getInstance(final String s){
            for(Letter l: Letter.values()){
                if(s.equalsIgnoreCase(l.text)){
                    return l;
                }
            }
    
            return null;
        }
    }
    

    这样,您只需获取用户输入,调用Letter.getInstance(...),然后获取适当的Letter实例。然后从那里,您只需在Letter实例上调用foo(),这将执行特定于该字母的操作

  3. # 3 楼答案

    这是Command Pattern(编辑:删除所有幽默;感谢上帝的幽默巡逻)。实现它的方法有很多种,但最简单的是命令处理程序的映射

  4. # 4 楼答案

    如果您输入的是一个不存在风险的用户后缀,则该选项将不存在。如果使用数据库不是一个选项,那么最好的方法可能是实例化一个以字母为键、以显示结果为值的映射,并以用户输入为键调用get(objectkey)方法。如果结果为空(用户未输入字母),您可以适当地处理它

    如果在用户输入字母时需要计算值,则可以使用对象填充地图,这些对象使用“过程”方法实现某些接口。当您提取值时,只需要调用process方法。注意匿名类的使用,因为在这种情况下这可能是最好的

    map.put("a", new Processor(){
         @Override
         public String process(){
              return "someString";
         }
    }
    

    其中Processor是您创建的某个接口

  5. # 5 楼答案

    好的,首先,反射实际上相当慢。它要求程序检查自己的代码(尽管这可能不是缓慢的原因)

    你真的需要26种不同的方法吗?我觉得有点奇怪。在这些方法中是否存在任何重复代码?如果是,您应该找到这种通用性,并使用一个开关或一组if语句来管理字母特定的代码。这实际上会更有效,并且会为您的应用程序创建更小的占用空间

    在我看来,担心交换机与if效率的主要问题在于,除非您编写的是任务关键型软件,或是极度优化的东西(您可能不会用java编写),并且所讨论的代码每秒被调用数千次,否则差异可以忽略不计

    假设你真的需要这26种不同的方法,戴夫·牛顿的答案可能就是你想要的