Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java是否有某种约定来指示对象处于空状态?_Java_Oop - Fatal编程技术网

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

java是否有某种约定来指示对象处于空状态?,java,oop,Java,Oop,当然,空定义可能有所不同。我已经习惯了PHP的empty,它调用了所有计算结果为false的empty。我想在我的Java应用程序中将这些东西称为空: null 零字符串长度 0Integer,Float或Double false 任何长度为零的数组 空ArrayList或HashMap 例如,Java有toString约定。每个对象都被授予一些字符串表示形式。在我的设置类中,我使用HashMap操作。我的empty方法现在看起来如下: public boolean empty(Stri

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

  • null
  • 零字符串
    长度
  • 0
    Integer
    Float
    Double
  • false
  • 任何长度为零的数组
  • ArrayList
    HashMap
例如,Java有
toString
约定。每个对象都被授予一些字符串表示形式。在我的
设置
类中,我使用
HashMap
操作。我的
empty
方法现在看起来如下:

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

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

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

但是,您可以自己创建一个实用程序类,它接受
对象
,并使用
instanceof
相应地调整
检查

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();
        }
    }
}
这个类已经包含了默认类,可以实现这一点

调用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;
    }
}
import com.google.common.base.Defaults;
公共类检查字段SDEFAULT
{
公共静态类MyClass{
私人INTX;
私人智力y=2;
}
公共静态void main(){
MyClass my=新的MyClass();
System.out.println(“x是defualt:+(my.x==Defaults.defaultValue(box(my.x.TYPE)));
System.out.println(“y是defualt:+(my.y==Defaults.defaultValue(box(my.y.TYPE)));
}
专用静态T盒(T){
返回t;
}
}

创建一个EmptinesCompatible或类似的接口,并让所有类实现它,怎么样?所以你可以期待,而不必每次都问instanceof。

AFAIK没有这样的约定。使用以下方法查看特定于项目的实用程序类是很常见的:

public static boolean isEmpty(String s) {
    return s == null || s.isEmpty();
}
然而,我个人认为它的使用在Java中有点代码味道。有很多写得不好的Java,但是写得好的Java不应该到处都需要空检查,而且您应该对对象的类型有足够的了解,以应用特定于类型的“empty”定义

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


Python的duck类型表示规则有点不同。

不,在Java中没有这方面的标准约定。而且,在Java中没有“求值为false”这样的东西(当然除了布尔和布尔)

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

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

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

...

可以使用重载来描述所有“空”对象:


Java没有,但Groovy有。Groovy与Java代码一起在Java虚拟机上运行,并提供了许多快捷方式和方便的约定,如以下内容。一个好的方法是java中的写基础和CRITY项目组件,使用Groovy来处理那些不太重要的高级组件。

< P>如果你想使用一种方法,我会超载一个实用方法:

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))

如果您正在检查的类型不受支持,则会出现编译器错误,您可以根据需要实现另一个版本。

这在Java中是不可能的。此外,Java没有空值,而是基本类型的默认值,对象引用的默认值是
null
。String是一个类,因此String类型的变量将是一个引用类型,它的默认值也将是
null
,而不是空字符串或空字符串。如果有一个对特定类型执行特定操作的方法会更有用。如果代码过于抽象,它就变得毫无意义。您需要这种方法的实际用例是什么?试图像编写PHP一样编写Java可能不会有好的结果。在罗马的时候。。。所有这些,我恳请您停止思考如何用PHP解决这个问题,并尝试将这些知识移植到Java中。相反,学习一些Java基础知识,并尝试思考如何使用Java解决这个问题。PHP经验可能会帮助您了解一些细节,但本质上它们是两种不同的编程语言,具有不同的结构。@TomášZato窃取好的想法是一个不错的选择。试图定义一个“空”的概念,如果它映射为假,听起来像是一个黑客而不是一个明智的想法。大多数设置将是整数和字符串。拥有该方法的类大部分都是HashMap。Empty不是用来检查空值,而是用来检查值是否适合打印出来。但是,所有这些建议都忽略了
HashMap
给我
对象的事实。我必须先找到对象最深的子类型。我甚至不知道这是否可能。为什么HashMap会给你
对象
?泛型是从Java1.5开始出现的<例如,code>HashMap
为您提供
String
s。但除此之外,答案仍然是:没有Java不提供冰毒
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))