Saya mencari cara yang berbeda untuk memastikan bahwa setiap instance dari kelas yang diberikan adalah instance yang dapat diidentifikasi secara unik.
Sebagai contoh, saya memiliki Name
kelas dengan bidang name
. Setelah saya memiliki Name
objek dengan name
inisialisasi ke John Smith, saya tidak ingin dapat instantiate Name
objek yang berbeda juga dengan nama sebagai John Smith, atau jika instantiasi terjadi saya ingin referensi ke objek asli untuk dilewatkan kembali bukan dari objek baru.
Saya sadar bahwa salah satu cara untuk melakukan ini adalah memiliki pabrik statis yang menampung Map
semua objek Nama saat ini dan pabrik memeriksa bahwa sebuah objek dengan John Smith sebagai namanya belum ada sebelum meneruskan referensi ke Name
obyek.
Cara lain yang bisa saya pikirkan dari atas kepala saya adalah memiliki Peta statis di Name
kelas dan ketika konstruktor disebut melempar pengecualian jika nilai yang diteruskan name
sudah digunakan di objek lain, namun saya sadar melemparkan pengecualian dalam konstruktor umumnya merupakan ide yang buruk .
Apakah ada cara lain untuk mencapai ini?
sumber
I'm aware that one way of doing this is to have a static factory that holds a Map...
Jadi mengapa Anda tidak ingin melakukannya dengan cara ini?Jawaban:
Sebenarnya Anda sudah menjawab pertanyaan Anda. Cara pertama Anda harus lebih efektif di sini. Menggunakan
static factory
selalu lebih disukai daripada diconstructor
mana pun Anda pikir Anda bisa. Jadi, Anda dapat menghindari penggunaanConstructor
dalam kasus ini, jika tidak, Anda akan memilikithrow some exception
instance dengan nama yang diberikan.Jadi, Anda dapat membuat metode pabrik statis: -
getInstanceWithName(name)
yang akan mendapatkan instance yang sudah tersedia dengan nama itu, dan jika tidak ada, itu akan membuat instance baru, dan menjadikanconstructor
pribadi Anda , karena sebagian besar harus dilakukan ketika berhadapan denganstatic factories
.Juga, untuk itu Anda perlu mempertahankan statis
List
atauMap
semua contoh unik yang dibuat, diFactory
kelas Anda .EDIT : -
Anda tentu harus melalui - Java Efektif - Item # 1: Pertimbangkan pabrik Statis daripada Konstruktor . Anda tidak bisa mendapatkan penjelasan yang lebih baik daripada buku itu.
sumber
Sebutan Java Efektif tampaknya menambah banyak kredibilitas sehingga jawaban ini didasarkan pada:
Saya akan mengambil langkah mundur dan mempertanyakan mengapa Anda peduli jika ada lebih dari satu contoh objek nama ini.
Saya jarang perlu melakukan semacam ini pengumpulan objek. Ini adalah dugaan saya bahwa OP melakukan ini sehingga mereka dapat dengan mudah membandingkan
Name
objek mereka==
. Atau gunakanName
benda - benda di dalamHashMap
atau serupa dengan kunci.Jika demikian, ini adalah sesuatu yang dapat diselesaikan melalui implementasi yang tepat
equals()
.Seperti itu:
Setelah selesai, yang berikut ini benar:
Saya menduga tujuan Anda, tetapi dengan cara ini Anda dapat menggunakan
Name
kelas dalam peta hash dll, dan mereka tidak harus menjadi contoh yang sama persis.sumber
Name
antarmukaNameFactory
dengan metodeName getByName(String)
NameFactory
denganMap<String,WeakReference<Name>>
isinyasynchronize
di peta dengan nama di dalamgetByName
metode sebelum membuat instance baruName
Name
antarmuka di dalam implementasi Anda atasNameFactory
Pendekatan ini akan membuat Anda memastikan bahwa:
Name
ada kapan saja,Name
lebih lama dari yang mereka butuhkan,sumber
throw
ketika nama yang identik ada alih-alih mengembalikan objek, atau jika Anda mengembalikannull
objek.destructor
akan berguna.Anda harus menjadikan konstruktor sebagai pribadi dan membuat metode seperti
getNameInstance(String)
, jika objek dengan nama yang sama sudah ada (berdasarkan pada kelas statis 'dapat cepat misalnya), Anda mengembalikan referensi itu, kalau tidak Anda membuat objek baru menggunakan konstruktor pribadi Anda dan menambahkannya ke hashtablesumber
Coba ikuti. Anda harus melacak setiap objek yang Anda buat. Untuk tujuan ini saya menggunakan Daftar. Dan menjadikan konstruktor kelas privat, sehingga pemeriksaan awal dapat diterapkan sebelum membuat instance
sumber
List
. Ini akan cocok untukDictionary<string,UniqueName>
.