@SafeVarargs注释的存在与否真的是一个有用的区别吗?

时间:2016-11-30 15:47:53

标签: java annotations variadic-functions suppress-warnings

这个问题不是关于如何发生堆污染。这个问题与注释@SafeVarargs的影响无关。据我所知,它用于抑制本地和呼叫站点的警告。我读了documentation。我的问题是:为什么这个注释会添加到Java语言中?

请考虑以下事项:

  1. 缺少注释并不是一个有用的区别。从来没有一种情况可以打算以不安全的方式使用VarArgs,即" UnsafeVarargs"。

    这与其他注释不同,例如@Override,缺少注释是一个有用的区别:"嘿,我不打算覆盖我的超类中的任何方法,如果有人添加,请警告我与我的超类具有相同签名的方法。"

  2. 程序员要么知道如何安全地使用Varargs,要么他们不知道。如果他们添加注释,它不会改变它。那么它是不是只为呼叫者提供了一种虚假的安全感呢?

    这让我想起了一个有缺陷的概念,即在关门时把你的车门把手拿起来会阻止你将钥匙锁在里面。

  3. 从第2点开始,默认情况下全局禁用警告会不会更好,然后在进行广泛审核时全局重新启用警告?

  4. 也许我错过了什么。从旧版本的Java迁移时,注释是否可以起到有用的作用?我欢迎你的回答。感谢。

1 个答案:

答案 0 :(得分:2)

从第2点继续,默认情况下全局禁用警告不是更好,然后在进行广泛审核时全局重新启用它吗?

对于现实而言,这听起来像是一个非常糟糕的事情。

实际上,您正在努力实现零容忍政策。代码零浪费,零警告,零错误,零单元测试失败。而且你一直在检查你的“数量”。你可以在你的班级中添加5行代码;那班得黄了! (eclipse告诉你那里的警告)......你进去并立即修复他们。而且在某个人碰巧在全球范围内启用警告时,并不是在某个假设的未来时间点。

换句话说:您从未考虑全局禁用警告。

所以,反过来说:有时候编译器只能检测到:“可能可能是一个问题” - 然后编译器会更好地警告这一点。但是对于程序员可以合理评估情况的情况,这样的注释是一个简单,直接的意思(在真正的本地范围内工作!)来抑制编译器警告。

但是,如果一个不理解varargs的程序员可能会以不正确的方式无意中使用该注释,那么你肯定是正确的。一个合理的解决策略可能是:“让代码审查关注于使用此注释的代码”,例如。而不是全局禁用警告。