Konfigurasi Node

Dalam memori, konfigurasi ini diwakili menggunakan ConfigurationNodes. Sebuah ConfigurationNode baik memegang nilai (seperti nomor, sebuah string atau daftar) atau memiliki node anak, seperti pohon konfigurasi struktur. Bila menggunakan ConfigurationLoader untuk memuat atau membuat konfigurasi baru, itu akan kembali root node. Dianjurkan bahwa anda selalu menyimpan referensi ke simpul akar disimpan di suatu tempat.

Catatan

Tergantung pada ConfigurationLoader bekas, anda bahkan mungkin mendapatkan CommentedConfigurationNode, yang selain normal ConfigurationNode perilaku ini dapat mempertahankan komentar yang akan bertahan disimpan pada file konfigurasi.

Nilai

Nilai dasar

Nilai dasar jenis seperti int, double, boolean atau String masing-masing memiliki kenyamanan mereka sendiri getter method yang akan mengembalikan nilai default jika node tidak berisi nilai dari tipe tersebut. Mari kita cek apakah administrator server kami ingin plugin untuk mengaktifkan nya blockCheats modul dengan memeriksa nilai pada modules.blockCheats.enabled jalan.

boolean shouldEnable = rootNode.getNode("modules", "blockCheats", "enabled").getBoolean();

Ya, ini benar-benar sesederhana itu. Serupa dengan contoh di atas, metode seperti ConfigurationNode#getInt(), ConfigurationNode#getDouble() atau ConfigurationNode#getString() ada yang memungkinkan anda untuk dengan mudah mengambil nilai dari jenis itu.

Untuk menetapkan nilai dasar untuk sebuah node, hanya menggunakan ConfigurationNode#setValue(Object) metode. Jangan bingung bahwa ia menerima sebuah Object - ini berarti bahwa ia dapat mengambil apa-apa dan akan menentukan bagaimana untuk melanjutkan dari sana dengan sendirinya.

Bayangkan modul blok Cheast tidak diaktifkan oleh perintah pengguna. Perubahan ini perlu tercermin dalam konfigurasi dan bisa dilakukan sebagai berikut:

rootNode.getNode("modules", "blockCheats", "enabled").setValue(false);

Peringatan

Sesuatu yang lain dari nilai dasar jenis tidak dapat ditangani oleh orang-orang yang fungsi dasar, dan harus dapat dibaca dan ditulis menggunakan (de)serialisasi Metode yang dijelaskan di bawah ini. Tipe dasar adalah orang-orang yang native ditangani oleh yang mendasari pelaksanaan format file yang digunakan oleh ConfigurationLoader, tetapi umumnya termasuk tipe data primitif, Strings serta Lists dan Maps tipe dasar.

(De)Serialisasi

Jika anda mencoba untuk membaca atau menulis sebuah objek yang tidak salah satu dari tipe dasar yang disebutkan di atas, anda akan perlu untuk lulus melalui deserialization pertama. Di ConfigurationOptions digunakan untuk membuat akar ConfigurationNode, ada koleksi TypeSerializers yang Configurate digunakan untuk mengkonversi objek ke ConfigurationNode dan sebaliknya.

Dalam rangka untuk memberitahu Configurate jenis apa itu berhadapan dengan, kita harus memberikan jambu TypeToken. Bayangkan kita ingin membaca player UUID dari konfigurasi node towns.aFLARDia.mayor. Untuk melakukannya, kita perlu memanggil getValue() metode sekaligus memberikan TypeToken mewakili UUID kelas.

import java.util.UUID;

UUID mayor = rootNode.getNode("towns", "aFLARDia", "mayor").get(TypeToken.of(UUID.class));

Hal ini mendorong Configurate untuk menemukan yang tepat TypeSerializer untuk UUIDs dan kemudian menggunakannya untuk mengkonversi nilai yang disimpan ke UUID. Itu TypeSerializer (dan dengan ekstensi metode di atas) mungkin membuang ObjectMappingException jika pertemuan tidak lengkap atau tidak valid data.

Sekarang jika kita ingin menulis baru UUID untuk itu konfigurasi node, sintaks yang sangat mirip. Gunakan setValue() metode dengan TypeToken dan objek yang anda inginkan untuk cerita bersambung.

rootNode.getNode("towns","aFLARDia", "mayor").setValue(TypeToken.of(UUID.class), newUuid);

Catatan

