Yapılandırma Düğümleri
Bellekte, yapılandırma şu şekilde kullanılarak ifade edilmektedir ConfigurationNodes. A ConfigurationNode
ya bir değer taşır (bir sayı, dize veya liste gibi) yada alt düğümler, ağaç gibi bir yapılandırma yapısı vardır.Bir :javadoc:`ConfigurationLoader`kullanırken, yüklemek veya yeni yapılandırmalar oluşturmak için, **kök düğümü**döndürür. Her zaman bir yerde depolanan kök düğümü için bir referans saklamanız önerilir.
Not
Kullanılan ConfigurationLoader` a bağlı olarak, hatta normal ``ConfigurationNode
davranışa ek olarak CommentedConfigurationNode yapılandırma dosyasında kalması sağlanacak açıklama tutabilen bir ConfigurationNode
bile tutabilirsiniz.
Değerler
Temel Özellikler
Int
, doubl
, boolean
veya String
gibi temel değer türlerinin her biri kendi getter yöntemi vardır ve bu düğümler bir değer içermiyorsa öntanımlı değere döndürürler. Sunucu yöneticisi eklentimiz ile``modules.blockCheats.enabled`` yolundaki değere bakarak blockCheats modülü etkinleştirip etkinleştirmeyeceğini kontrol edelim.
boolean shouldEnable = rootNode.getNode("modules", "blockCheats", "enabled").getBoolean();
Evet, aslında bu kadar kolay. Yukarıdaki örneğe benzer, ConfigurationNode#getInt(), ConfigurationNode#getDouble() yada ConfigurationNode#getString() metodlar var olan bu tür bir değeri uygun şekilde almanızı sağlar.
Bir düğüme temel değer ayarlamak için sadece ConfigurationNode#setValue(Object) yöntemini kullanın. Bir Object
kabul ettiğine şaşırmayın - bu, kendi başına nasıl ilerleyeceğini belirleyecek ve her şey alabileceği anlamına gelir.
BlockCheats modülünün bir kullanıcı komutu tarafından devre dışı bırakıldığını düşünün. Bu değişikliğin yapılandırmaya yansıması gerekir ve şu şekilde yapılabilir:
rootNode.getNode("modules", "blockCheats", "enabled").setValue(false);
Uyarı
Temel değer türleri dışında bir şey bu temel işlevleri tarafından işlenemez ve bunun yerine okuma ve yazma, aşağıda açıklanan (de)serializing yöntemleri seri hale getirmede kullanılır. Temel türler, yerel olarak``ConfigurationLoader`` tarafından kullanılan dosya biçiminin temel uygulaması tarafından işlenen türlerdir ancak genellikle basit veri türler, String
s yada``List``s ve Map
s temel türleri içerir.
(De)Serialization
Yukarıda belirtilen temel türlerinden biri olmayan bir nesneyi okumaya veya yazmaya çalışırsanız, önce bu nesneyi serileştirme işleminden geçirmeniz gerekir. ConfigurationNode
kökünü oluşturmak için kullanılan ConfigurationOptions
bir derlemesi vardır. Bu TypeSerializers yapılandırmada nesnelerini ConfigurationNode
ve tersine dönüştürmede kullanılır.
Yapılandırmaya ne tür iş yapılacağını söylemek için`` TypeToken``’a guava sağlamamız gerekir.``towns.aFLARDia.mayor`` yapılandırma düğümünden UUID
adlı bir oyuncuyu okumak istediğimizi düşünün. Bunu yapmak için, UUID
sınıfını temsil eden bir TypeToken
sağlarken getValue()
yöntemini çağırmamız gerekir.
import java.util.UUID;
UUID mayor = rootNode.getNode("towns", "aFLARDia", "mayor").get(TypeToken.of(UUID.class));
Bu komut istemi yapılandırmalar UUID
s ler için uygun TypeSerializer
‘ı bulmasını ister ve daha sonra saklanan değeri bir UUID
haline dönüştürmek için kullanır. `` TypeSerializer`` (ve yukarıdaki yöntem) eksik veya geçersiz verilerle karşılaşırsa bir ObjectMappingException
atabilir.
Şimdi eğer yeni bir UUID``yapılandırma düğümü yazmak istersek, sözdizimi birbirine çok benzer. Seri hale getirmek istediğiniz nesne ve ``TypeToken
ile setValue()
yöntemini kullanın.
rootNode.getNode("towns","aFLARDia", "mayor").setValue(TypeToken.of(UUID.class), newUuid);
Not
Bir değeri seri hale getirmek verilen TypeToken
için TypeSerializer
bulunmuyorsa ObjectMappingException
bulunabilir.
UUID
gibi basit sınıflar için statik TypeToken.of()
yöntemini kullanarak yeni bir TypeToken
oluşturabilirsiniz. Ancak, kullanmak istediğiniz sınıfın kendi tür parametrelerine sahip olması durumunda (örneğin,``Map<String,UUID>``) sözdizimi biraz daha karmaşık hale gelir. Çoğu durumda, tür parametrelerinin derleme zamanında tam olarak ne olduğunu bilirsiniz, böylece yalnızca TypeToken
’i anonim bir sınıf olarak oluşturabilirsiniz: new TypeToken<Map<String,UUID>>() {}
. Bu şekilde, jenerik tipler bile rahatça yazılabilir ve okunabilir.
Ayrıca bakınız
TypeToken
s hakkında daha fazla bilgiyi, guava dökümanları gösterir.
Bu metodları kullanarak serileştirilebilen türler:
Herhangi bir temel değer (yukarıya bakın)
Herhangi bir
List
veyaMap
serileştirilebilen türlerJava.util.UUID
,java.net.URL
,java.net.URI
vejava.util.regex.Pattern
tipleriGösterildiği gibi serileştirilmiş bütün :doc:` yapılandırılmış serileştirme sayfası <serialization>`:doc
Varsayılan
Sponge API farklı olarak, yapılandırma kitaplığında bulunmayan ancak boş olmayan değerler için Optional
işlevi kullanılmaz. Basit yöntemler (getBoolean()
veya getInt()
gibi) getter’leri false
veya 0
döndürebilirken, bir nesneyi döndürecek olan (getString()
) herhangi bir değer mevcut değilse `` null`` döndürür. Bu özel durumları manuel olarak kullanmak istemiyorsanız, default values kullanabilirsiniz. Yukarıda bahsedilen her bir getXXX ()
yöntem varsayılan olarak ek bir parametre kabul eden aşırı yüklenmiş bir forma sahiptir.
Bir boolean değerini tekrar okuma için örneğine bir göz atalım.
boolean shouldEnable = rootNode.getNode("modules", "blockCheats", "enabled").getBoolean();
Bu çağrı, false
değeri yapılandırmaya kaydedilirse veya değer yapılandırmada mevcut değilse false
döndürülür. Bu iki durum birbirinden ayırt edilemezse değişkenimizi false
olarak ayarlamak kolay değildir, ancak bu sadece yapılandırmada belirtilen değerdir. Varsayılan değer olarak true
belirtilmediği takdirde.
boolean shouldEnable = rootNode.getNode("modules", "blockCheats", "enabled").getBoolean(true);
Benzer şekilde, yapılandırmadan aldığınız herhangi bir değere varsayılan değerler atayabilirsiniz, böylece tüm değerin yokluğundan kaynaklanan `` null`` dönüşlerinden veya ObjectMappingException``dan kaçınırsınız. Ayrıca, kaldırıcı olan ``getValue()
yöntemi üzerinde de çalışır. Bazı örnekler:
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());
Bu varsayılanların bir diğer kullanışlı yönü, gerekirse yapılandırmanıza kopyalanabilmesidir. Kök yapılandırma düğümünüzün yapımı sırasında, setShouldCopyDefaults(true)
ile ``ConfigurationOptions``larınızı oluşturabilirsiniz. Daha sonra, bir varsayılan değer verdiğinizde, yapılandırma öncesi almaya çalıştığınız değerin mevcut olup olmadığını kontrol edecek ve eğer değer yoksa, düğmeye varsayılan değerinizi yazacaktır.
Eklentinizin ilk kez çalıştığını ve yapılandırma dosyası henüz mevcut olmadığını varsayalım. Varsayılan değerlerin kopyalanmasına izin veren ve yapılandırma düğümünü ConfigurationOptions
ile yüklemeyi deneyin. Şimdi rootNode.getNode("modules", "blockCheats", "enabled").getBoolean(true)
satırını çalıştırın. Düğüm henüz mevcut olmadığından, yapılandırma bunu oluşturur ve onu döndürmeden önce ConfigurationOptions
uyarınca``true`` değerini yazar. Yapılandırma tamamlandığında, true
değeri açıkça ayarlanmadan düğüm mevcut olarak devam edecektir.