【问题标题】:If something is deprecated, can I still use it? [duplicate]如果某些东西已被弃用,我还能使用它吗? [复制]
【发布时间】:2014-01-26 23:41:27
【问题描述】:

在我的 Eclipse Android 应用程序中,我使用日期类型。我被警告这是一种已弃用的类型。这是否意味着我不能使用它,或者仅仅意味着这是不好的做法?

感谢您的帮助!

【问题讨论】:

  • 试试看你就知道了。提示:是的,你可以,但你应该吗?它已被弃用是有原因的。所以你最好知道为什么。
  • 这意味着使用它是不好的做法。它仍然可以使用,但最终它将无法与其他东西一起使用,因为它不再受支持。最佳实践是使用请求的替代任何折旧类型。它应该做折旧类型所做的一切,只是不同。开发人员更改它是有原因的。通常是因为它的结构不适用于新类型等其他东西。

标签: java android deprecated


【解决方案1】:

基本上不推荐使用是对作为开发人员的警告,尽管方法/类/无论是在哪里并且可以工作,但它并不是最好的方法。要么有更新更好的替代品可用,要么(有时)它存在一些微妙的问题,因此不建议使用。

您仍然可以使用已弃用的东西 - 但您应该先看看为什么它们被弃用,看看新的做事方式是否更适合您。

理论上,不推荐使用的东西将来可以或将被删除。这种情况很少发生(某些 Java 库已弃用其中已有 10 多年历史的内容),但您应该注意这一风险。

【讨论】:

  • 新方法更适合约会的东西,但我在偷工减料,并没有学习新的东西,除非我真的需要。 :) 谢谢
  • deprecated 说的不仅仅是“有更好的方法”,它还说:“它可能会在未来的任何时候停止工作/被删除,恕不另行通知”......例如见Thread#stop这已被弃用了一段时间:在 Java 8 中,它会抛出一个 UnsupportedOperationException
  • @assylias 我不同意“恕不另行通知”。我不记得每个人都看到过不推荐使用的功能在没有通知的情况下停止运行。根据我的经验,新版本中通常包含一个变更日志或“重大变更”列表,其中将记录所有此类变更。如果没有,要么是经过彻底重新设计的产品,要么是一个非常不专业的软件发布团队。
  • @Dan 够公平 - 那部分有点夸张! ;-)
【解决方案2】:

您现在可以使用它,但将来可能会被删除。更好地寻找替代品。也可以自己打包成库,不用依赖标准库。

【讨论】:

  • 所以你应该是thrown ;)
  • @ᴍarounᴍaroun: catch (StackOverflowException soe) { keepAnswer(); }
  • 注意Java中没有StackOverflowException...
  • @ᴍarounᴍaroun:为什么?你什么时候扔?您是说堆栈作为您使用的数据结构还是调用堆栈?
  • 我在开玩笑。。为了前面的“笑话”;)
【解决方案3】:

您可以(我们不会割伤您的手,因为我们不能;)),但这是一种不好的做法。他们总是有更新的替换,你应该使用它们。

将来可以删除不推荐使用的函数,因此您的代码可以停止工作。

【讨论】:

  • 好的,我的应用程序更像是一个个人项目,而不是我打算发布的任何东西,但它确实需要工作。谢谢:)
【解决方案4】:

如果停止使用已弃用的方法不会破坏向后兼容性我更喜欢迁移到新的 API,没有什么是强制性的,但工作量很小,我更喜欢没有警告的代码

【讨论】:

    【解决方案5】:

    旧功能有时会与新功能一起保留,旨在替换它们以实现向后兼容性。为了明确这一点,此类功能通常会被标记为“已弃用”。

    我不同意使用已弃用的函数总是“不好的做法”。如果这是不好的做法,它们就不会被弃用,它们会被删除。 现有代码使用已弃用的函数通常没问题,但可能需要重构才能使用较新版本的库。

    重要的是要指出“已弃用”并不一定意味着该功能将不复存在或在新版本中工作。它可能会在库的整个生命周期内继续工作并作为库的一部分。

    然而,在 new 代码中使用已弃用的函数是一种不好的做法。我从来没有见过一个标记为“已弃用”的功能没有被一些更新的,通常更好的替代品所取代。新代码应使用更新后的函数,该函数通常包含重要的优化、设计更改或错误修复。

    【讨论】:

      【解决方案6】:

      第二个:它只是被认为是不好的做法。但仍在工作(在不久的将来 - 对于遥远的未来,它不再保证工作)。

      不鼓励你使用它,但你可以。

      【讨论】:

        【解决方案7】:

        这取决于它被弃用的原因。阅读 javadocs。例如使用没有意义 线程.destroy

        /**
         * Throws {@link NoSuchMethodError}.
         *
         * @deprecated This method was originally designed to destroy this
         *     thread without any cleanup. Any monitors it held would have
         *     remained locked. However, the method was never implemented.
         *     If if were to be implemented, it would be deadlock-prone in
         *     much the manner of {@link #suspend}. If the target thread held
         *     a lock protecting a critical system resource when it was
         *     destroyed, no thread could ever access this resource again.
         *     If another thread ever attempted to lock this resource, deadlock
         *     would result. Such deadlocks typically manifest themselves as
         *     "frozen" processes. For more information, see
         *     <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html">
         *     Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>.
         * @throws NoSuchMethodError always
         */
        @Deprecated
        public void destroy() {
            throw new NoSuchMethodError();
        }
        

        【讨论】:

          【解决方案8】:

          您现在可以使用它,但将来可能会完全丢弃它。这意味着必须有人使用您使用的 java 版本的 JVM,这不太可能。只有当您的用户可以获取您的程序的更新时,您才应该使用它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-04-22
            • 1970-01-01
            • 2013-09-01
            • 1970-01-01
            • 2016-10-08
            • 1970-01-01
            • 2012-09-26
            相关资源
            最近更新 更多