Serialisasi nilai akan membuang ObjectMappingException jika tidak ada TypeSerializer untuk mengingat TypeToken dapat ditemukan.

Untuk kelas-kelas seperti UUID, anda hanya dapat membuat TypeToken menggunakan static TypeToken.of() metode. Tapi ketika kelas yang ingin anda gunakan memiliki jenis parameter sendiri (seperti Map<String,UUID>) sintaks akan menjadi sedikit lebih rumit. Dalam kebanyakan kasus, anda akan tahu persis apa jenis parameter yang akan di compile time, sehingga anda hanya dapat membuat TypeToken sebagai anonim kelas: new TypeToken<Map<String,UUID>>() {}. Dengan cara itu, bahkan jenis generik nyaman dapat menulis dan membaca.

Lihat juga

Untuk informasi lebih lanjut tentang TypeTokens, mengacu kepada jambu dokumentasi

Jenis serializable dengan menggunakan metode tersebut adalah:

  • Nilai dasar apa saja (lihat di atas)

  • Setiap List atau Map dari serializable jenis

  • Tipe `` java.util.UUID``, `` java.net.URL``, `` java.net.URI`` dan `` java.util.regex.Pattern``

  • Jenis yang telah dibuat dapat bersambung seperti yang dideskripsikan pada the config serialization page

Bawaan

Tidak seperti Spons API, Configurate perpustakaan tidak menggunakan Opsional untuk nilai-nilai yang tidak mungkin hadir namun batal. Sedangkan getter untuk metode primitif (seperti getBoolean() atau getInt()) mungkin kembali palsu atau 0, orang-orang yang akan mengembalikan sebuah objek (seperti getString()) akan kembali null jika tidak ada nilai yang hadir. Jika anda tidak ingin secara manual menangani khusus kasus, anda dapat menggunakan nilai default. Setiap getXXX() metode yang dibahas di atas memiliki kelebihan berupa menerima parameter tambahan sebagai nilai default.

Mari kita lihat contoh untuk membaca nilai boolean lagi.

boolean shouldEnable = rootNode.getNode("modules", "blockCheats", "enabled").getBoolean();

Panggilan ini akan kembali palsu jika salah satu nilai palsu disimpan di config atau nilai yang tidak hadir dalam konfigurasi. Sejak dua kasus yang bisa dibedakan kami tidak memiliki cara sederhana untuk menetapkan variabel yang menjadi palsu hanya jika itu adalah nilai yang ditentukan pada konfigurasi. Kecuali kita menentukan benar sebagai nilai default.

boolean shouldEnable = rootNode.getNode("modules", "blockCheats", "enabled").getBoolean(true);

Demikian pula, anda dapat menentukan default pada setiap nilai yang anda dapatkan dari config, sehingga menghindari null kembali atau ObjectMappingException yang disebabkan oleh tidak adanya seluruh nilai. Ia juga bekerja pada deserialisasi getValue() metode. Beberapa contoh:

String greeting = rootNode.getNode("messages", "greeting").getString("FLARD be with you good man!");

UUID mayor = rootNode.getNode("towns", "aFLARDia", "mayor")
                        .getValue(TypeToken.of(UUID.class), somePlayer.getUniqueId());

Aplikasi lain dari yang default adalah bahwa mereka dapat disalin ke konfigurasi anda jika diperlukan. Pada penciptaan root konfigurasi node, anda dapat membuat ConfigurationOptions dengan setShouldCopyDefaults(yang benar). Selanjutnya, setiap kali anda memberikan nilai default, Configurate akan terlebih dahulu memeriksa apakah nilai yang anda sedang berusaha untuk mendapatkan yang hadir, dan jika tidak, itu akan lebih dulu menulis nilai default anda ke node sebelum kembali ke nilai default.

Mari kita asumsi kan plugin anda menjalankan untuk pertama kalinya dan config file belum ada. Anda mencoba untuk memuat dengan ConfigurationOptions yang memungkinkan menyalin nilai-nilai default dan mendapatkan kosong config node. Sekarang anda jalankan garis rootNode.getNode("modul", "blockCheats", "enabled").getBoolean(yang benar). Sebagai node belum ada, configurate menciptakan dan menulis nilai true untuk itu sebagai per ConfigurationOptions sebelum kembali itu. Ketika config kemudian selesai, nilai benar akan bertahan pada node tanpa pernah secara eksplisit diatur.