【问题标题】:How to make a method call to superclass of object guaranteed to have the method?如何对保证具有该方法的对象的超类进行方法调用?
【发布时间】:2020-01-03 00:23:30
【问题描述】:

我有一个 API 可以处理一组对象,这些对象都扩展了一个没有收入字段的特定类

class Person { ... }

假设我想打电话获取收入。并非这里所有的子类都有收入字段

class Child { ... }
class FullTimeEmployedPerson { ... }
class TrustFundKid { ... }

此过程将在后两者中的任何一个上调用#getIncome() 方法。现在,我的 API 保证永远不会收到 Child 传递给它,所以我想跳过寒暄,简单地拥有类似的东西

String getParsedIncome(Person person) { 
    return FooBar.parse(person.getIncome());
}

对此有什么现实的方法?

【问题讨论】:

  • 你能不能改变课程?听起来您可以,但听起来也像是来自 3rd 方库(因此您无法更改它们)。请edit您的问题包括从Person扩展的所有类。
  • 你在说什么样的 API? (我认为您的意思是 REST + json)您可以使用 default method Optional<T> getIncome() 定义接口。你的类都实现了接口,但实际上只有FullTimeEmployedPersonTrustFundKid返回非空对象。
  • Person 类是这里的一个假设示例,我实际上无法包含几十年前遗留应用程序的所有子类,而且它对这个问题没有更多帮助。我没有接触到所涉及的类,我的 API 根据规范将它们映射到不同的对象(变化太频繁)
  • 对于duck typing Java isn't ideal
  • @VictorS stackoverflow.com/questions/3935832/… 怎么样?这模拟了 C# 中的 dynamic 关键字。

标签: java


【解决方案1】:

Person 中定义getIncome(),抛出UnsupportedOperationException。在支持返回收入的子类中覆盖它

您说保证只会访问受支持的字段。这种方法放弃了编译时检查以确保这是真的。另一种方法是创建一个接口IncomeHolder,并仅在Person 的子类中实现它,这些子类实际上有收入。那么编译器就可以保证没有无效的使用。

【讨论】:

  • 如果我有办法更改第 3 方实施,这将是理想的
【解决方案2】:

你必须使用反射来检查你的实例类是否有这样的方法。

If(YourChildInstance.class.getMethod("methodName") != null){ ... }else{ do nothing}

我不能 100% 确定它是否有效。测试一下,如果可以的话告诉我

【讨论】:

  • 不幸的是,反射不是具有高 TPS 要求的解决方案,因为它们非常昂贵。它们也对可维护性没有帮助
猜你喜欢
  • 2020-09-17
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多