Berasal dari latar belakang C dan C ++, saya menemukan penggunaan yang bijaksana typedef
untuk menjadi sangat membantu. Apakah Anda tahu cara untuk mencapai fungsi serupa di Jawa, apakah itu mekanisme Java, pola, atau cara efektif lain yang telah Anda gunakan?
244
public interface ScopeFactory { <Scope extends Map<String, Object>> Scope create(...) throws Exception; }
Jawaban:
Java memiliki tipe, objek dan array primitif dan hanya itu. Tidak ada typedefs.
sumber
typedef
mendefinisikan kembaliboolean
kebool
.typedef int PlayerID
yang memungkinkan kompiler memastikan PlayerID tidak digunakan secara bergantian dengan int lainnya, dan itu juga membuat kode lebih mudah dibaca oleh manusia . Pada dasarnya, ini seperti enum tetapi tanpa nilai yang terbatas.typedef MegaLongTemplateClass<With, Many, Params> IsShorten;
.typedef
tidak mengaktifkan hal semacam itu. Itu hanya memberi nama lain untuk suatu tipe.int
dan Anda perlu mengubahnyalong
, Anda harus mengubahnya di setiap tempat dalam kode tempat Anda bekerja dengan ID tersebut. Jika sudahtypedef
, Anda hanya perlu mengubahnya di 1 tempat.Jika ini yang Anda maksud, Anda bisa memperpanjang kelas yang ingin Anda ketik, misalnya:
sumber
typedef
tidak ada masalah yang dijelaskan artikel untuk kelas-kelas palsu (dan mereka sangat nyata).final
kelas.Tidak ada typedef di java pada 1.6, yang dapat Anda lakukan adalah membuat kelas wrapper untuk apa yang Anda inginkan karena Anda tidak dapat mensubkelas kelas akhir (Integer, Double, dll)
sumber
Seperti orang lain telah sebutkan sebelumnya,
Tidak ada mekanisme typedef di Jawa.
Saya juga tidak mendukung "kelas palsu" secara umum, tetapi seharusnya tidak ada aturan umum yang ketat di sini:
Jika kode Anda misalnya menggunakan berulang-ulang "tipe berbasis generik" misalnya:
Anda harus mempertimbangkan untuk memiliki subclass untuk tujuan itu.
Pendekatan lain yang dapat dipertimbangkan, misalnya memiliki kode perlambatan seperti:
Dan kemudian gunakan dalam kode NameToNumbers Anda dan memiliki tugas pra kompiler (ANT / Gradle / Maven) untuk memproses dan menghasilkan kode java yang relevan.
Saya tahu bahwa bagi sebagian pembaca jawaban ini ini mungkin terdengar aneh, tetapi ini adalah berapa banyak kerangka kerja yang menerapkan "anotasi" sebelum JDK 5, inilah yang dilakukan proyek lombok dan kerangka kerja lainnya.
sumber
Sungguh, satu-satunya penggunaan typedef yang dibawa ke Javaland adalah aliasing -yaitu, memberikan kelas beberapa nama yang sama. Artinya, Anda punya kelas "A" dan Anda ingin "B" merujuk ke hal yang sama. Di C ++, Anda akan melakukan "typedef BA;"
Sayangnya, mereka hanya tidak mendukungnya. Namun, jika Anda mengontrol semua jenis yang terlibat, Anda BISA melakukan hack jahat di tingkat perpustakaan - Anda bisa memperpanjang B dari A atau meminta B implement A.
sumber
typedef
juga akan berguna untuk membuat alias untuk pemanggilan tipe generik. Misalnya:typedef A<Long,String> B;
(ini mungkin merupakan kasus khusus dari apa yang telah Anda uraikan, tetapi ini menunjukkan daya tarik ide tersebut dengan lebih jelas).real_t
untukdouble
danbool
untukboolean
.Mungkin ini bisa menjadi pengganti lain yang mungkin:
sumber
myMap
turunan tipeMyMap
, Anda dapat beroperasi pada HashMap yang sebenarnya hanya dengan mengetikmyMapInstance.value.SomeOperation()
alih-alihmyMapInstance.SomeOperation()
. Ini menyebalkan, bukan?Seperti disebutkan dalam jawaban lain, Anda harus menghindari antipattern pseudo-typedef . Namun, typedef masih berguna bahkan jika itu bukan cara untuk mencapainya. Anda ingin membedakan antara berbagai jenis abstrak yang memiliki representasi Java yang sama. Anda tidak ingin mencampur string yang merupakan kata sandi dengan yang merupakan alamat jalan, atau bilangan bulat yang mewakili offset dengan yang memiliki nilai absolut.
The Checker Kerangka memungkinkan Anda untuk menentukan typedef dengan cara mundur-kompatibel. Saya bekerja bahkan untuk kelas primitif seperti
int
dan kelas akhir sepertiString
. Ia tidak memiliki overhead run-time dan tidak melanggar tes kesetaraan.Bagian Ketikkan alias dan typedef di manual Checker Framework menjelaskan beberapa cara untuk membuat typedef, tergantung pada kebutuhan Anda.
sumber
Kotlin mendukung alias alias https://kotlinlang.org/docs/reference/type-aliases.html . Anda dapat mengubah nama tipe dan tipe fungsi.
sumber
Dalam beberapa kasus, anotasi yang mengikat mungkin hanya apa yang Anda cari:
https://github.com/google/guice/wiki/BindingAnnotations
Atau jika Anda tidak ingin bergantung pada Guice, hanya anotasi biasa yang dapat dilakukan.
sumber
Anda bisa menggunakan Enum, meskipun secara semantik sedikit berbeda dari typedef karena hanya memungkinkan serangkaian nilai terbatas. Solusi lain yang mungkin adalah kelas wrapper bernama, misalnya
tapi itu kelihatannya jauh lebih kikuk, terutama mengingat bahwa tidak jelas dari kode bahwa kelas tidak memiliki fungsi selain sebagai alias.
sumber
Typedef memungkinkan item secara implisit ditugaskan ke jenis yang bukan miliknya. Beberapa orang mencoba menyiasatinya dengan ekstensi; baca di sini di IBM untuk penjelasan mengapa ini adalah ide yang buruk.
Sunting: Sementara inferensi tipe yang kuat adalah hal yang berguna, saya tidak berpikir (dan berharap kami tidak akan) melihat bahwa
typedef
itu adalah kepala yang buruk dalam bahasa yang dikelola (pernah?).Sunting 2: Di C #, Anda dapat menggunakan pernyataan menggunakan seperti ini di bagian atas file sumber. Ini digunakan sehingga Anda tidak perlu melakukan item kedua yang ditampilkan. Satu-satunya saat Anda melihat perubahan nama adalah ketika ruang lingkup memperkenalkan tabrakan nama antara dua jenis. Pengubahan nama terbatas pada satu file, di luar setiap variabel / tipe parameter yang digunakan dikenal dengan nama lengkapnya.
sumber
Tidak perlu untuk typedef di Jawa. Semuanya adalah Obyek kecuali untuk primitif. Tidak ada petunjuk, hanya referensi. Skenario di mana Anda biasanya menggunakan typedefs adalah contoh di mana Anda membuat objek.
sumber
UnmodifiableDirectedGraph<IncrediblyFancyEdgeType, IncrediblyFancyAbstractNode.EvenFancierConcreteNode>
atauIncrediblyFancyGraph
? Saya selalu bisa merujuk pada definisi untuk mencari tahu apa itu sebenarnya. Dengan begitu saya juga bisa memastikan saya tidak akan melewatkanUnmodifiableDirectedGraph<IncrediblyFancyEdge,IncredilyFancyAbstractNode.SlightlyLessFancyConcreteNode>
kebosanan semata.Enterprise
.