Java 优化代码以提高清晰度和效率

Java 优化代码以提高清晰度和效率,java,optimization,performance,Java,Optimization,Performance,这段代码运行良好,但我需要对其进行简化,以获得更清晰、更高效的效果: int i = 0; if (p.cap()) n++; if (p.creditcard()) n++; if (p.email()) n++; [...] if (p.price()) n++; if (p.url()) n++; if (p.zip()) n++; if (n == 0) p.standard(); 正如代码所说,我需要调用多个方法(我不知道它们的有限数量)。每个p.()*方法都返回一个布尔值,只有

这段代码运行良好,但我需要对其进行简化,以获得更清晰、更高效的效果:

int i = 0;

if (p.cap()) n++;
if (p.creditcard()) n++;
if (p.email()) n++;
[...]
if (p.price()) n++;
if (p.url()) n++;
if (p.zip()) n++;

if (n == 0) p.standard();
正如代码所说,我需要调用多个方法(我不知道它们的有限数量)。每个p.()*方法都返回一个布尔值,只有当返回的值为true时,n才会递增。如果n==0(当调用的每个方法都返回false时会发生这种情况),那么我需要调用p.standard()

如何编写更清晰高效的代码?我试过使用或条件,类似这样:

if (!( p.cap() || p.email() || p.isbn() || p.number() || p.phone() ||
       p.price() || p.time() || p.url() || p.zip() || p.creditcard()
    )) {
        p.standard();
}
public static int validate(boolean ... booleans) {
    int n = 0;
    for (boolean b : booleans) {
        if (b) n++;
    }
    return n;
}
int n = validate(p.cap(), p.creditcard(), p.email());
if (n == 0) p.standard();
但显然它没有正常工作(例如:如果p.cap()返回true,则不会调用其他方法)


我需要调用每个方法。

这里很难做到-没有足够的上下文

但是在p对象上创建一个新方法,返回您要查找的值。。。然后从所有代码所在的位置调用它

差不多

int n = p.getPopulatedColumns();

那么在该方法内部,实现是什么并不重要,因为读者会知道其意图。

您没有指定是否必须调用每个方法,但似乎您希望调用所有方法,而不管单个结果如何。因此,请使用简单的or运算符:|(而不是短的 电路或| |)


通过一些样板,您可以将其抽象为某种验证程序接口:

interface Validator {
    boolean validate(Foo p);
}

Validator[] validators = new Validator[] {
    new Validator() { boolean validate(Foo p) {return p.cap();} },
    new Validator() { boolean validate(Foo p) {return p.creditcard ();} },
    new Validator() { boolean validate(Foo p) {return p.email();} },
    // …
}

public int validateAll(Foo p, Validator[] validators) {
    int valid = 0;
    for (Validator v : validators) {
        if (v.validate(p)) valid++;
    }
    return valid;
}

if (validateAll(p, validators)) p.standard();
这是代码的净增加,但它的优点是可以清楚地传达“在
p
上运行所有这些检查”,并且检查列表是可扩展的


(我承认这可能是一个对您的需求来说过于沉重的解决方案。)

IMO还有另一个相当优雅的解决方案

创建如下验证方法:

if (!( p.cap() || p.email() || p.isbn() || p.number() || p.phone() ||
       p.price() || p.time() || p.url() || p.zip() || p.creditcard()
    )) {
        p.standard();
}
public static int validate(boolean ... booleans) {
    int n = 0;
    for (boolean b : booleans) {
        if (b) n++;
    }
    return n;
}
int n = validate(p.cap(), p.creditcard(), p.email());
if (n == 0) p.standard();
然后您可以这样调用此方法:

if (!( p.cap() || p.email() || p.isbn() || p.number() || p.phone() ||
       p.price() || p.time() || p.url() || p.zip() || p.creditcard()
    )) {
        p.standard();
}
public static int validate(boolean ... booleans) {
    int n = 0;
    for (boolean b : booleans) {
        if (b) n++;
    }
    return n;
}
int n = validate(p.cap(), p.creditcard(), p.email());
if (n == 0) p.standard();
由于validate方法将布尔值作为变量,因此可以根据需要添加任意多(或尽可能少)的参数

或者,如果所有参数都为false,您可以简化为返回布尔值:

public static boolean validate(boolean ... booleans) {
    int n = 0;
    for (boolean b : booleans) {
        if (b) n++;
    }
    return 0 == n;
}

这一切都取决于您以后是否需要
n
变量。

可能:?java编译器通常会进行大量优化,因此我会保留这样一段代码,而不是很短。为什么您说第二个示例不能正常工作?如果其他方法没有被调用,这不是你所期望的优化吗?@OtavioMacedo它不能正常工作,因为我还需要调用其他方法。如果你想迁移,只需标记并请求一个mod即可。请不要横穿柱子。