将来を見据えたウェブ・アプリケーションの構築:The Codestのエキスパート・チームによる洞察
The Codestが、最先端技術を駆使してスケーラブルでインタラクティブなウェブアプリケーションを作成し、あらゆるプラットフォームでシームレスなユーザー体験を提供することにどのように秀でているかをご覧ください。The Codestの専門知識がどのようにデジタルトランスフォーメーションとビジネス...
Javaでのプログラミングで避けるべき間違いとは?次の記事では、この質問にお答えします。
ジャワ の世界で確固たる地位を築いている人気言語である。 ソフトウェア開発.これは強力で汎用性の高いプログラミング言語である。世界中で約30億台のデバイスが ジャワ そのため、少なくとも30億回以上のミスがあった。この記事では、これ以上ミスを犯さないようにする方法に焦点を当てよう。
これは私が出くわしたミスの中で圧倒的に多いものだ。私もキャリアの初期には何度もやってしまった。この間違いは、反復処理中にコレクションを修正しようとしたときに起こります。その ConcurrentModificationException
複数のスレッドで作業する場合にも発生する可能性があるが、今は基本的なシナリオに集中しよう。
を持っていると仮定する。 コレクション
ユーザーの中には大人もいればそうでない人もいる。あなたの仕事は、子供をフィルタリングすることです。
for (ユーザー : ユーザー) {
if (!user.isAdult()) { { { (!user.isAdult())
users.remove(user);
}
}
前述した コード を得ることに終わる。 ConcurrentModificationException
.どこで間違ったのか?反復を終える前に、いくつかの要素を削除しようとした。それが例外の引き金になった。
その場合に役立つアプローチがいくつかある。まず第一に ジャワ 8の良さ ストリーム
.
List adults = users.stream()
.filter(User::isAdult)
.toList();
を使用している。 述語
フィルタを使うことで、前の条件の逆を実行したことになる。このようなアプローチの利点は、除去の後に他の関数を連鎖させるのが簡単なことだ。 地図
.しかし、お願いだから、以下のようなことはしないでほしい:
users.stream()
.filter(v -> !v.isAdult())
.forEach(users::remove);
で終わる可能性もある。 ConcurrentModificationException
なぜなら、ストリーム・ソースを変更しているからです。また、デバッグしにくい例外が発生する可能性もある。
解決するには ConcurrentModificationException
シングルスレッドシナリオでは、直接 イテレータ
そして 削除()
メソッドを使うか、あるいは単純に反復中に要素を削除しないようにすることもできる。しかし、私のお勧めは ストリーム
- 2022年だ。
サイバーセキュリティーに関わるようになってきている今、少なくとも1つのことに触れないと、私は自分自身に忠実ではないだろう。 ジャワのミス セキュリティ問題につながる可能性がある。ユーザーから受け取ったパスワードを ストリング
それこそが、あなたが恐れるべきものなのだ。
の問題(あるいは利点かもしれない)。 ストリング
は不変である。サイバーセキュアな世界では、一度作成した値を消去することができないため、潜在的な脅威となる。 ストリング
オブジェクトにアクセスできる。あなたのコンピュータのメモリにアクセスした攻撃者は、そこでプレーンテキストのパスワードを見つけることができる。
次に ジャワ はJVMによってインターンされ、PermGen空間かヒープ空間に格納される。JVMで ストリング
オブジェクトからパスワードが削除されると、そのパスワードはキャッシュされ、ガベージコレクタが処理を開始したときに削除されます。ガベージ・コレクターは非決定論的な方法で動作するため、パスワードがいつStringプールから削除されるかはわかりません。
推奨されるアプローチは char[]
としてパスワードの保存をサポートするライブラリがあればなおよい。 char[]
例えばパスワード4j.その char[]
配列は変更可能であり、初期化後に変更することができる。パスワードを処理した後で char[]
パスワード配列にランダムな文字を書き込む。攻撃者がコンピュータのメモリにアクセスした場合、ユーザのパスワードとは無関係のランダムな値が表示されるだけです。
初心者や上級プログラマーは、例外の正しい扱い方を知らない。彼らの主な罪は、例外を無視することだ。それは決して良い方法ではない。
しかし、残念ながら、私たちは、すべての人に適合する銀の弾丸のような解決策を提供することはできません。 例外
のシナリオに出くわす。それぞれのケースについて個別に考える必要がある。しかし、私たちはそのテーマに着手する方法について、いくつかのアドバイスをすることができます。
無視 例外
のようなことは決して良い習慣ではない。 例外
を無視してはならない。
try {...} catch(Exception e) { log(e); }.
が正しいアプローチであることは稀である。 例外
を扱う。
レスロー 例外
ユーザーにエラーダイアログを表示するか、少なくともログに包括的なメッセージを追加する。
もし例外を処理しないままにしておいたのなら(処理すべきではないが)、せめてコメントで説明してほしい。
残念なことに、Javaの関数が、場合によっては ヌル
.問題は、このような関数がクライアントに対して、結果に対するヌルチェックを強制することである。これがないと NullPointerException
がスローされる。
もうひとつは ヌル
価値がある。なぜそんなことを考えたのですか?このような場合、関数はヌルチェックを行わなければならない。サードパーティのライブラリを使う場合、関数の内部を変更することはできない。ではどうする?
さらに重要なことは、あなたのコードを読んだ他の開発者が、あなたが ヌル
なぜそんな奇抜な方法を選んだのか、おそらく混乱するだろう。
を返さないでください。 ヌル
価値!今まで関数が何らかの コレクション
を返すことができます。 コレクション
.単一のオブジェクトを扱う場合は、ヌル・オブジェクト・デザイン・パターンを利用することができます。なぜなら ジャワ 8 のように実装されている。 オプション
.それ以外では、最も推奨されない方法として、次のようなものがある。 例外
.
最もポピュラーな(あるいはFizzBuzzに次いで2番目にポピュラーな)面接の質問なのだから。もうお分かりのように ストリング
オブジェクトは ジャワ - 一度作成されたものは変更できない。だから ストリング
リテラルは、多くの不必要なメモリ割り当てを意味する。連結 ストリング
オブジェクトを毎回作成するには、一時的な 文字列ビルダー
オブジェクトを作成し、それを文字列に戻す。したがって、この解決策は、大量の文字を組み合わせたい場合には絶対に適さない。
この問題を解決するには 文字列ビルダー
.これは、簡単に操作できる変更可能なオブジェクトを作成する。もちろん、いつでも 文字列バッファ
もし プロジェクト はコンカレント・コンテキストで使用される。
ソフトウェアを開発するとき、使用する言語の基本を知ることは必須だが、それだけでは十分ではない。新しい機能を実装するときに出くわすアルゴリズム上の問題の多くは、すでに他の誰かが解決している。セキュリティ・アルゴリズムをゼロから実装している人を何度も見たことがある。そのようなアプローチでは、エラーが起こりがちです。このような複雑な解決策を一人で徹底的にテストすることはできません。の集合的な知識が必要なのです。 チーム 一人の天才プログラマーの偉大さよりも、中上級プログラマーで構成されたチームの方が常に優れている。 Java開発者.車輪を再発明する必要はなく、既存のソリューションをお客様のニーズに合わせてアレンジするだけです。
あなたが取り組んでいる問題に取り組んでいるライブラリを検索してみてください。似たような解決策を探してみてください。ウェブ上で利用可能なライブラリの多くは無料で、経験豊富な開発者やJavaコミュニティ全体によって磨かれ、テストされています。それらを利用することを恐れないでください。
私たちのコードは常に完璧に動くと信じたくなる。コードのテストを書かないことは、次のような最悪の罪である。 ジャワ ソフトウェア開発者.私たちの多くは、ユニットテストの代わりに手動テストや探索的テストを好む。 バグのない世界最高のコードをプロジェクトに提供することに集中できるのに、なぜテストを書くのに時間を浪費するのでしょうか?現実は残酷で、テストを書かずに高品質のコードを提供することはできない。
自分のコードには必ずテストを用意すべきだ。TDDのアプローチは保守が容易でないことは承知しているが、少なくとも、コードが実行されるすべての条件をカバーするテストを用意すべきだ。これには例外的な状況のテストも含まれる。ユニットテストは必要だ。もしあなたのコードがリファクタリングしやすく、今後の開発でも拡張可能であることを確認したいのであれば、プロジェクトのすべての機能に対してユニットテストを提供しなければなりません。
もうひとつ。テストコードの水準を高く保つこと。これはボブおじさんのアドバイスだが、私もまったく同感だ。
さらに、他の種類のテストについても忘れてはならない。統合テストは、すべてのプロジェクトで考慮すべきものだ。
公私混同でしょう?忘れるわけがない。もっとたくさんあることがわかった。あなたが最初に学び始めたとき ジャワ保護されたアクセス修飾子について学んだはずだ。場合によっては役に立つこともあるので、その存在は知っておいて損はない。
Java開発者 パッケージ・スコープのことを忘れている人が多いようだ。パッケージ・スコープは暗黙的なものであり ジャワ キーワードパッケージ・スコープは重要だ。これにより、プロテクトされたメソッドをテストすることができます。プロテクトされた項目は、パッケージが同じであればテストクラスのパスからアクセスできます。
protected修飾子についてと、パッケージ・スコープでテストできることを覚えておいてほしい。
学んだ次のステップ ジャワ SEは走り方を学ぶ ジャワ サーバー上でエンタープライズ・レベルのアプリケーションを作る方法。
JavaEEについては膨大な数のチュートリアルがあるため、初心者はJavaEEを学習する際に陥りがちだ。Javaで考える'でさえ Javaプログラマー'のバイブルには、JavaEEのことが書かれているだけで、他のオプションについては何も書かれていない。
JavaEEは過去の歌だ。今やSpringは必須アイテムであり、Java EEは持っているだけでありがたい存在だ。最新のエンタープライズ・レベルのアプリケーションはすべてSpringを使っている。 こちら.
続きを読む