JavaRush /Java Blog /Random-JA /コーヒーブレイク #134。Java コードを作成するときに避けるべきこと。Javaでのfinal、finally...

コーヒーブレイク #134。Java コードを作成するときに避けるべきこと。Javaでのfinal、finally、finalizeの使用方法

Random-JA グループに公開済み

Java コードを記述するときに避けるべきこと

出典: Medium 開発者が Java コードを記述するときに犯す一般的な間違いをリストした記事を紹介します。 コーヒーブレイク #134。 Java コードを作成するときに避けるべきこと。 Java での Final、finally、finalize の使用方法 - 1

Enum.values の使用

Enum.values を定期的に使用していたので、これがバグだと考えられていたことに驚きました。ここでの問題は、Enum.values() が仕様上不変のリストであると想定されていることです。これを行うには、呼び出されるたびに列挙値を含む配列の新しいインスタンスを返す必要があります。
public enum Fruits {
    APPLE, PEAR, ORANGE, BANANA;

    public static void main(String[] args) {
        System.out.println(Fruits.values());
        System.out.println(Fruits.values());
    }
}
// output
// [Lcom.test.Fruits;@7ad041f3
// [Lcom.test.Fruits;@251a69d7
ここではメモリ内に 2 つの別個のオブジェクトがあるため、大したことではないように思えるかもしれません。ただし、リクエストの処理時にFruit.values()を使用し、負荷が高い場合は、メモリの問題が発生する可能性があります。これは、キャッシュ用の プライベート静的最終変数 VALUESを導入することで簡単に修正できます。

オプションのパラメータをメソッドパラメータとして渡す

次のコードを考えてみましょう。
LocalDateTime getCurrentTime(Optional<ZoneId> zoneId) {
    return zoneId.stream()
        .map(LocalDateTime::now)
        .findFirst()
        .orElse(LocalDateTime.now(ZoneId.systemDefault()));
}
オプションのパラメーターzoneId を渡し、その存在に基づいて、システムのタイムゾーンで時刻を与えるか、指定されたゾーンを使用するかを決定します。ただし、これは Optional を使用する正しい方法ではありません。これらをパラメータとして使用することは避け、代わりにメソッドのオーバーロードを使用する必要があります。
LocalDateTime getCurrentTime(ZoneId zoneId) {
  return LocalDateTime.now(zoneId);
}

LocalDateTime getCurrentTime() {
  return getCurrentTime(ZoneId.systemDefault());
}
上に示したコードは、読みやすくデバッグがはるかに簡単です。

StringBuilder の使用

Java の文字列は不変です。つまり、一度作成すると編集できなくなります。JVM は文字列プールを維持し、新しい文字列プールを作成する前にString.intern()メソッドを呼び出します。このメソッドは、値に対応する文字列プールからインスタンスを返します (存在する場合)。要素を連結して長い文字列を作成したいとします。
String longString = new StringBuilder()
  .append("start")
  .append("middle")
  .append("middle")
  .append("middle")
  .append("end")
  .toString();
最近、古いバージョンの Java では次のことが行われていたため、これは非常に悪いアイデアであると言われました。
  • 1 行目では、文字列「start」が文字列プールに挿入され、longStringによってポイントされます。
  • 行 2 は、文字列「startmiddle」をプールに追加し、longStringでそれをポイントします。
  • 3行目には「startmiddlemiddle」があります
  • 4行目 - 「startmiddlemiddlemiddle」
  • 最後に 5 行目で「startmiddlemiddlemiddleend」をプールに追加し、longStringをそこにポイントします。
これらの行はすべてプール内に残り、使用されないため、大量の RAM が無駄になります。これを回避するには、StringBuilder を使用します。
String longString = new StringBuilder()
  .append("start")
  .append("middle")
  .append("middle")
  .append("middle")
  .append("end")
  .toString();
