java是否有一些约定来指示对象处于空状态?

时间:2015-02-27 15:14:50

标签: java oop

当然, empty 定义可能有所不同。我已经习惯了PHP的空,它会将空的所有内容调用为false。我想在我的Java应用程序中将这些东西称为空:

  • null
  • length
  • 的字符串
  • 0 IntegerFloatDouble
  • false
  • 零长度的任何数组
  • 清空ArrayListHashMap
例如,Java具有toString约定。每个对象都被授予给你一些字符串表示。在Settings课程中,我使用HashMap<String, Object>进行操作。我的empty方法现在看起来像这样:

  public boolean empty(String name) {
    Object val = settings.get(name);
    if(val!=null) {
      return false;
    }
    return true;
  }

我想以传统的方式扩展它,而不是if(val instanceof XXX)链。

8 个答案:

答案 0 :(得分:5)

不,Java中没有标准惯例。此外,在Java中没有“评估为假”的东西(当然除了布尔和布尔人之外)。

你必须编写一个方法(或者更确切地说,为你需要的每种类型的一系列重载方法),它实现了你的“空”概念。例如:

public static boolean isEmpty(String s) {
    return (s == null) || (s.isEmpty());
}

public static boolean isEmpty(int i) {
    return i == 0;
}

...

答案 1 :(得分:4)

您可以使用重载来描述所有&#34;空&#34;对象:

public static boolean empty(Object o) {
  return o == null;
}

public static boolean empty(Object[] array) {
  return array == null || array.length == 0;
}
public static boolean empty(int[] array) { //do the same for other primitives
  return array == null || array.length == 0;
}

public static boolean empty(String s) {
  return s == null || s.isEmpty();
}

public static boolean empty(Number n) {
  return n == null || n.doubleValue() == 0;
}

public static boolean empty(Collection<?> c) {
  return c == null || c.isEmpty();
}

public static boolean empty(Map<?, ?> m) {
  return m == null || m.isEmpty();
}

示例:

public static void main(String[] args) {
  Object o = null;
  System.out.println(empty(o));
  System.out.println(empty(""));
  System.out.println(empty("as"));
  System.out.println(empty(new int[0]));
  System.out.println(empty(new int[] { 1, 2}));
  System.out.println(empty(Collections.emptyList()));
  System.out.println(empty(Arrays.asList("s")));
  System.out.println(empty(0));
  System.out.println(empty(1));
}

答案 2 :(得分:3)

AFAIK没有这样的惯例。使用以下方法查看项目特定的实用程序类是相当常见的:

public static boolean isEmpty(String s) {
    return s == null || s.isEmpty();
}

但是我个人认为它的使用在Java中有点代码味道。有很多编写得很糟糕的Java,但编写良好的Java不应该在任何地方都需要进行空检查,你应该对对象的类型有足够的了解,以便应用特定类型的定义&#34;空&# 34。

例外情况是,如果您正在使用面向反射的代码,该代码使用您在编译时不知道的类型变量。该代码应该是如此孤立,以至于不适合使用util方法来支持它。

Python的鸭子打字意味着规则有点不同。

答案 3 :(得分:0)

有很多方法可以建立空白的概念,但它并没有在所有Java类中标准化。例如,Map(实现)提供Map#containsKey()方法来检查密钥是否存在。 ListString(实现)提供了isEmpty()方法,但ListString引用本身可能是null,因此您无法避免在那里进行null检查。

但是,您可以使用自己的实用程序类来Object并使用instanceof相应地调整empty检查。

public final class DataUtils {

    public static boolean isEmpty(Object data) {
        if (data == null) {
            return false;
        }
        if (data instanceof String) {
            return ((String) data).isEmpty();
        }
        if (data instanceof Collection) {
            return ((Collection) data).isEmpty();
        }
    }
}

答案 4 :(得分:0)

Guava Libraries已经包含了默认类。

调用defaultValue将返回任何基本类型的默认值(由JLS指定),对于任何其他类型,返回null。

您可以使用它,如下所示:

import com.google.common.base.Defaults;
Defaults.defaultValue(Integer.TYPE); //will return 0

以下是有关如何使用它的示例代码:

import com.google.common.base.Defaults;

public class CheckingFieldsDefault
{
    public static class MyClass {
      private int x;
      private int y = 2;
    }

    public static void main() {
       MyClass my = new MyClass();
       System.out.println("x is defualt: " + (my.x == Defaults.defaultValue(box(my.x).TYPE)));
       System.out.println("y is defualt: " + (my.y == Defaults.defaultValue(box(my.y).TYPE)));
    }

    private static <T extends Object> T box(T t) {
      return t;
    }
}

答案 5 :(得分:0)

如何创建一个界面EmptinessComparable或类似的东西,并让所有的类实现它?所以你可以期待,而不必每次都询问instanceof。

答案 6 :(得分:0)

Java没有,但Groovy确实如此。 Groovy与Java代码一起在Java VM上运行,并提供许多快捷方式和方便的约定。一种好的方法是用Java编写基础和批评项目组件,并将Groovy用于不太关键的高级组件。

答案 7 :(得分:0)

如果你想使用这种方法,我会重载一个实用工具方法:

public class MyUtils {
    public static boolean isEmpty(String s) {
        return s == null || s.isEmpty();
    }
    public static boolean isEmpty(Boolean b) {
        return b == null || !b;
    }
    // add other versions of the method for other types
}

然后你的代码总是如下:

if (MyUtils.isEmpty(something))

如果您支持的类型不受支持,您将收到编译错误,您可以根据需要实施其他版本。