メインコンテンツにスキップ

recursive_constructor_redirect

コンストラクタは、直接的または間接的に自分自身にリダイレクトすることはできません。

説明

#

アナライザは、コンストラクタが直接的または間接的に自分自身にリダイレクトし、無限ループを作成した場合に、この診断を生成します。

#

以下のコードは、生成コンストラクタ C.aC.b が互いにリダイレクトしているため、この診断を生成します。

dart
class C {
  C.a() : this.b();
  C.b() : this.a();
}

以下のコードは、ファクトリコンストラクタ AB が互いにリダイレクトしているため、この診断を生成します。

dart
abstract class A {
  factory A() = B;
}
class B implements A {
  factory B() = A;
  B.named();
}

一般的な修正

#

生成コンストラクタの場合、少なくとも一方のコンストラクタを、別のコンストラクタにリダイレクトしないように定義することで、サイクルを解除します。

dart
class C {
  C.a() : this.b();
  C.b();
}

ファクトリコンストラクタの場合、少なくとも一方のファクトリコンストラクタを、次のいずれかを行うように定義することで、サイクルを解除します。

  • 生成コンストラクタにリダイレクトする
dart
abstract class A {
  factory A() = B;
}
class B implements A {
  factory B() = B.named;
  B.named();
}
  • 別のコンストラクタにリダイレクトしない
dart
abstract class A {
  factory A() = B;
}
class B implements A {
  factory B() {
    return B.named();
  }

  B.named();
}
  • ファクトリコンストラクタではない
dart
abstract class A {
  factory A() = B;
}
class B implements A {
  B();
  B.named();
}