2016-11-30 6 views
1

この質問は、ヒープ汚染がどのように起こるかに関するものではありません。この質問は、注釈@SafeVarargsにどのような影響があるかについてのものではありません。私はそれがローカルとコールサイトの両方で警告を抑制するために使用されることを理解します。私はdocumentationを読んでいます。私の質問は、なぜこの注釈がJava言語に追加されたのかです。@SafeVarargsアノテーションの存在/非存在は本当に有用な区別ですか?

は、次のことを考えてみましょう:

  1. 注釈の不在が有用な区別ではありません。 VarArgsを安全でない方法、つまり "UnsafeVarargs"で使用するつもりはありません。

    これは、@Overrideなどの注釈とは異なります。アノテーションがないと便利な区別があります。「スーパークラスのメソッドをオーバーライドするつもりはありません。誰かが同じシグネチャのメソッドを私のスーパークラス "

  2. プログラマーは、Varargsを安全に使用する方法を知っているか、そうでないかを知っています。アノテーションを追加しても、アノテーションは変更されません。それでは、発信者にセキュリティの誤った感覚を提供するだけではありませんか?

    これは、ドアを閉めている間に車のドアを持ち上げると、キーが内部にロックされないようにするという欠陥の概念を思い起こさせます。

  3. 警告2を続けると、警告をグローバルにデフォルトで無効にしてから、広範なレビューを行う際にグローバルに再度有効にする方が良いでしょうか?

多分私は何かを逃しています。 Javaの古いバージョンから移行するときに、アノテーションが役に立つ役割を果たしているのかもしれません。私はあなたの答えを歓迎します。ありがとう。

答えて

2

警告メッセージをデフォルトでグローバルに無効にしてから、広範なレビューを行う際にグローバルに再度有効にする方がよいでしょうか?

実際にはのように聞こえますが、現実的にはのようです。

実際には、ゼロ許容値の方針に努めます。あなたのコードの無駄をゼロにし、エラーをゼロにし、ゼロユニットテストに失敗します。そしてあなたはあなたの「カウント」を常にチェックし続けます。クラスに5行のコードを追加します。そのクラスは黄色になります! (そこの警告についてあなたに伝えている日食)...あなたが入り、の修正それらに直ちに。誰かが世界的に警告を発することが起こったときには、将来のある時点ではないでしょう。

言い換えれば、も、を考慮すると、警告をグローバルに無効にすることはできません。

コンパイル時に「かもしれません。が問題になります」という警告が表示されることがあります。しかし、プログラマが合理的なの状況を評価できる状況では、そのような注釈はコンパイラの警告を抑止するための簡単で直接的な方法です(実際にはローカルスコープで作業しています)。

しかし、varargsを理解していないプログラマが間違ってその注釈を誤って使用するかもしれないという前提の中で確かに正しいです。合理的な対処方法は、「コードレビューに、このアノテーションを使用するコードに焦点を当てる」などです。グローバルに警告を無効にする代わりに。

関連する問題