java确定对象属性的数据类型
我在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'
}
# 1 楼答案
有时需要根据对象的类型进行修改,但应该避免,因为这样会使代码更加脆弱。您可能会在代码库中到处都是类型检查。在您的情况下,您可以将特定于类的行为委托给类本身。下面是一个例子:
在本例中,两个类负责设置自己的创建日期。这有助于保持代码整洁
使用mixin代替
即使无法(或不想)修改这两个类的源代码,您仍然可以实现相同的效果。在这种情况下,可以使用mixin添加initializeCreationDate()方法。像这样:
# 2 楼答案
它不工作,因为创建为空。null不是任何对象的实例。 必须使用反射API获取字段类型,然后使用
Class.isAssignableFrom()
检查类型我对其进行了编辑,以使代码能够编译:)
# 3 楼答案
您可以尝试获取对象的
class
,并检查它是否与正在检查的任何类型的class
相同: