Javaのよくあるミスを防ぐには

2022年02月02日掲載
ワンダー・ネト著
ケーススタディ

Javaのよくあるミスを防ぐには

2022年02月02日掲載
ワンダー・ネト著
リソースを見る
リソースを見る

より生産性の高いJava開発者になるために

全世界で900万人の開発者がいる*Java(Oracle Corporation)は、世界で最も人気のあるプログラミング言語の一つです。Javaは、すべてのJavaプログラムを実行する環境であるJava Runtime Environment(JRE)をサポートするさまざまなデバイス上でプログラムを実行できる、非常に汎用性の高い言語であるため、多くのアプリケーション・フレームワークがJava上に構築されています。開発者主導のコミュニティは非常に活発で、新人プログラマーへのサポートも充実しているため、その人気はますます高まっています。

Javaは長い歴史を持っているので、コミュニティは何年もかけて標準、ツール、コーディングパターンを開発し、開発者が何度も直面する共通のミスを軽減してきました。このようなコミュニティ主導の取り組みには、共通の目的があります。それは、Javaを使ってアプリケーションを開発する際に、開発者ができるだけ生産性を高められるようにすることです。しかし、ベスト・プラクティスやパターンをアプリケーション・コードに適用するとなると、責任は開発者にあります。グッド・プラクティスの実施は非常に多様であり、コミュニティ内で意見が大きく異なる場合には、コーディング・プラクティスに対する標準的なアプローチをとることは困難です。開発者は、オンライン・コミュニティに助けを求めることになりますが、これは時に、コーディングの問題に対する安全でない解決策を与えてしまうことになります。

開発者が一般的なJavaコーディングの問題に対する安全なソリューションを実装できるように、私たちはSensei を作成しました。これは、プロフェッショナルな環境で、あなたやあなたの組織が定義したレシピ(またはルール)に従って、悪いコーディングパターンを修正するためのIntelliJプラグインです。Sensei を使用すると、開発者は1回のクリックで一般的なJavaのミス(gotchas)を特定して修正することができます。

続きを読むSensei は、よくあるJavaのコーディングミスを解決することで、開発者の生産性をどのように向上させるかを知ることができます。

開発者を悩ませるミスの数々

そのようなよくある間違いの一例が、ラッパーの値の不正確な等値性チェックです。ボックス化されたプリミティブの値は、予期せぬ結果を防ぐために、参照比較演算子(==)ではなく、equalsメソッドを使って比較する必要があります。

例えば、整数値の範囲が-128~127の場合に参照比較演算子を使用すると、(通常は)equalsメソッドと同じ動作をします。しかし、この範囲外の値で同じ比較を行うと、結果は異なります。これは、Javaが上記の範囲のInteger値に対して一定のプールを維持しているためです。equalsメソッドを使用すれば、常に期待通りの結果が得られるので、比較の方法としては正しいと言えます。

この例では、演算子(==)を使って等質性を確認している点が間違っています。

その結果、次のように出力されます。

正しい比較方法は、equalsメソッドを使用することです。

そして、その出力は

このよく知られたベストプラクティスは、かなり以前から存在していますが、レガシーコードに誤って実装されていることが多く、最も不適切なタイミングで頭をもたげようとしています。そこで私たちは、このような望ましくないコーディングパターンをローカルに特定し、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

リソースを見る
リソースを見る

著者

ワンダーネトウヨ

もっと知りたい?

セキュアコーディングに関する最新の知見をブログでご紹介しています。

当社の豊富なリソースライブラリは、安全なコーディングアップスキルに対する人間的なアプローチを強化することを目的としています。

ブログを見る
もっと知りたい?

開発者主導のセキュリティに関する最新の研究成果を入手する

ホワイトペーパーからウェビナーまで、開発者主導のセキュアコーディングを始めるために役立つリソースが満載のリソースライブラリです。今すぐご覧ください。

リソース・ハブ

Javaのよくあるミスを防ぐには

2022年02月02日掲載
ワンダー・ネト著

より生産性の高いJava開発者になるために

全世界で900万人の開発者がいる*Java(Oracle Corporation)は、世界で最も人気のあるプログラミング言語の一つです。Javaは、すべてのJavaプログラムを実行する環境であるJava Runtime Environment(JRE)をサポートするさまざまなデバイス上でプログラムを実行できる、非常に汎用性の高い言語であるため、多くのアプリケーション・フレームワークがJava上に構築されています。開発者主導のコミュニティは非常に活発で、新人プログラマーへのサポートも充実しているため、その人気はますます高まっています。

Javaは長い歴史を持っているので、コミュニティは何年もかけて標準、ツール、コーディングパターンを開発し、開発者が何度も直面する共通のミスを軽減してきました。このようなコミュニティ主導の取り組みには、共通の目的があります。それは、Javaを使ってアプリケーションを開発する際に、開発者ができるだけ生産性を高められるようにすることです。しかし、ベスト・プラクティスやパターンをアプリケーション・コードに適用するとなると、責任は開発者にあります。グッド・プラクティスの実施は非常に多様であり、コミュニティ内で意見が大きく異なる場合には、コーディング・プラクティスに対する標準的なアプローチをとることは困難です。開発者は、オンライン・コミュニティに助けを求めることになりますが、これは時に、コーディングの問題に対する安全でない解決策を与えてしまうことになります。

開発者が一般的なJavaコーディングの問題に対する安全なソリューションを実装できるように、私たちはSensei を作成しました。これは、プロフェッショナルな環境で、あなたやあなたの組織が定義したレシピ(またはルール)に従って、悪いコーディングパターンを修正するためのIntelliJプラグインです。Sensei を使用すると、開発者は1回のクリックで一般的なJavaのミス(gotchas)を特定して修正することができます。

続きを読むSensei は、よくあるJavaのコーディングミスを解決することで、開発者の生産性をどのように向上させるかを知ることができます。

開発者を悩ませるミスの数々

そのようなよくある間違いの一例が、ラッパーの値の不正確な等値性チェックです。ボックス化されたプリミティブの値は、予期せぬ結果を防ぐために、参照比較演算子(==)ではなく、equalsメソッドを使って比較する必要があります。

例えば、整数値の範囲が-128~127の場合に参照比較演算子を使用すると、(通常は)equalsメソッドと同じ動作をします。しかし、この範囲外の値で同じ比較を行うと、結果は異なります。これは、Javaが上記の範囲のInteger値に対して一定のプールを維持しているためです。equalsメソッドを使用すれば、常に期待通りの結果が得られるので、比較の方法としては正しいと言えます。

この例では、演算子(==)を使って等質性を確認している点が間違っています。

その結果、次のように出力されます。

正しい比較方法は、equalsメソッドを使用することです。

そして、その出力は

このよく知られたベストプラクティスは、かなり以前から存在していますが、レガシーコードに誤って実装されていることが多く、最も不適切なタイミングで頭をもたげようとしています。そこで私たちは、このような望ましくないコーディングパターンをローカルに特定し、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

弊社製品や関連するセキュアコーディングのトピックに関する情報をお送りする許可をお願いします。当社は、お客様の個人情報を細心の注意を払って取り扱い、マーケティング目的で他社に販売することは決してありません。

フォームを送信するには、「Analytics」のCookieを有効にしてください。完了したら、再度無効にしてください。