Javaでよくあるミスを防ぐ方法
Java開発の生産性を高める
世界中で900万人*もの開発者が利用するJava(Oracle Corporation)は、世界で最も人気のあるプログラミング言語の一つです。Javaは非常に汎用性が高く、Java Runtime Environment(JRE)をサポートするあらゆるデバイスでプログラムを実行できるため、多くのアプリケーションフレームワークがJavaを基盤として構築されてきました。開発者主導のコミュニティは非常に活発であり、プログラミング初心者に対する手厚いサポート体制も、Javaの人気が衰えない理由の一つです。
Javaは歴史が長いため、コミュニティでは長年にわたり、標準規格、ツール、コーディングパターンが整備され、開発者が繰り返し直面する一般的なミスへの対策が積み重ねられてきました。こうしたコミュニティ主導の取り組みには、「Javaでのアプリケーション開発において、開発者の生産性を最大限に高める」という共通の目的があります。しかし、ベストプラクティスやパターンを実際のコードに適用する責任は、最終的に開発者自身にあります。優れた慣習の適用方法は多岐にわたるため、コミュニティ内で意見が分かれることも多く、コーディング手法を標準化するのは困難です。開発者はオンラインコミュニティで助けを求めることがありますが、意図せず不適切な解決策を提示されてしまうケースも少なくありません。
開発者がJavaの一般的なコーディング問題に対して安全な解決策を実装できるよう、私たちはIntelliJプラグイン「Sensei」を開発しました。Senseiは、個人や組織が定義したレシピ(ルール)に基づいて、不適切なコーディングパターンを修正します。Senseiを活用すれば、Javaでよくあるミス(落とし穴)をワンクリックで特定し、修正することが可能です。
SenseiがどのようにJavaの一般的なコーディングミスを解決し、開発者の生産性を向上させるのか、続きをご覧ください。
開発者を悩ませる繰り返されるミス
よくあるミスの一例として、ラッパー値の不適切な等価比較が挙げられます。予期せぬ結果を防ぐため、ボックス化されたプリミティブ値の比較には、参照比較演算子(==)ではなく、equalsメソッドを使用する必要があります。
例えば、-128から127の範囲にあるInteger値に対して参照比較演算子を使用した場合、通常はequalsメソッドと同じ結果になります。しかし、この範囲外の値で同じ比較を行うと、結果は異なります。これは、Javaが前述の範囲内のInteger値に対して定数プールを保持しているためです。equalsメソッドを使用すれば常に期待通りの結果が得られるため、こちらが正しい比較方法となります。
この例では、等価性のチェックに演算子(==)を誤って使用しています。
その結果、出力は以下のようになります。
true
false
false
true
正しい比較方法は、equalsメソッドを使用することです。
その場合の出力は以下のようになります。
true
false
true
false
このよく知られたベストプラクティスは以前から存在していますが、レガシーコードでは誤った実装のまま放置され、最も不都合なタイミングで問題を引き起こすことがよくあります。そこで私たちは、そのような望ましくないコーディングパターンをローカルで特定し、Senseiを使ってワンクリックで修正を適用できるレシピ(ルール)を作成しました。
Senseiは、コーディング中に望ましくないコードをスキャンして修正できる、カスタマイズ性の高いIDEプラグインです。数百種類のダウンロード可能なコード変換・移行レシピ(ルール)が用意されているほか、独自のレシピを作成する機能も備えています。Senseiを使えば、開発者はコーディング中に不適切なコードパターンを修正できるため、より高品質なコードを迅速に提供し、最終的にはチームやプロジェクト全体で一貫した標準的な書き方を実現できます。
SenseiでJavaの一般的な問題を修正する方法
Senseiでは独自のレシピを作成できるため、前述のミスを修正するためのレシピを作成しました。
この例では、ボックス化されたプリミティブ型で比較演算子(==)が使用されている箇所を特定します。
Senseiのレシピは(YAML形式で)以下のようになります。
上記の設定により、コーディング中やファイル全体、設定したスコープ、さらにはコードベース全体で、繰り返される不適切なパターンを検索できます。パターンが見つかったら、オンラインで検索することなく即座に修正できるのが理想的です。Senseiでは、コードの追加・編集・削除を行う修正機能を定義できます。必要に応じて複数の修正案を提示し、開発者が最適なものを選択できるようにすることも可能です。
今回の例では、比較演算子(==)の代わりにequalsメソッドを使用するように書き換えます。
利用可能な修正は次のように記述されます。
仕組み:

標準的なコーディングガイドラインを簡単に実装する
「Java Gotchas Cookbook」には、一般的なミスを回避し、コードをクリーンかつ安全に保つための22のレシピが収録されています。オブジェクトの等価性、例外処理、正規表現、コレクションなど、Javaの言語機能やAPIの不適切または安全でない使用を検出します。Senseiとこのクックブックを採用することで、最初からより良いコードを書けるようになるだけでなく、チームやプロジェクト、組織独自のニーズに合わせて独自のレシピを作成することも可能です。
これは、Senseiを使ってプロジェクトを標準化する多くの方法のほんの一例に過ぎません。プルリクエストのレビュー中や自身のコーディング中に頻繁に遭遇するアンチパターンや、手動で行っているコード変換がないか常に目を光らせておきましょう。開発者が守り忘れてしまいがちなコーディングガイドラインがある場合は、それをレシピに変換することで、承認済みのコード変換を開発者が自信を持って適用できるようになります。
今すぐSenseiをインストールし、Java Gotchas Cookbookを有効にして、生産性の高い開発体験を実現しましょう。https://sensei.securecodewarrior.com/cookbooks/scw:java
*2021年、State of Developer Nation、https://www.developernation.net/developer-reports/de20
AI主導の開発をリリース前にガバナンスする
AIを活用したリスク測定、コミット時のセキュアコーディングポリシーの強制、そしてSDLC全体を通じたセキュアなデリバリーの加速を実現します。
他のブログ記事を見る
セキュアコーディング、AIガバナンス、ソフトウェアリスク管理に関する専門的なコンテンツをご覧ください。
%252520%252520(3).avif)
Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Security as culture: How Blue Prism cultivates world-class secure developers
Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed
AIを活用した開発をリリース前にセキュアに
開発者のリスクを可視化し、ポリシーを適用することで、ソフトウェア開発ライフサイクル全体における脆弱性を未然に防ぎます。



.avif)