Javaのローカルクラス(メソッドまたは{}で囲まれたブロックで宣言するクラス)について質問があります。
ローカルクラスをfinalとして宣言しない理由はありますか?ローカルクラスから他のクラスを継承することはできませんが(同じスコープで定義されていない場合)、finalとして宣言すると、コンパイラーによってコードがはるかに単純になる可能性がありますか?
ありがとうございました!
Javaのローカルクラス(メソッドまたは{}で囲まれたブロックで宣言するクラス)について質問があります。
ローカルクラスをfinalとして宣言しない理由はありますか?ローカルクラスから他のクラスを継承することはできませんが(同じスコープで定義されていない場合)、finalとして宣言すると、コンパイラーによってコードがはるかに単純になる可能性がありますか?
ありがとうございました!
匿名のクラスとローカルのクラスについて、人々は少し混乱しているようです。これはローカルクラスです:
public void m() {
class MyClass{}
MyClass cl = new MyClass();
}
finalを宣言することはできますMyClass
が、実際にはそれを継承することが可能であるため、Javaの他の場所では、これを回避するためにfinalを宣言できます。
public void m() {
class MyClass{}
MyClass cl = new MyClass();
class MyOtherClass extends MyClass{}
MyOtherClass cl2 = new MyOtherClass();
}
私の知る限り、匿名のクラスは最終的なものとは見なされません。ただし、構文的にはそれらから継承する方法がないため、継承するには強力なクラスファイルハックが必要になります。
明示的に継承を目指す場合を除いて、いかなる場合でもfinalを宣言しない理由はありません。
ほとんどの場合、目立った実際的な結果がないため、そうしない理由はほとんど過失であると思います。FindBugsのようないくつかのコード分析ツールは、フィールドがfinalと宣言される可能性がある場合に警告します。
final
非常に良い答えを持つキーワードの普遍的な使用についての質問はここで見つけることができます
それがあなたのコードの不必要なキーワードであることを除いて、そうしない理由はありません。すなわち。そうしない理由はなく、そうする理由もありません。クラスがメソッド内で宣言されている場合、他の場所からアクセスできないため、サブクラス化できません。では、なぜできないことを防ぐのでしょうか。
したがって、単語を追加しても動作はまったく変わりませんが、コードが乱雑になります。誰かが「なぜこのクラスは決勝戦なのか、何か派手なものが欠けているのか」と思うかもしれません。
「メソッドで宣言するクラス」は匿名クラスであり、「{}で囲まれたブロックで宣言するクラス」は内部クラスです。
匿名クラスはfinal
、継承する方法がないため、として宣言することはできません。
内部クラスはfinal
、そのサブクラスがない限り、存在する可能性があります。