ローカル クラス: メソッド内のクラス - 1

「こんにちは、アミーゴ!」

「もう 1 つの小さなトピックは、ローカル クラスです。」

「これまで見てきたように、クラスは別のファイル内だけでなく、他のクラス内にも作成できます。しかしそれだけではありません。クラスはメソッド内でも作成できます。これらのクラスはローカル クラスと呼ばれます。これらは通常の内部クラスと同じように機能しますが、宣言されているメソッド内で使用できます。」

「画面を見てください。」

class Car
{
 public ArrayListcreatePoliceCars(int count)
 {
  ArrayList result = new ArrayList();

  class PoliceCar extends Car
  {
   int policeNumber;
   PoliceCar(int policeNumber)
  {
   this.policeNumber = policeNumber;
  }
 }

 for(int i = 0; i < count; i++)
     result.add(new PoliceCar(i));
  return result;
 }
}

「では、なぜそのようなクラスが必要なのでしょうか?」

「クラスとそのすべてのコンストラクターとメソッドをメソッド内に置くと、コードはあまり読みやすくなりません。」

「その通りです。全くその通りです。」

「メソッド内で匿名の内部クラスを使用することもできます。しかし、これらのクラスには小さな利点が 1 つあるため、メソッド内で頻繁に使用されます。」

「メソッド内で宣言されたクラスは、そのメソッドのローカル変数を使用できます。」

class Car
{
 public ArrayListcreatePoliceCars(int count)
 {
  ArrayList result = new ArrayList();

  for(int i = 0; i < count; i++)
  {
   final int number = i;
   result.add(new Car()
  {
   int policeNumber = number;
  });
 }
  return result;
 }
}

「しかし、制限が 1 つあります。変数は「読み取り専用」であり、変更できません。」

「その制限が存在する理由は次のとおりです。」

「メソッド内で宣言されたクラスは、キーワード Final を使用して宣言されたメソッドの変数にのみアクセスできます。上の例では、i の値をすぐに PoliceNumber に代入できないことがわかります。代わりに、最初にそれを最終変数番号。」

「メソッドの変数を使用できるのは非常に素晴らしいことです。それを正しく評価していただければ幸いです。ただし、変数を変更できないのは残念です。」

「今日、エリーがなぜ変更できないのか説明してくれるでしょう。その間、私は1時間ほど昼寝をするつもりです。」

「おやすみ、キム。興味深い授業をありがとう。」