【问题标题】:Changing the access level of a framework class/method更改框架类/方法的访问级别
【发布时间】:2018-03-02 07:47:06
【问题描述】:

在这个给定的例子中,AbstractAnimal 在框架之外有很多实现。然而,该框架被重构,因此现在WalkingAnimals 存在。它的目的是让 Dog 和所有其他动物一样,现在将继承 WalkingAnimal。例如,没有不走路的动物。所有的继承者都应该重构。

这是一个 Java 框架,所以我将这样称呼它。但请随意更一般地解释这个问题。因为它非常大,我们希望我们的 IDE 提供某种指示,表明当前继承 AbstractAnimal 的类应该更改。因此我们想到了@Deprecated 注解。但是,框架本身会抛出警告,所以它一定不是最干净的方法。

本质上,有些类和方法的访问级别会发生变化,因此只有框架才能使用它。我们希望以尽可能清晰的方式在要重构的类中宣布这一点(例如@Deprecated 提供的警告和删除线)。我们的 IDE 是 IntelliJ IDEA,我们正在使用 Java 1.8。

我们正在寻找某种自动生成任务的方式,开发人员可以查看警告列表并知道他们仍需要更改哪些内容。 bossman 也希望看到取得的进展,所以使这些可数将是一个很好的加分。

提前感谢您的任何建议。

【问题讨论】:

    标签: java frameworks refactoring deprecated


    【解决方案1】:

    您可以做的是向AbstractAnimal 添加一个名为youShouldNotExtendAbstractAnimalDirectly() 的抽象虚拟方法,该方法仅在WalkingAnimal 中实现。这将导致Dog 中的编译失败,当开发人员尝试修复它时,他们会遇到该方法,要么接受提示,要么自取其辱。

    【讨论】:

    • 导致编译错误不是首选,因为重构需要数​​周时间,我们需要有工作代码才能继续执行错误修复。原则上这是可行的,但我认为这不是一个非常干净的方法。不过建议很好。
    • 谢谢。 Hamcrest 使用这种技术来阻止人们直接实现 Matcher:github.com/hamcrest/JavaHamcrest/blob/master/hamcrest-core/src/…
    • @JeroenSteenbeeke 哦,天哪!这是 hacky :) 我喜欢它!
    【解决方案2】:

    您可以将 walk 方法提供给 AbstractAnimal 类,默认实现是抛出 OperationNotSupportedException

    public void walk() {
        throw new OperationNotSupportedException();
    }
    

    这是否是一个好主意真的取决于具体情况。

    编辑: 更准确地说,正如 Jeroen 指出的那样,您只会发现新方法是否在运行时正确实施。因此,最好在任何地方使用该异常来捕获它;您必须这样做的次数越多,该解决方案就越不受欢迎。

    【讨论】:

    • 我看到这种方法的一个问题是,直到运行时你才知道你是否搞砸了实现
    • @JeroenSteenbeeke 当然,这正是问题所在。一个副作用是,要处理这个问题,您必须在使用新方法的任何地方在框架中捕获该异常。这有多糟糕取决于它的使用频率,这就是我所说的circumstances ;)
    • @daniu 虽然我倾向于建议同样的事情,但另一个答案是“更好”
    猜你喜欢
    • 2018-05-20
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2015-08-22
    相关资源
    最近更新 更多