ブログ

Javaでよくあるミスを防ぐ方法

February 2, 2022
ワンダー・ネト
ノートパソコンを膝に乗せてタイピングをしている3人を上から見た様子。

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 code defining Comparison class with method comparing two Integer objects using == operator.

標準的なコーディングガイドラインを簡単に実装する

「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ガバナンス、ソフトウェアリスク管理に関する専門的なコンテンツをご覧ください。

すべて表示
導入事例
フィルターラベル
これはdivブロック内のテキストです。

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.

詳細はこちら
導入事例
フィルターラベル
これはdivブロック内のテキストです。

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

詳細はこちら
導入事例
フィルターラベル
これはdivブロック内のテキストです。

セキュリティ文化の統一:Sageはいかにしてチャンピオンプログラムを構築したか

Sageがどのようにして柔軟かつ関係性を重視したアプローチでセキュリティを強化し、200名以上のセキュリティチャンピオンを育成して、目に見えるリスク低減を実現したのかをご紹介します。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

2026年サイバーセキュリティ意識向上月間:企業防衛に不可欠なAIセキュリティの理解

主要なAI企業の多くが、安全対策が追いつくまでの間、AI開発を世界的に減速させるよう公に呼びかける事態となっています。しかし現実には、深刻なセキュリティ問題はすでに顕在化しています。AI導入に伴う金銭的コストやリスクが増大し続ける中、多くのセキュリティリーダーや経営陣は差し迫った状況に追い込まれています。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

イネーブラー8:プログラムのブランディング

セキュアコーディングプログラムを成功させるには、優れたコンテンツ以上のものが必要です。イネーブラー8では、ブランディングによって参加を「憧れのステータスを得る体験」へと変える方法を解説します。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

すべての従業員が今、AIサイバーセキュリティの最前線に立っている

エンタープライズテクノロジーの状況は、手遅れになるまで誰も予測できなかったほどの速さで変化しています。私たちは今、人間が書いたコードと基本的なコパイロット支援の時代から、エージェント型開発ライフサイクル(ADLC)の時代へと正式に足を踏み入れました。自律型AIエージェントは、複数の機能にわたってかつてない効率性をもたらす一方で、全く新しい種類のセキュリティリスクや規制リスクも引き起こしています。

詳細はこちら

AIを活用した開発をリリース前にセキュアに

開発者のリスクを可視化し、ポリシーを適用することで、ソフトウェア開発ライフサイクル全体における脆弱性を未然に防ぎます。

デモを予約する
該当する項目が見つかりません。