首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指向Java中静态表中的实例方法

指向Java中静态表中的实例方法
EN

Stack Overflow用户
提问于 2021-08-25 22:51:16
回答 1查看 72关注 0票数 0

我想要一张这样的桌子:

代码语言:javascript
复制
static final Record [] table = {
    new Record( Pattern.compile( "regex1" ), MyClass::f1 ),
    new Record( Pattern.compile( "regex2" ), MyClass::f2 )
};

其中,f1f2等是对实例(而非静态)方法的引用,其中包含参数和返回值,每个方法如下所示:

代码语言:javascript
复制
public int f1( int arg ) {
    return arg * arg;
}
public int f2( int arg ) {
    return arg + arg;
}

因此,我可以调用类似这样的代码(伪代码):

代码语言:javascript
复制
void foo( String s, int arg ) {
    for( Record r : table ) {
        if( r.regex.matcher( s ).matches() ) {
            int result = r.func.invokeOn( this, arg );
            break;
        }
    }
}

如何正确地声明Record构造函数的第二个参数,也就是伪代码中的成员变量func?我想出了静态f1f2等,但是我得到了各种各样令人费解的错误消息,不管我尝试了什么非静态的f1声明等等。我假设这是可以做到的?

EN

回答 1

Stack Overflow用户

发布于 2021-08-25 23:00:36

您需要这些函数是static,或者需要解释实例变量将来自何处。为了给您提供一个完整的示例,我不得不编写Record。简而言之,你想要一个Function<Integer, Integer>,你想要apply它。就像,

代码语言:javascript
复制
class Record {
    private Pattern regex;
    private Function<Integer, Integer> func;

    public Record(Pattern p, Function<Integer, Integer> f) {
        this.regex = p;
        this.func = f;
    }

    void foo(String s, int arg) {
        for (Record r : table) { // this.regex.matcher(s).matches() ?
            if (r.regex.matcher(s).matches()) {
                int result = r.func.apply(arg);
                break;
            }
        }
    }

    static final Record[] table = {
            new Record(Pattern.compile("regex1"), Record::f1),
            new Record(Pattern.compile("regex2"), Record::f2)
    };

    public static int f1(int arg) {
        return arg * arg;
    }

    public static int f2(int arg) {
        return arg + arg;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68930670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档