您的A和B类似乎都提供set / getCreatedTime和set / getUpdatedTime方法.
如果其他28个左右的类也提供了这些类(如您的问题所暗示),则只需为所有类实现具有这些方法的通用接口即可.
然后,您可以将方法的通用类型绑定到该接口,并放弃所有instanceof语句和后续的显式转换.
唯一的缺点是,如果列表中的字段名与传递给该方法的具体类无关.
如果要强制执行此操作,则可以在对象上使用反射来发现该字段是否按名称存在.然后,您可以使用已记录的警告(或您认为合适的任何机制)轻松处理任何缺少的字段.
注意
如thijs-steel所述,如果您的“时间”方法共享相同的实现,则您可以让您的30个类扩展一个仅实现“时间”方法的通用抽象父级.
或者,由于您显然使用的是Java 8,因此可以使用默认方法.
例
interface I {
// assuming parameters and return types here
public void setCreatedTime(ZonedDateTime z);
public void setUpdatedTime(ZonedDateTime z);
public ZonedDateTime getCreatedTime();
public ZonedDateTime getUpdatedTime();
}
// A, B etc. all implement I
public void find(T object, List fieldsToBeUpdated) {
fieldsToBeUpdated
.parallelStream()
.forEach(
field -> {
switch(field) {
case "a": {
try {
object.getClass().getDeclaredField("a");
// we're good
object.setCreatedTime(...);
}
catch (NoSuchFieldException e) {
// TODO something
}
break;
}
// ...
}
});
}
更新资料
如果您的课程根本不共享任何公共字段,那么您可能希望完全更改整个方法.
您可能希望使用继承并在每个单个类中拥有自己的find方法实现,而不是拥有“一个通用方法适合所有人”的逻辑实现范例.
这将允许在每个实现中使用更小的switch语句,并在默认情况下执行错误处理.
您仍然可以通过使find方法采用T扩展Findable来概括行为(其中Findable声明“时间”方法,现在声明find方法),并简单地在给定的T对象上调用find.
甚至在Findable和Timed之间分开关注,并让您的类同时实现.