@SafeVarargs 注释的 presence/absence 真的是一个有用的区别吗?
Is the presence/absence of @SafeVarargs annotation really a useful distinction?
这个问题不是关于堆污染是如何发生的。这个问题不是关于注释 @SafeVarargs
有什么影响。我知道它用于抑制本地和呼叫站点的警告。我看了documentation。我的问题是:为什么要将此注释添加到 Java 语言中?
考虑以下几点:
没有注释不是一个有用的区别。在任何情况下,您都可能打算以不安全的方式使用 VarArgs,即“UnsafeVarargs”。
这不同于 @Override
等其他注释,其中缺少注释是一个有用的区别:“嘿,我不打算覆盖我的超类中的任何方法,如果有人添加了一个方法,请警告我与我的超类相同的签名。"
要么程序员知道如何安全地使用 Varargs,要么他们不知道。如果他们添加注释,它不会改变它。那么这不就是给来电者提供了一种虚假的安全感吗?
这让我想起了一个有缺陷的想法,即在关门时将车门把手向上拉,这样就可以防止将钥匙锁在车内。
继续第2点,默认情况下全局禁用警告,然后在进行广泛审查时全局重新启用它不是更好吗?
也许我遗漏了什么。也许注释在从旧版本 Java 迁移时起到了有用的作用?我欢迎你的回答。谢谢
继续第2点,默认情况下全局禁用警告,然后在进行广泛审查时全局重新启用它不是更好吗?
这听起来确实是一件糟糕的事情。
实际上,您争取零容忍政策。代码零浪费、零警告、零错误、零单元测试失败。你一直在检查你的 "counts"。您将 5 行代码添加到 class; class 变成了黄色! (日食告诉你那里的警告)......你进去并 修复 它们 - 立即。而不是在某个假设的未来时间点,当有人碰巧在全球范围内启用警告时。
换句话说:您从未考虑过全局禁用警告。
因此,反之亦然:有些情况下编译器只能检测到:"there might be a problem" - 然后编译器会更好地对此发出警告。但是对于程序员可以 合理 评估情况的情况,这样的注释是一种简单、直接的方法(在真正的本地范围内工作!)来抑制编译器警告。
但是您的假设肯定是正确的,即不了解可变参数的程序员也可能无意中以不正确的方式使用该注释。一个合理的解决策略可以是:例如 "have code reviews focus on code that uses this annotation"。而不是全局禁用警告。
这个问题不是关于堆污染是如何发生的。这个问题不是关于注释 @SafeVarargs
有什么影响。我知道它用于抑制本地和呼叫站点的警告。我看了documentation。我的问题是:为什么要将此注释添加到 Java 语言中?
考虑以下几点:
没有注释不是一个有用的区别。在任何情况下,您都可能打算以不安全的方式使用 VarArgs,即“UnsafeVarargs”。
这不同于
@Override
等其他注释,其中缺少注释是一个有用的区别:“嘿,我不打算覆盖我的超类中的任何方法,如果有人添加了一个方法,请警告我与我的超类相同的签名。"要么程序员知道如何安全地使用 Varargs,要么他们不知道。如果他们添加注释,它不会改变它。那么这不就是给来电者提供了一种虚假的安全感吗?
这让我想起了一个有缺陷的想法,即在关门时将车门把手向上拉,这样就可以防止将钥匙锁在车内。
继续第2点,默认情况下全局禁用警告,然后在进行广泛审查时全局重新启用它不是更好吗?
也许我遗漏了什么。也许注释在从旧版本 Java 迁移时起到了有用的作用?我欢迎你的回答。谢谢
继续第2点,默认情况下全局禁用警告,然后在进行广泛审查时全局重新启用它不是更好吗?
这听起来确实是一件糟糕的事情。
实际上,您争取零容忍政策。代码零浪费、零警告、零错误、零单元测试失败。你一直在检查你的 "counts"。您将 5 行代码添加到 class; class 变成了黄色! (日食告诉你那里的警告)......你进去并 修复 它们 - 立即。而不是在某个假设的未来时间点,当有人碰巧在全球范围内启用警告时。
换句话说:您从未考虑过全局禁用警告。
因此,反之亦然:有些情况下编译器只能检测到:"there might be a problem" - 然后编译器会更好地对此发出警告。但是对于程序员可以 合理 评估情况的情况,这样的注释是一种简单、直接的方法(在真正的本地范围内工作!)来抑制编译器警告。
但是您的假设肯定是正确的,即不了解可变参数的程序员也可能无意中以不正确的方式使用该注释。一个合理的解决策略可以是:例如 "have code reviews focus on code that uses this annotation"。而不是全局禁用警告。