代码之家  ›  专栏  ›  技术社区  ›  Paul Tomblin

标记为“已弃用”的API方法何时会真正消失?

  •  25
  • Paul Tomblin  · 技术社区  · 16 年前

    Date.toMonth() , Date.toYear() 和其他不推荐的 Date Calendar 方法。

    太阳/甲骨文公司是否真的说过这些事情何时会消失,还是真的 @deprecated

    10 回复  |  直到 7 年前
        1
  •  25
  •   VonC    7 年前

    关于API。。。没有明确规定他们将很快被移除。

    Incompatibilities in J2SE 5.0 (since 1.4.2) :

    源兼容性

    [...]

    尽管目前还没有删除此类API的计划 除了JVMDI和JVMPI之外,其他都完全从系统中删除。

    How and When To Deprecate APIs 移除


    更新10年后,新的 JDK9+ Enhanced Deprecation 阐明折旧政策。
    Jens Bannmann answer 更多细节。
    Vojtěch Růžička 下列的 criticisms on JEP 277 .

    forRemoval=true 在某个Java版本中, .
    forremove=true 在Java9中,它应该在Java10中被完全删除。
    在使用标记为移除的API时,请记住这一点。

    请注意,此约定仅适用于JDK本身,第三方库可以自由选择他们认为合适的任何约定。

        2
  •  13
  •   Alex Miller    16 年前

    他们不会走的。也就是说,它们通常被弃用,因为a)它们是危险的线程.stop(),或者b)有更好的或至少更被接受的方法。通常不推荐使用的javadoc方法会提示您更好的方法。在您的情况下,建议使用日历进行此操作。

    虽然可以想象它们在未来的某个时候会被移除,但我不会打赌。但是,如果有人使用Java,他们可能会是第一个使用Java的人。。。

        3
  •  7
  •   Eric Burke    16 年前

    一个问题是,您将看到许多关于使用不推荐的方法的编译器警告。如果您还使用弃用来逐渐淘汰自己的代码,编译器警告将消失在噪音中,失去意义。

        4
  •  6
  •   Jens Bannmann skiwi    3 年前

    tl;博士

    As of JDK 17 ,全部为原创 java.util.Date 方法仍然存在,但现在可以使用这些API和其他API explicitly marked 移除。许多其他不推荐使用的API最近已被删除。

    完整答案

    20 Years Of Java Deprecation ).作为一个名为 Enhanced Deprecation ,介绍 @Deprecated(forRemoval=true) dozens of previously deprecated APIs .

    远离的 原料药( full list 来自JavaSE9规范),JDK8不赞成使用它,因为它是模块化的障碍。

    从那时起,每个JDK版本都删除了以前标记为删除的更多API,大多数版本还添加了 forRemoval 标记以前不推荐使用的API或添加了全新的用于删除不推荐使用的API(请参见下表)。

    1. 不推荐用于删除的API很可能很快就会被删除。 一定要认真对待这件事。 但它们可能不会在下一版本中删除(例如。 Thread.stop() 标记 排除
    2. 即使是长期被弃用的API现在也可以很快被删除:一个JDK版本设置了 标志,下面的一个将删除API。例如,JDK10删除的API已经被弃用了至少20年(自JDK1.2以来),如此之久,现在有些人可能会感到惊讶。
    3. 现今 弃用和删除的速度要快得多 神谕 switched to a 6-month release cycle 使用jdk10。

    释放 远离的
    自从
    建议删除
    JDK10
    2018年3月2日
    中的一些API SecurityManager Runtime

    ( full list )
    java.security.acl 包裹 finalize() 某些I/O类上的方法,以及其他一些以前不推荐使用的API

    full list )

    2018年9月
    Thread.destroy() ,其他几种方法和 Policy

    )
    jdk9&10 java.util.jar.Pack200 原料药

    ( full list
    JDK12
    2019年3月2日
    定稿 full list JDK 10
    JDK13
    2019年9月
    Runtime.traceInstructions() Runtime.traceMethodCalls()

    full list )
    jdk9 javax.security.cert 包,方法 java.lang.String 与“文本块”预览功能和其他一些方法相关

    ( full list )

    java.security.acl 包装和 java.util.jar.Pack200 原料药

    full list )
    Thread.resume() , Thread.suspend() 及相关 ThreadGroup 方法; ConstantBootstraps() Modifier() ToolProvider() 建设者

    ( full list )
    JDK15
    康斯坦布茨陷阱() 修饰语() 建设者

    ( full list
    JDK 14 java.rmi.activation 包裹

    ( full list )
    JDK16
    2021年3月21日
    建造师

    ( full list
    JDK 14 基本包装类的构造函数,例如 Integer Double Boolean ; destroy() , stop() isDaemon() 朋友们,; URLDecoder() 建造师; 某些颜色相关AWT类的方法

    full list )

    2021年9月
    java.rmi.activation 包裹 URL解码器()

    ( full list )
    JDK 15&16 java.applet java.lang.SecurityManager checkAccess() 在…上 Thread /

    ( full list )
        5
  •  4
  •   Brett McCann    16 年前

        6
  •  3
  •   user38748    16 年前

    我有一个更好的建议:不要告诉他使用 Calendar ,您应该切换到 JodaTime JSR-310 的预发布版本。关于数字图像处理的一些方法 java.util.Date 可能会被弃用,但在我看来,整个类都应该被弃用,以及

    Date :

    • 所有有用的方法(例如。 toString )首先,根据本地时区对日期进行标准化。使用UTC时 日期 真正地 烦人的你被迫使用 日历 否则你会犯非常严重的错误。

    • . 真臭。可能会赢得有史以来最差的API奖。

    • 始终代表一个 即时 . 无法表示特定日期或特定年份。无法表示无时区的日期值。

    • Datetime 考虑到它是一个。

        7
  •  2
  •   David Koelle    16 年前

    如果不推荐的方法消失了,它们可能会破坏现有的代码。

    把“弃用”看作是“过时”的意思,但不一定是“在砧板上”。

        8
  •  2
  •   Rich Kroll    16 年前

    已被取代且应避免的不推荐功能。尽管它们仍然存在于JDK中,但由于有更好的方法可用,因此不鼓励使用它们。这些方法留在API中以支持向后兼容性,但通常应避免使用,因为它们可以在API的未来版本中删除。

    从技术上讲,使用不推荐使用的方法是可以的,但通常情况下,最初不推荐使用的原因是开发了更好/更快/更干净的API。

        9
  •  1
  •   Adrian    16 年前

    当涉及到影响向后兼容性的更改时,Sun往往非常偏执,因此我不希望看到这些方法很快消失。

    但是不推荐的方法 在将来的任何时候都可以离开,人们通常会因为某种原因而不赞成使用它们——要么因为它们不可靠,要么因为它们有令人不快的副作用,要么仅仅因为有更好或更优雅的做事方式。该方法的JavaDoc通常会详细说明以下哪种情况,以及目前执行相同操作的可接受方式。通常情况下,不推荐使用的方法会被一个调用“正确”方法的实现所取代,因此您只是添加了一个间接级别。

    如果你使用这些方法,你也会有大量的编译警告,这本身就足以避免它们。。。

        10
  •  1
  •   warren    16 年前

    我肯定看到过弃用函数的消失——从Java的旧版本到当前版本(我从1.1开始,有些东西在1.4中显然不起作用)。

    其他语言处理弃用的方式不同——例如,Python在过去就已经知道,在一两个版本之后就可以删除弃用的功能。