如果不为null,或者如果未在Java中设置,则分配

时间:2013-02-27 09:12:03

标签: java

我真的厌倦了做所有 if null 检查,resp。我还希望有一个更可配置的场景。让我通过一个例子解释一下:

我有getter(),在两种情况下都可以返回null'0'。不应该通过setter()来调用getter()

所以实现是

if(getter() != null && !getter().equals('0')) setter(getter()); 
然而,这真的让我很烦恼,特别是如果getter()setter()是非常长的方法调用,我必须为此引入辅助变量。

我正在考虑使用参数

的方法
ifNotSet(getter(), setter(), new Object[null, '0']); 

完全相同的事情。 ifNotSet的参数是

  • getter - 检查其是否不等于条件
  • 之一的方法
  • setter - 如果条件不适用,则setter(getter)方式调用的方法
  • 条件 - 对于要执行的方法getter()的评估不得适用的条件
乍一看,这似乎并不复杂,但它确实如此!有人知道这个问题的解决方案或任何类型的实现吗?

谢谢!

更新

在你们的反馈之后,我一直在研究这个问题,并发现了以下内容

    private boolean ns(Object[] condition, Object getter) {
    boolean ret = false;
    for (Object object : condition) {
        if(getter) equals or == ??
    }
    return true;
}

    Object[] cond = new Object[] { null, "0" };
    Object a;
if (ns(cond, a = getter()))setter(a);

嗯,如果你有很多分配要做,这似乎至少是一个解决方案。但是,如果您查看ns()方法...有关传入条件的问题是,是否使用==equals进行比较!?

3 个答案:

答案 0 :(得分:3)

你可以这样使用

  public boolean checkNotNullOrZero(String s)
    {
    return (s!=null) && !s.equals("0");
    }

基本用途:

if(checkNotNullOrZero(getter()))
{
setter(getter());
}

答案 1 :(得分:1)

你不能做那些在Java方法中不是一等公民的事情。你可以使用反射或匿名类,但这将是更多的工作。

如果null和0总是等同于getter,那么可以将其更改为只返回其中一个吗?

如果null和0总是等同于setter,那么可以将其更改为规范化这两个吗?

你能创建一个方法isNullOrZero(x)然后你可以

if (!isNullOrZero(getter())) {
  setter(getter());
}

答案 2 :(得分:1)

在Java中用字面意思做这个丑陋的方式:

public interface Getter {
    public Object get();
}

public interface Caller {
    public void call();
}

public void callIfNotNull(Getter getter, Caller caller, Object[] nullObjects) {
    Object value = getter.get();
    for(Object nullObject : nullObjects) {
        if(value==nullObject) {
            return;
        }
    }
    caller.call();
}

用法:

callIfNotNull(new Getter() {
        @Override
        public Object get() {
            return getterMethod();
        }
    }, new Caller() {
            @Override
            public void call() {
                setter();
            }
        }, new Object[]{null, '0'});
    }

您可能需要实现理智的方法来检查空对象并给出合理的名称。

Personnaly,我不会采用这种方法。我会尝试实施Null Object pattern来解决问题。