当然, empty 定义可能有所不同。我已经习惯了PHP的空,它会将空的所有内容调用为false。我想在我的Java应用程序中将这些东西称为空:
null
length
Integer
,Float
或Double
false
ArrayList
或HashMap
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)
链。
答案 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()
方法来检查密钥是否存在。 List
和String
(实现)提供了isEmpty()
方法,但List
或String
引用本身可能是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))
如果您支持的类型不受支持,您将收到编译错误,您可以根据需要实施其他版本。