Android application development 第23章:Javaエンジニアに向けたDIの復習

🔧 そもそもDI(依存性注入)とは?

DI(Dependency Injection)とは、「あるクラスが必要とする他のオブジェクト(依存物)を、自分で作るのではなく外部から提供してもらう設計手法」です。

❌ 従来の書き方(密結合)

public class UserService {
    private final UserRepository repository = new UserRepository(); // ← 自分で依存を生成してしまっている
}

✅ DIを使った書き方(疎結合)

public class UserService {
    private final UserRepository repository;

    public UserService(UserRepository repository) {
        this.repository = repository; // ← 外部から注入してもらう
    }
}

このようにすると、テストしやすくなり、依存関係の変更にも強くなります。


🧱 AndroidでDIが重要な理由

JavaではSpringのようなDIコンテナを使うことでDIが当たり前になりますが、Androidでは明示的にDIの設計を意識しないと、すぐに密結合なコードになります。

また、Androidアプリではライフサイクルが複雑なため、スコープ(Activity単位・アプリ全体など)を意識した依存性管理が必要になります。


🧰 AndroidでのDIの手段

1. 手動DI(基本形)

最初はコンストラクタやセッターで手動で依存性を渡す形でも十分学べます。

public class MainViewModel {
    private final TaskRepository repository;

    public MainViewModel(TaskRepository repository) {
        this.repository = repository;
    }
}

Activity から ViewModel を生成する際に渡す:

TaskRepository repository = new TaskRepository();
MainViewModel vm = new MainViewModel(repository);

2. Dagger2 / Hilt を使った自動DI

Dagger2 は Google 公式の DI ライブラリで、Hilt はその上に構築された簡易化された DI フレームワークです。

Hilt の構成例

@HiltAndroidApp
public class MyApp extends Application { }

@AndroidEntryPoint
public class MainActivity extends AppCompatActivity {
    @Inject
    TaskRepository repository; // ← Hiltが注入してくれる
}

依存関係を提供するクラス:

@Module
@InstallIn(SingletonComponent.class)
public class RepositoryModule {
    @Provides
    public static TaskRepository provideRepository() {
        return new TaskRepository();
    }
}

💡 Hiltは、Springでいうところの@Autowired@ComponentScanのような自動注入を、Android向けに最適化した仕組みだと考えるとわかりやすいです。


🎯 Javaエンジニア向け補足

Java(Springなど)Android(Hilt/Daggerなど)
@Autowired@Inject
@Component@Module + @Provides
コンテナ:Springコンテナ:Hilt/Dagger
  • スコープの制御(@Singleton など)もHiltで可能です。
  • AndroidではActivityスコープ、ViewModelスコープ、Applicationスコープなどが重要になります。

✅ まとめ

  • DIとは「依存性を外から渡す」設計手法。
  • Androidでは疎結合な設計を実現し、テスト可能性・拡張性を高めるために重要。
  • まずは手動DIで理解を深め、その後 Hilt による自動DIに移行していくとスムーズ。

mh

Related Posts

Android application development 第33章:実践ミニアプリ:天気情報アプリ

Android application development 第32章:実践ミニアプリ:シンプルなToDoリスト

You Missed

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第11章:Cloud Load Balancing:あなたのGCPリソースを「賢く振り分ける交通整理の達人」

  • 投稿者 mh
  • 6月 18, 2025
  • 9 views

Kubernetes Learning 第37章:JenkinsやGitHub ActionsからのKubernetesデプロイ例 ~CI/CDツールとKubernetesをつなげてみよう~

  • 投稿者 mh
  • 6月 17, 2025
  • 11 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第10章:Cloud DNS:インターネットの「電話帳」サービス

  • 投稿者 mh
  • 6月 16, 2025
  • 15 views

Kubernetes Learning 第36章:Argo CDとFluxの概要~Kubernetesの自動運用を支えるGitOpsツール~

  • 投稿者 mh
  • 6月 15, 2025
  • 30 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第9章:IPアドレス(外部IP、内部IP、静的IP):GCPリソースの「住所」と「電話番号」

  • 投稿者 mh
  • 6月 14, 2025
  • 28 views

Kubernetes Learning 第35章:GitOpsとは?~Kubernetes運用をもっとスマートにする考え方~

  • 投稿者 mh
  • 6月 13, 2025
  • 52 views