StringBuilder は、 toStringメソッドが呼び出された ときに文字列を 1 つだけ作成するため、最初にプールに追加された中間文字列はすべて削除されます。ただし、Java 5 以降では、これはコンパイラによって自動的に行われるため、「+」を使用した文字列連結を使用することをお勧めします。

不要な場合のプリミティブ ラッパーの使用

次の 2 つの断片について考えてみましょう。
int sum = 0;
for (int i = 0; i < 1000 * 1000; i++) {
  sum += i;
}
System.out.println(sum);
Integer sum = 0;
for (int i = 0; i < 1000 * 1000; i++) {
  sum += i;
}
System.out.println(sum);
私のコンピューターでは、最初の例は 2 番目の例より 6 倍速く実行されます。唯一の違いは、整数ラッパー クラスを使用することです。Integer の仕組みは、3 行目で、ランタイムが sum 変数をプリミティブ整数に変換し (自動アンボックス化)、加算が完了した後、結果が新しい Integer クラスにラップされることです。(自動包装)。これは、100 万個の Integer クラスを作成し、200 万個のパッケージ化操作を実行していることを意味しており、劇的な速度低下の説明になります。ラッパー クラスは、コレクションに格納する必要がある場合にのみ使用してください。ただし、Java の将来のバージョンではプリミティブ型のコレクションがサポートされるため、ラッパーは廃止されます。

Javaでのfinal、finally、finalizeの使用方法

出典: Newsshare この記事では、Finalize キーワードがどこで、いつ、なぜ使用されるのか、Java でそれを使用する価値があるのか​​どうかを学びます。また、final、finally、finalize の違いについても学びます。

どこでfinallyブロックが使われているのでしょうか?

Java のfinally ブロックは、コードのクリーンアップ、ファイルのクローズ、接続のクローズなど、コードの重要な部分を格納するために使用されます。Finally ブロックは、例外がスローされたかどうか、またはその例外が処理されたかどうかに関係なく実行されます。最後に、 A には、例外が発生するかどうかに関係なく、すべての重要なステートメントが含まれます。

Java で変数を完成させるにはどうすればよいでしょうか?

最終的な Java 変数を初期化するには 3 つの方法があります。
  • 最終変数は宣言時に初期化できます。このアプローチが最も一般的です。
  • 空の最終変数は、instance-initializer ブロックまたはコンストラクターで初期化されます。
  • 空の最終静的変数は静的ブロック内で初期化されます。

Java で Finalize メソッドを手動で呼び出すことはできますか?

Finalize()メソッドは必須ではなく、オブジェクトがスコープ外になったときに呼び出すことはお勧めできません。なぜなら、 finalize()メソッドがいつ実行されるか (または実行されるかどうか) が事前にわからないからです。一般に、特に必要がない限り、finalize は使用するのに最適な方法ではありません。Java 9 以降、これは非推奨になりました。

ファイナライズメソッドはいつ呼び出されますか?

Finalize()メソッドは、ガベージ コレクションの直前にクリーンアップを実行するために呼び出されます。

ファイナル、最終的に、ファイナライズの違いは何ですか?

Final、finally、finalize の主な違いは、final がアクセス修飾子であり、finally が例外処理のブロックであり、finalize がオブジェクト クラスのメソッドであることです。

Finalメソッドをオーバーライドすることは可能ですか?

いいえ、final として宣言されたメソッドをオーバーライドしたり非表示にしたりすることはできません。

catch なしで try を使用できますか?

はい、 finalブロッ​​クを使用すると、catchブロックなしでtryブロックを作成することができます。ご存知のとおり、try ブロックで System 以外の例外が発生した場合でも、最後のブロックは常に実行されます。

最終メソッドとは何ですか?

Final メソッドは、サブクラスによってオーバーライドまたは非表示にすることはできません。これらは、クラスの機能や一貫性にとって重要な可能性があるメソッドを変更するサブクラスの予期しない動作を防ぐために使用されます。

コンストラクターは最終的なものにできますか?

