プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

DartのHashSetで存在しないメソッドを呼び出した場合の処理

この記事は 2026 年 9 月 1 日に投稿しました。

目次

  1. はじめに
  2. DartのHashSetで存在しないメソッドを呼び出した場合の処理
  3. noSuchMethodメソッドの基本的な使い方
  4. HashSetでnoSuchMethodが呼び出される場合
  5. noSuchMethodメソッドを使用する場合の注意点
  6. おわりに

1. はじめに

こんにちは、iOS のエディタアプリPWEditorとその後継PWEditorNextの開発者の二俣です。
2018年5月から毎日技術ブログを更新しています。

今回はDartHashSetで利用できるnoSuchMethodメソッドについてです。

目次へ

2. DartのHashSetで存在しないメソッドを呼び出した場合の処理

DartHashSetObjectを継承しているため、noSuchMethodメソッドを持っています。

noSuchMethodメソッドは、オブジェクトに存在しないメソッドやプロパティへアクセスしたときに呼び出されるメソッドです。

形式は以下になります。

dynamic noSuchMethod(Invocation invocation)

通常、noSuchMethodは自動的に呼び出されます。HashSetに存在しないメソッドを実行すると、デフォルトではNoSuchMethodErrorが発生します。

import 'dart:collection';

void main() {
  final numbers = HashSet<int>.from([1, 2, 3]);
  final dynamic values = numbers;

  values.unknownMethod();
}

この例では、HashSetにunknownMethodというメソッドが存在しないため、noSuchMethodが呼び出され、例外が発生します。

目次へ

3. noSuchMethodメソッドの基本的な使い方

noSuchMethodの引数であるInvocationには、呼び出されたメソッド名や引数などの情報が格納されています。

次の例では、noSuchMethodをオーバーライドして、呼び出されたメソッド名を表示しています。

import 'dart:collection';

class CustomHashSet<E> extends HashSet<E> {
  @override
  dynamic noSuchMethod(Invocation invocation) {
    print('存在しないメンバーが呼び出されました');
    print('メンバー名: ${invocation.memberName}');
    return null;
  }
}

void main() {
  final values = CustomHashSet<int>();
  final dynamic dynamicValues = values;

  dynamicValues.unknownMethod(10);
}

Invocation.memberNameには、呼び出されたメソッド名を表すシンボルが格納されます。positionalArgumentsnamedArgumentsから、渡された引数も取得できます。

目次へ

4. HashSetでnoSuchMethodが呼び出される場合

HashSetが本来持っているaddremovecontainsなどのメソッドを呼び出した場合、noSuchMethodは呼び出されません。

import 'dart:collection';

void main() {
  final numbers = HashSet<int>.from([1, 2, 3]);

  print(numbers.contains(2)); // true
  numbers.add(4);
  numbers.remove(1);
  print(numbers); // {2, 3, 4}
}

一方、dynamicとして扱って存在しないメソッドを呼び出した場合は、noSuchMethodの処理対象になります。

final dynamic values = HashSet<int>();

try {
  values.findValue();
} on NoSuchMethodError catch (error) {
  print(error);
}

noSuchMethodは、動的なAPIの呼び出しを受け付けるラッパーやモックオブジェクトを作成する場合などに利用できます。ただし、通常のHashSet操作のためにオーバーライドする必要はありません。

目次へ

5. noSuchMethodメソッドを使用する場合の注意点

通常はNoSuchMethodErrorが発生する

HashSetを通常の静的な型で扱い、存在しないメソッドを呼び出そうとすると、コンパイル時にエラーになります。実行時にnoSuchMethodを呼び出すには、dynamicなどを使用します。

オーバーライドする場合はsuperを呼び出す

独自クラスでnoSuchMethodをオーバーライドする場合、処理できない呼び出しはsuper.noSuchMethod(invocation)へ渡す方法があります。

@override
dynamic noSuchMethod(Invocation invocation) {
  if (invocation.memberName == #unknownMethod) {
    return '独自の結果';
  }

  return super.noSuchMethod(invocation);
}

型安全性が低下する

dynamicを使用すると、メソッド名や引数の間違いをコンパイル時に検出できません。可能な限り、HashSetをHashSet<E>Set<E>として扱い、通常のメソッド呼び出しを使用してください。

HashSetの要素操作とは別の機能

noSuchMethodはHashSetの要素を検索、追加、削除するためのメソッドではありません。
HashSetの要素を操作する場合は、addremovecontainslookupなどのメソッドを使用します。

リファレンス

Dart

DartPad

HashSet

Object.noSuchMethod

Invocation

目次へ

6. おわりに

DartHashSetで存在しないメソッドを呼び出すと、noSuchMethodメソッドが呼び出されます。

dynamic values = HashSet<int>();
values.unknownMethod();

HashSetでは、デフォルトのnoSuchMethodによりNoSuchMethodErrorが発生します。独自クラスでオーバーライドすれば、存在しないメソッドの呼び出しを独自に処理することもできます。

ただし、dynamicを使用すると型安全性が低下するため、通常のHashSet操作ではaddcontainsなど、HashSetが提供するメソッドを利用するようにしてください。

目次へ


私が技術者として所属している ニューラル では、 組み込み・制御系ソフトウェアを中心に、モバイルアプリや業務アプリなど、さまざまなソフトウェアの開発を行っています。

組み込み分野では、リアルタイムOSを利用したシステム開発をはじめ、弊社製品のハイブリッドOS Bi-OS など、長年培ってきた組み込み・制御系の技術を活かした開発に取り組んでいます。

また、iOS(Swift/SwiftUI)やWindows(C#)をはじめとしたアプリケーション開発、Webシステムの開発などにも対応しています。

組み込みソフトウェア、モバイルアプリ、Windowsアプリ、Webシステムなど、ソフトウェア開発に関するご相談がございましたら、お気軽にお問い合わせください。

また、ニューラルでは一緒にソフトウェア開発に取り組んでいただける技術者の方も募集しています。
ご興味がございましたら、お気軽にお問い合わせください。

EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688

目次へ