我在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'
}
答案 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添加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()){
...
}
我编辑它以使代码编译:)