【问题标题】:How I can make this code better我怎样才能使这段代码更好
【发布时间】:2013-04-10 11:33:27
【问题描述】:

我有像

这样的字段

变量1、变量2、变量3....等

我的条件是

if(variable1 != null && variable1 != 0 )
  myobject.setFirstValue(variable1);

if(variable2 != null && variable2 != 0 )
 myobject.setSecondValue(variable2);

if(variable3 != null && variable3 != 0 )
 myobject.setThirdValue(variable3);

像这样,我有将近 15 个条件。有什么方法可以简单地编写所有这些条件。变量名称与我发布的不完全相同。它们与我发布的不同。

【问题讨论】:

  • 你真的需要 15 个变量而不是一个数组吗?如果多个变量非空且非零,你真的要多次调用setFirstValue吗?
  • 您的程序的性质是什么?你到底在用这些变量做什么?
  • 我正在发送状态、城市、街道、名称等值。如果不为空,我需要设置这些值
  • @Jon Skeet 如果我放入列表或数组,我如何知道我需要设置哪个变量来设置哪个 setter 方法
  • 您可以使用反射,但如果使用不当,这可能会变得有点讨厌。高度依赖于真实的变量名和 setter 名

标签: java loops if-statement


【解决方案1】:

你可以从...开始

if (notNullOrZer0(variable1)) {
   ...
}

private boolean notNullOrZero(Integer x) {
    return x != null && x != 0;
}

然后可能将所有这些变量放在List<Integer> 中...这取决于您的其余代码的结构...

【讨论】:

  • 我更新了我的问题。请看一次。我发布了一些错误
  • 如果我放入列表中,我如何知道我需要设置哪个变量来设置哪个 setter 方法
  • 你所有的变量都是同一类型吗?
  • 那么你有几个变量要用来构造一个对象?或者你正在更新一个对象?有多少个变量?
【解决方案2】:

您可以创建一个方法 isNotNullorequalsZero 来检查不为空且不等于零

private boolean isNotNullorequalsZero(Integer value){
     return value != null && value != 0;
}

然后你使用它 -

if(isNotNullorequalsZero(variable1) )
  myobject.setFirstValue(variable1);

if(isNotNullorequalsZero(variable2) )
 myobject.setFirstValue(variable2);

if(isNotNullorequalsZero(variable3) )
 myobject.setFirstValue(variable3);

【讨论】:

  • 为什么是样板代码return true..false。您可以通过以下方式更改您的代码:return value != null && value != 0;;)
  • 你的答案+1。这也是正确的。但我只能接受一个答案
【解决方案3】:

您可以创建一个类似copyIfNonZero 的方法,它可能看起来像这样:

public void copyIfNonZero(MyObject myObject, Integer value) {
    if (value != null && value != 0) {
        myObject.setFirstValue(value);
    }
}

并且当前代码将减少到

copyIfNonZero(myobject, variable1);
copyIfNonZero(myobject, variable2);
copyIfNonZero(myobject, variable3);
...

或者甚至将变量放入 Collection 并对其进行迭代:

Collection<Integer> values = .....
for(Integer value : values) {
    copyIfNonZero(myObject, value);
}

【讨论】:

  • 就像问题的第一个版本一样...... :) 但事实上,对于更新后的问题,这种方法并不是特别有用。
  • 哦,没看到第一个版本:)
【解决方案4】:

要么修改setFirstValue方法为

void setFirstValue(Integer var){
if(var !=null && var !=0) {
//current logic of setFirstValue
}
}

或者如果无法修改它,创建一个包装器调用(返回布尔类型以在调用失败时通知用户)

boolean checkAndSetFirstValue(Integer var) {
    if(var !=null && var !=0){
        setFirstValue(var);
        return true;
    }
    return false;
}

【讨论】:

  • 但是您隐藏了这样一个事实,即如果出现问题,调用者将不会收到通知。在这种情况下你应该抛出异常
  • yes thnx 用于指针,但我更喜欢在编辑代码时使用其他方法。
【解决方案5】:

您可以将所有变量放在一个数组中并使用for循环检查条件并设置myobject.setFirstValue(array[index]);中的值

【讨论】:

  • 但是我的setter方法不一样。如何设置
【解决方案6】:

如果这是在你的代码中经常发生的事情,并且你想封装这种行为并避免重复它,我会做这样的事情:

在工具或实用程序类中,创建一个静态方法:

public static void setPropertyIfNonNullNorZero(Object target, String propertyName, Integer value){

    //use some reflection tooling here, or write the whole thing yourself... I am  using commons.beanutils here

    if(value != null && value != 0){
        BeanUtils.setProperty(target, propertyName, value);
    }

}

此代码假定您的目标对象 (myObject) 遵守 bean 约定(基本上一致的 getter 和 setter 命名)并且值始终是整数。

然后像这样使用它:

Tools.setPropertyIfNonNullNorZero(myobject, "thirdValue", variable3);

【讨论】:

  • 重构属性名称时会发生什么?
  • 当然,如果你重命名一个属性,你必须在方法调用中手动更改属性名称,除非你的重构工具足够聪明,可以检测到这些间接引用......与许多其他通过名称引用 bean 属性而不是通过 java 代码直接调用 getter 方法的情况相同(例如 HQL/JPAQL、JSP/JSTL 等)
猜你喜欢
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多