コンストラクターをfinalとして宣言することはできません。コンパイラは常に「final modifier not allowed」のようなエラーをスローします。Final をメソッドに適用すると、そのメソッドをサブクラスでオーバーライドできないことを意味します。コンストラクターは通常のメソッドではありません。

finally キーワードは何に使用されますか?

finally キーワードは、try ブロックの後にコードのブロックを作成するために使用されます。Finally ブロックは、例外が発生したかどうかに関係なく、常に実行されます。Finally ブロックを使用すると、保護されたコードで何が起こっているかに関係なく、実行したい unwind タイプのステートメントを実行できます。

結局何の役に立つの?

Java のfinally ブロックは、接続の終了などのコードの一部を実行するために使用されるブロックです。Java のfinally ブロックは、例外が処理されるかどうかに関係なく、常に実行されます。したがって、例外が発生するかどうかに関係なく、出力する必要があるすべての必要なステートメントが含まれています。

Finalize メソッドが保護されているのはなぜですか?

Finalize()メソッドのアクセス修飾子が保護されているのはなぜですか? なぜ公開できないのでしょうか?JVM 以外から呼び出すべきではないため、パブリックではありません。ただし、動作を定義する必要があるサブクラスによってオーバーライドできるように、保護する必要があります。

Javaではfinalizeメソッドが常に呼び出されますか?

Finalize メソッドは、オブジェクトがガベージ コレクションされる直前に呼び出されます。これは、ガベージ コレクションの対象になった後はいつでも発生する可能性があります。オブジェクトがガベージ コレクションされない (したがって、finalize が呼び出されない) 可能性は十分にあります。

投げる と 投げる はどう違いますか?

throw キーワードは、意図的に例外をスローするために使用されます。throws キーワードは、カンマで区切って 1 つ以上の例外を宣言するために使用されます。throw を使用すると、例外が 1 つだけスローされます。

try catch キーワードとfinally キーワードの違いは何ですか?

これらは 2 つの異なる概念です。catch ブロックは、try ブロックで例外が発生した場合にのみ実行されます。例外がスローされたかどうかに関係なく、finally ブロックは常に try(-catch) ブロックの後に実行されます。

Javaではtryなしでfinallyを使用できますか?

Finally ブロックは Try ブロックに関連付ける必要があります。Try ブロックなしでは Final を使用できません。常に実行する必要があるステートメントをこのブロックに配置する必要があります。

最終メソッドを継承できますか?

最終メソッドは継承されますか? はい、最終メソッドは継承されますが、オーバーライドすることはできません。

オーバーライドできないメソッドはどれですか?

メソッドのオーバーライドは実行時の動的リンクに基づいており、静的メソッドはコンパイル時に静的リンクを使用してバインドされるため、静的メソッドをオーバーライドすることはできません。したがって、静的メソッドをオーバーライドすることはできません。

最終メソッドがオーバーライドされるとどうなりますか?

親クラスで宣言された Final メソッドを子クラスでオーバーライドすることはできません。最後のメソッドをオーバーライドしようとすると、コンパイラはコンパイル時に例外をスローします。

Final キーワードと Finalize メソッドは同じように機能しますか?

名前が似ていることを除いて、機能に類似点はありません。Final キーワードは、Java のクラス、メソッド、または変数で使用できます。Java では、final クラスは拡張できず、final メソッドはオーバーライドできず、final 変数は変更できません。

Javaのスーパーキーワードとは何ですか?

Java の super キーワードは、親クラスの直接のオブジェクトを参照するために使用される参照変数です。サブクラスをインスタンス化するたびに、親クラスのインスタンスが並行して作成され、参照変数 super によって参照されます。super キーワードを使用すると、親クラスのメソッドを直接呼び出すことができます。

static キーワードと Final キーワードの違いは何ですか?

static キーワードと Final キーワードの主な違いは、static キーワードは、そのクラスのオブジェクトから独立して使用できるクラスのメンバーを定義するために使用されることです。Final キーワードは、定数変数、オーバーライドできないメソッド、および継承できないクラスを宣言するために使用されます。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION