为什么不推荐使用的方法不被重构?

Why are deprecated methods not reconstructed?

来自弃用的定义:

A program element annotated @Deprecated is one that programmers are discouraged from using, typically because it is dangerous, or because a better alternative exists.

此外,据我所知,已弃用方法的输出通常与 更好的替代方法 的输出相同。

因此,如果一种方法使用了过时的技术并且可能存在危险,则应将其删除,并且更好的替代方法 应使用相同的方法构建方法定义。

因此,根据我的说法这会好得多,并且不会激怒倾向于使用已弃用方法的程序员,并给出警告列表。

为什么没有这样做,为什么新方法使用不同的方法签名或在不同的 class 中创建?

不推荐使用的方法不会简单地删除或以不同的方式重新实现,因为有时方法的签名和位置与其功能一样错误。

考虑 class

public class Math {
    public static int add(int a, int b) { return a + b; }
    public static int randomNumber() { return 12; }
}

现在有人意识到 randomNumber 的实现是错误的,因为它实际上 returns 是一个常数值。此外,最好也包含一个 upperBound。它与 Math 无关,应该改为 class Random

public class Math {
    public static int add(int a, int b) { return a + b; }

    @Deprecated
    public static int randomNumber() { return 12; }
}

public class Random {
    public static int randomNumber(int upperBound) { return /* some complex implementation */; }
}

将问题标记为 @Deprecated 时,您应该始终做的是包括您应该使用的替代方法。

并且在没有给开发人员一个宽限期来做出反应之前,您不应该删除或更改最初有缺陷的功能,即放弃旧方法并使用新方法。因为只是在没有警告的情况下删除或更改它只会破坏每个人的代码,他们可能直到最近才意识到它的实际错误行为。

最后说明:关于你的陈述

This would be much better and would not irritate programmers, who tend to use the deprecated methods, with a list of warnings.

从一开始就是一个非常糟糕的习惯。在我工作的完成定义中,代码必须无警告才能发布。我们根本不允许使用已弃用的方法。如果您只是选择忽略警告和已弃用的消息,那么框架的作者对此无能为力。不愿意适配的开发者还可以继续,拿到废弃方法的源码,拷贝到需要的地方。 @Deprecated 是为了解框架变化并愿意并有能力处理这些变化的开发人员提供的功能。其余的根本不重要。 @Deprecated 将在某个时候被删除,破坏那些无论如何都不愿意更改的代码。

关于示例的补充:假设我们有 randomNumberBetween0And1,它被错误地实现并且总是 returns 值在 1 和 2 之间。该函数意识到该错误,将他们对该方法的使用更改为 randomNumberBetween0And1() - 1 以补偿该错误。如果你现在继续将实现更改为正确的实现,实际上返回 0 到 1 之间的东西,这将破坏之前通过减去 1 补偿你的错误的每个人的代码 - 这些人现在将获得 -1 到 0 之间的值回来。那是不是你想要发生的事情。

不应删除已弃用的方法。

如果一个基本方法被弃用怎么办?您是要重新编写和重新编译您曾经编写的每个应用程序,因为您想要更新您的 Java 版本,还是您希望您的旧应用程序仍然有效?

最好不要再使用已弃用的方法,这是事实,但为了保持 Java 与以前用 Java 编写的应用程序兼容,它们应该保留在那里.

Hence, according to me this would be much better and would not irritate programmers, who tend to use the deprecated methods, with a list of warnings.

如果您编写的代码不错,就不会使用已弃用的方法。一旦某个方法被弃用,这些警告将帮助您改进代码。您应该只收到一次此警告,并相应地调整您的代码。

Any reasons to why this is not done, and why new methods are made with different method definitions or in a different class altogether?

有时新方法的作用完全相同,有时则不然,而且它会获得额外的功能。如果您只是用新方法替换旧方法,则可能会改变所有使用原始方法的现有应用程序的行为。

保留弃用方法名称的一些原因:

  • 更正拼写/应用命名约定(但修复方法会破坏现有代码)

  • 存在固定方法,但需要更多参数才能正常工作。因此,一个参数调用与最佳猜测的第二个参数保持一致。 (java.net.URLDecoder.decode())

  • 不存在简单的修复,但删除会破坏代码

一种方法可能由于各种原因被弃用,这使得您的建议无法实现。大多数时候,并不是因为方法危险。这是因为有更好的选择。例如:

  • 为已弃用的方法选择了错误的名称。它已被名称更好的方法所取代:保留旧方法当然是一件好事,因为它不会破坏依赖它的所有现有代码,对吗?
  • 设计已更改,有一种更好的方法来完成已弃用方法的功能:再一次,已弃用方法并未完全失效。它可能会在某些极端情况下被破坏,但您不想在不进入这些极端情况的情况下破坏所有使用旧方法的现有代码。

即使该方法是危险的(例如 Thread.stop()),有些人可能知道该方法是危险的,意识到了这一事实,但他们的代码无论如何都可以正常工作并且不是'不会受到问题的影响,重写它会花费太多而没有明显的好处。重写相同的方法 stop() 而不会出现原始方法的问题是根本不可能的,因为问题是该方法所固有的:在没有协作的情况下停止线程。