是否可以创建一个方法来返回Java中的方法?

时间:2018-11-21 16:53:48

标签: java

我想知道是否在Java中可以创建一个返回方法的方法:在处理表单时,我需要检查用户用正确的模式填充它的每个字段。每个字段的检查都不同,因此我为每个字段创建了一个不同的方法,现在我想编写一个方法,该方法可以根据我的字段“重新路由”我(即告诉我我需要使用哪种验证方法) m检查。

我想知道是否可以通过使用函数来做到这一点?

EDIT(很抱歉不首先发布该内容):更具体地说,这里的复杂之处在于该方法不会返回任何内容,而是用于在字段中生成异常未验证。例如:

private void emailValidation(String email) throws Exception {
    if (email != null) {
        if (!email.matches("([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)")) {
            throw new Exception("The e-mail is not valid.");
        }
    } else {
        throw new Exception("Please write an e-mail address.");
    }
}

是的,我知道我可以使用函数,但是我看到的所有示例都很简单,或者在任何情况下都不能处理异常,而且我不知道在这种情况下如何使用这些功能。

编辑:我应该做类似的事情吗?

private Consumer<String> validation(Field field) throws Exception {
    try {
        switch (field) {
        case Name:
            return value -> nameValidation(value);
            break;
        case Email:
            return value -> emailValidation(value);
            break;
        case Password:
            return value -> passwordValidation(value);
            break;          
        }
    } catch (Exception e) {
        throw new Exception(e.getMessage());
    }
}

在这里我真的看不到使用功能接口的意义(因为我显然不明白),没有它我可以做类似的事情。

例外情况可能不是最好的做法,但这是练习限制的一部分。实际上,我个人(我想是菜鸟)觉得它很优雅,因为它是我们抛出的一个错误,而方便的部分是,它可以在获取有关它的信息时知道有一个错误(嗯,这是一个错误。处理错误的对象)。

2 个答案:

答案 0 :(得分:2)

是的,可以创建一个返回方法的方法。

这就是Java 8中引入的功能接口,lambda和方法引用的全部意义,即将方法视为可以传递的对象。

让我们说您需要一种验证int值的方法,即您需要一种类似boolean isValid(int value)的方法。为此,您可以使用内置的IntPredicate功能界面。

public static IntPredicate getAgeValidator() {
    return i -> i >= 21;
}

该方法返回一个用于验证年龄(int值)至少为21岁的方法。

然后可以像这样使用返回的“验证方法”:

int age = 25;
boolean valid = getAgeValidator().test(age);

答案 1 :(得分:0)

您可能意味着您想从方法中返回。在这种情况下,您可以简单地指示方法已完成:

return;

如果返回类型不为空,则必须返回以下内容:

return "some string";

return myObject;

Lambdas

但是,您可能意味着您实际上想返回一个函数。例如。您想返回一个lambda。 Java,取代了Java 8中语言的最新功能,仍然没有真正的一流功能。您可以考虑返回Function类型的实例:

Function<String, String> getSomeFunction() {
    return (paramOfTheFunction) -> "This is a function with param: " + paramOfTheFunction;
}

在泛型(“ <>”)中,第一个字符串是输入类型,第二个字符串是输出类型。然后您可以像这样调用它:

void myMethod() {
    Function<String, String> myFunc = getSomeFunction();
    string output = myFunc.apply("foo");  // Outputs "This is a function with param: foo"
    System.out.println(output);
}

反射

但是,还有第三种情况:您可能想实际返回一个方法(类似于C ++中的函数指针)。通过反射可以做到这一点。

void methodA() {
    System.out.println("foobar");
}
Method getMethodA() {
    // null because methodA has no parameters; this specifies parameter types
    return getClass().getMethod("methodA", null);
}

然后,您可以使用其调用方法执行返回的方法:

getMethodA().invoke(this);

调用需要作为其成员的类的实例作为第一个参数。其他参数可以选择提供参数。

然后,您可以使用其调用方法执行返回的方法:

getMethodA().invoke(this);

调用需要作为其成员的类的实例作为第一个参数。其他参数可以选择提供参数。