【问题标题】:Java: Array of static methodsJava:静态方法数组
【发布时间】:2013-02-02 07:41:28
【问题描述】:

我想创建一个包含静态方法(或包含对静态方法的引用)的数组。我试图创建一个类数组,这些类实现了该方法的接口。使用此方法,我将获取对象,然后在其上调用该方法。这不适用于静态方法。有没有办法在 Java 中做到这一点?

编辑: 这是我目前使用的方法:

interface TableElement{
    public Integer lookup(int value);
}

TableElement[] table = new TableElement[]
{
    new TableElement() { public Integer lookup(int value) { return 0; } },
    new TableElement() { public Integer lookup(int value) { return value * 3; } },
    new TableElement() { public Integer lookup(int value) { return value * value + 3; } },
};

public Integer find(int i, int value) {
    return table[i].lookup(value);
}

我希望 find 方法是静态的。

【问题讨论】:

  • 你能提供你写的代码吗?这将有助于了解您到目前为止所做的尝试。
  • 我已经添加了代码,@Chris
  • 你为什么要这样做?
  • 我正在编写一个程序,它给出了一个地图并保存了一个 .java 文件,该文件是一个完美的静态哈希表,可以编译到其他程序中。如果这在 .java 文件中不是静态的,那就太傻了。
  • 如果您正在生成 Java 代码,您似乎可以直接在该代码中调用静态方法。

标签: java arrays


【解决方案1】:

当然,你可以有一个Method 的数组,然后你可以使用invoke 来调用它,看看这些例子:How do I invoke a private static method using reflection (Java)?

【讨论】:

    【解决方案2】:

    如果你能满足以下条件:

    1. 您知道代码生成时的所有密钥。
    2. 您知道代码生成时的所有值(方法)。

    你可以使用这样的代码:

    public class Table {
        public static int hash(String key) {
            /* you can use any type of key and whatever hash function is
             * appropriate; this just meant as a simple example.
             */
            return key.length();
        }
    
        public static Integer find(String s, int value) {
            int h = hash(s);
    
            switch (h) {
              case 4: // "zero"
                if (s.equals("zero"))
                    return methodZero(value);
    
              case 6: // "triple"
                if (s.equals("triple"))
                    return methodTriple(value);
    
              case 11: // "squarePlus3"
                if (s.equals("squarePlus3"))
                    return methodSquarePlus3(value);
    
              default:
                throw new UnsupportedOperationException(s);
            }
        }
    
        private static Integer methodZero(int value) { return 0; };
        private static Integer methodTriple(int value) { return value * 3; };
        private static Integer methodSquarePlus3(int value) { return value * value + 3; };
    
        /**
         * Just a demo.
         */
        public static void main(String arguments[]) {
            System.out.println("Zero(5): " + find("zero", 5));
            System.out.println("Triple(5): " + find("triple", 5));
            System.out.println("SquarePlus3(5): " + find("squarePlus3", 5));
            System.out.println("boom!");
            find("missingcode", 5);
        }
    }
    

    如果你需要放宽任何一个要求,我不相信你可以静态地做所有事情。

    如果您希望能够添加新键,则必须在添加时创建一个普通的哈希表来存储它们。 (您可以在default代码中查看。)

    如果您希望能够替换值,则必须在那里使用间接级别,可能使用Method 对象或Callable 的实现(您可以从@987654326 的主体中调用这些@ 方法)。

    【讨论】:

    • 我不想更改数据,它将生成 .java 文件,然后我希望该静态方法尽快返回值。我已经考虑过切换技术,但我假设它会评估第一种情况,然后是第二种情况,依此类推。如果我要处理非常大的数据集,那么这可能需要很长时间。数组背后的想法是我可以尽可能快地访问这些方法。交换机是否一个接一个地评估每个案例?
    • 我相信理论上 Java 语言规范和 Java 虚拟机规范将允许实现一个接一个地评估每个案例。实际上,如果您有两种以上的情况,编译器和虚拟机将使用更有效的方法;如果使用数组更快,我会感到非常惊讶。查看Java Virtual Machine Specification 中关于编译switch 语句的说明。
    猜你喜欢
    • 2013-12-31
    • 2013-11-29
    • 2018-10-04
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2013-10-20
    相关资源
    最近更新 更多