2014-05-01 48 views
1

我有两个类:StudentUserUser类扩展了Student,并且它们都实现了一个公共接口,该接口定义了checkSelf()方法。此方法检查对象的状态是否有效,并在执行数据库中的更新或插入操作之前被调用。Checkstyle:方法不适用于扩展,但它需要是

我在数据库中插入了学生和用户,这使得在这两种情况下都可以从课堂外调用此方法。这就是为什么在this post找到了解决办法似乎并不适用于我的问题。也许我错过了一些东西。

基本上,事情的方式现在,无论是checkSelf()方法是公众和一个在User类调​​用从做自己的检查之前,它的父(Student)之一。

我怎么能解决这个问题,所以我有干净的代码?

+0

你在这两种情况下都可以从课堂外召唤什么? –

+0

基本上说,这个方法必须是公开的,因为它会被另一个类调用。 – PLPeeters

回答

4

我个人不同意这个规则(恕我直言,比使用更令人头疼),但是你提到的问题中的答案给出了你可以做什么的相当好的指示。

  • 充分利用checkSelf()方法最终
  • 创建Student空保护checkSelfEx()方法被称为的checkSelf()
  • 最后一步实现用户checkSelfEx()使其决赛。

这可保证在调用方法时始终执行checkSelf()执行的检查(因此不会因子类而导致合同中断)。当然,问题出现在命名上,就好像你想在用户的一个子类中使用更多的逻辑,你需要checkSelfExEx()。如果所有这些检查都可以用更好的名字进行分组,那么至少可以阅读,但是将很多最终方法暴露给子类并不是一件好事。

+0

终于明白了,谢谢你的洞察。 – PLPeeters

+0

如果我想让继承更深入,我该怎么办?例如'class A {}','class B extends A','class C extends B'等等? – RoninDev

+1

@RoninDev这个规则应该与浅类层次结构中使用。 Checkstyle自己说:“创建的类没有错,这个检查只适用于图书馆项目,而不是应用程序项目”。因此,它仅适用于您在API中公开提供的类,并且这些类不太可能具有深层次结构(我们不计算可以从其子类中继承的私有类,而只包括其他公共类)。恕我直言,既然你控制的建立,它可能是更好的只是做一个自定义的注释,并建立检查,以确保超级实现调用。 – Ordous

相关问题