确定Object的属性的数据类型

时间:2015-08-28 03:46:24

标签: java groovy

我在Java / Groovy中有两个类似的对象,让我们说:

class a {
    Date creation
}

class a {
    String creation
}

在我的程序中,有一个开关确定我应该使用哪个对象(Groovy代码):

def obj
if(/* certain criteria for a */) {
    obj = new package.foo.a()

    // ...
    // Or some other process aside from initialization.
}
else if(/* certain criteria for the another a */) {
    obj = new package.bar.a()

    // ...
    // Or some other process aside from initialization.

}
else {
    obj = null
}

稍后在代码中,我需要根据属性creation的类型确定我应该执行的过程:

if(obj.creation instanceof Date) {
    obj.creation = new Date()
}
else if(obj.creation instanceof String) {
    obj.creation = '1995-08-17'
}

上述代码不起作用。有没有办法做到这一点?当然,如果无法获得属性的数据类型,我总是可以执行以下操作:

if(obj instanceof package.foo.a) {
    obj.creation = new Date()
}
else if(obj instanceof package.bar.a) {
    obj.creation = '1995-08-17'
}

3 个答案:

答案 0 :(得分:2)

您可以尝试获取对象的class并检查它是否与您要检查的任何类型具有相同的class

if(obj.creation.getClass().equals(Date.class)) {
    obj.creation = new Date();
}
else if(obj.creation.getClass().equals(String.class)) {
    obj.creation = "1995-08-17";
}

答案 1 :(得分:1)

有时根据对象的类型进行必要的处理,但应该避免使用,因为它会使代码更加脆弱。您最终可能会在代码库中遍布类型检查。在您的情况下,您可以将特定于类的行为委派给类本身。这是一个例子:

class A {
    Date creation

    void initializeCreationDate() {
        creation = new Date()
    }
}

/* I'm using a different class name to make this
 * example self-contained.
 */
class B {
    String creation

    void initializeCreationDate() {
        creation = '1995-08-17'
    }
}

def obj
def condition = true

if(condition) {
    obj = new A()
} else {
    obj = new B()
}

obj.initializeCreationDate()

在该示例中,这两个类负责设置自己的创建日期。这有助于保持代码的美观和整洁。

改为使用mixin

即使您无法(或不想)修改这两个类的源代码,您仍然可以达到相同的效果。在这种情况下,您可以使用mixin添加initializeCreationDate()方法。像这样:

class A {
    Date creation
}

/* I'm using a different class name to make this
 * example self-contained.
 */
class B {
    String creation
}

class DateInitializer {
    static void initializeCreationDate(A object) {
        object.creation = new Date()
    }

    static void initializeCreationDate(B object) {
        object.creation = '1995-08-17'
    }
}

def obj
def condition = true

if(condition) {
    obj = new A()
} else {
    obj = new B()
}

obj.metaClass.mixin DateInitializer
obj.initializeCreationDate()

答案 2 :(得分:0)

它不起作用,因为创建为空。 null不是任何对象的实例。 您必须使用反射API来获取字段类型,然后使用Class.isAssignableFrom()来检查类型。

if(String.class.isAssignableFrom(a.class.getDeclaredField("creation").getType()){
   ...
}

我编辑它以使代码编译:)