現在「わかりやすいJava オブジェクト指向 徹底解説」というテキストを読んでいます。
53ページに次のような文章がありました。
コンストラクタをprivateにするのは、インスタンスの生成をコントロールするための特殊なケースです。インスタンスを1つだけしか作れないようにするとか、同じ値を持つインスタンスを二重に作れないようにする、などの場合があります。
前者のインスタンスを1つだけしか作れないようにするというのはSingletonのことだろうというのはわかりました。
ここでいくつか質問があります。
後者の「同じ値を持つインスタンスを二重に作れないようにする」という部分にはSingletonのような名前はありますか?
また、これを効率よく実現するにはどのようにcodingすれば良いですか?
一応、実現の仕方については次のように考えてみましたが、これではインスタンスを多く作ろうとする時に大変効率が悪いように感じます。
そもそも間違っている、こうすれば効率がよい、などなど何かアドバイスがあればご教授願いたいです。よろしくお願い致します。
import java.util.LinkedList; import java.util.List; import java.util.Objects; public class Student { private int number; private String name; private static List<Student> list = new LinkedList<>(); private Student(int number, String name) { this.number = number; this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Student)) return false; Student student = (Student) o; return number == student.number && Objects.equals(name, student.name); } @Override public int hashCode() { return Objects.hash(number, name); } public static Student getInstance(int number, String name) { Student tmp = new Student(number, name); if (list.stream() .filter(s -> s.equals(tmp)) .count() > 0) { System.out.println("すでに作成されたインスタンスです"); return null; } else { System.out.println("インスタンスの作成に成功!"); list.add(tmp); return tmp; } } }
public class Exec { public static void main(String[] args) { Student s1 = Student.getInstance(100, "佐藤一郎"); Student s2 = Student.getInstance(101, "山田花子"); Student s3 = Student.getInstance(102, "山田花子"); Student s4 = Student.getInstance(100, "佐藤一郎"); } }
実行結果
インスタンスの作成に成功!
インスタンスの作成に成功!
インスタンスの作成に成功!
すでに作成されたインスタンスです
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/09 02:44
2021/03/09 05:00 編集
2021/03/18 14:59
2021/03/19 00:50 編集
2021/03/19 02:02
2021/03/19 05:43