AndroidでunmodifiableSet(変更不可のSet)を使用する方法を解説
この記事では、Androidアプリ開発においてunmodifiableSet(変更不可能なSet)を使用する方法を、実際のサンプルコードを交えながらわかりやすく解説します。
unmodifiableSetとは
java.util.Collections.unmodifiableSet()は、指定したSetオブジェクトの変更不可能なビューを返すメソッドです。このメソッドで生成されたSetに対して要素の追加や削除を試みると、UnsupportedOperationExceptionがスローされます。これにより、内部データを外部から意図せず変更されることを防ぐことができます。
実装手順
ステップ1:新規プロジェクトを作成する
Android Studioを起動し、「File」→「New Project」を選択して、必要な情報を入力して新しいプロジェクトを作成します。
ステップ2:レイアウトファイルにコードを追加する
res/layout/activity_main.xmlに以下のコードを追加します。
<?xml version = "1.0" encoding = "utf-8"?> <LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android" xmlns:tools = "https://schemas.android.com/tools" android:layout_width = "match_parent" android:layout_height = "match_parent" tools:context = ".MainActivity" android:orientation = "vertical"> <EditText android:id = "@+id/name" android:layout_width = "match_parent" android:hint = "Enter Name" android:layout_height = "wrap_content" /> <LinearLayout android:layout_width = "wrap_content" android:layout_height = "wrap_content"> <Button android:id = "@+id/save" android:text = "Save" android:layout_width = "wrap_content" android:layout_height = "wrap_content" /> <Button android:id = "@+id/refresh" android:text = "Refresh" android:layout_width = "wrap_content" android:layout_height = "wrap_content" /> </LinearLayout> <ListView android:id = "@+id/listView" android:layout_width = "match_parent" android:layout_height = "wrap_content"> </ListView> </LinearLayout>
上記のレイアウトでは、名前を入力するためのEditText、データを保存する「Save」ボタン、リストを更新する「Refresh」ボタン、そして登録済みの項目を一覧表示するListViewを配置しています。
ステップ3:MainActivity.javaにコードを追加する
src/MainActivity.javaに以下のコードを追加します。
package com.example.andy.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.Collections;
import java.util.Set;
import java.util.ArrayList;
import java.util.SortedSet;
import java.util.TreeSet;
public class MainActivity extends AppCompatActivity {
EditText name;
ArrayAdapter arrayAdapter;
ArrayList<String> array_list;
SortedSet set = new TreeSet();
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
array_list = new ArrayList<String>();
name = findViewById(R.id.name);
listView = findViewById(R.id.listView);
findViewById(R.id.refresh).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
arrayAdapter.notifyDataSetChanged();
listView.invalidateViews();
listView.refreshDrawableState();
}
});
findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!name.getText().toString().isEmpty()) {
set.add(name.getText().toString());
Set syncSet = Collections.unmodifiableSet(set);
array_list.clear();
array_list.addAll(syncSet);
arrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, array_list);
listView.setAdapter(arrayAdapter);
Toast.makeText(MainActivity.this, "Inserted", Toast.LENGTH_LONG).show();
} else {
name.setError("Enter NAME");
}
}
});
}
}
コードのポイント
このサンプルでは、ユーザーが入力した名前をTreeSetに格納しています。TreeSetは要素を自動的にソートし、重複を許さないという特徴を持つため、名簿のようなデータの管理に適しています。
「Save」ボタンがタップされると、次の流れで処理が実行されます。
- 入力欄が空でないかチェックし、空の場合はエラーを表示する
- 入力値を
TreeSetに追加する Collections.unmodifiableSet(set)を呼び出して、変更不可能なSetのビューを取得する- その内容をArrayListにコピーし、ArrayAdapterを通じてListViewに反映させる
- 「Inserted」というトーストメッセージを表示する
重要なのは、unmodifiableSetで得られるsyncSetはあくまでも元のSetのビューだという点です。元のset自体は依然として変更可能ですが、syncSet経由で行われるすべての変更操作は禁止されます。これにより、安全にデータを読み取る専用の参照として活用できます。
アプリを実行する
Android端末をPCに接続した状態で、Android Studioのツールバーにある実行(Run)アイコンをクリックします。デバイスを選択してアプリを起動しましょう。

実行結果の確認
上記の実行結果では、名前を入力して「Save」ボタンをタップするたびに、TreeSetの要素がソートされた状態でアダプターを通じてListViewに表示されていることが確認できます。Refreshボタンを押せば、リストの表示を最新の状態に更新することも可能です。
-
【Android】スナックバー(Snackbar)の使い方をステップごとに解説
このチュートリアルでは、Androidアプリでスナックバー(Snackbar)を使用する方法を、サンプルコードとともに段階的に解説します。スナックバーは画面下部に短いメッセージを一時的に表示できるUIコンポーネントで、Toastとは異なり「再試行(RETRY)」などのアクションボタンを組み込めるのが大きな特徴です。 手順1:新規プロジェクトを作成する Android Studioを起動し、メニューから「File」→「New Project」を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成しましょう。 手順2:レイアウトファイル(activity_main.xml)を編集する
-
【Android】NavigationViewの実装方法をステップごとに解説
この記事では、AndroidアプリでNavigationView(ナビゲーションビュー)を使用してドロワーメニューを実装する方法を、ステップごとに詳しく解説します。ハンバーガーアイコンから開閉できるサイドメニューは、多くのアプリで採用されている定番のUIです。ステップ1:新しいプロジェクトを作成するAndroid Studioを開き、File → New Project を選択して、必要な情報を入力し新しいプロジェクトを作成します。テンプレートには「Navigation Drawer Activity」を選ぶと、後の作業がスムーズになります。ステップ2:activity_main.xml にコ