Anahtarları Kullanma

Bir anahtar kullanarak veri alma ve sunma

Bir veri taşıyıcısı, :javadoc: ‘Key’ ile tanımlanan tek bir veri noktasını geri getirmek veya değiştirmek için yöntemler sağlar. Bir örnekle başlayalım:

Kod Örneği: Mümkünse bir veri taşıyıcıyı iyileştirin

import org.spongepowered.api.data.DataHolder;
import org.spongepowered.api.data.key.Keys;

public void heal(DataHolder target) {
    if (target.supports(Keys.HEALTH)) {
        double maxHealth = target.get(Keys.MAX_HEALTH).get();
        target.offer(Keys.HEALTH, maxHealth);
    }
}

Şimdi yukarıdaki işlev ayrıntıları için.

İlk satır verilen veri tutucunun güncel sağlık değerlerini destekleyip desteklemediğini kontrol eder. Eğer destekliyorsa, iyileşebilir. Veri tutucu maksimum sağlık bilgisine sahip olmadan güncel sağlığın bilgisine sahip olamayacağı için ya da tam tersi, birini supports() metoduyla kontrol etmek yeterlidir.

İkinci satır veri tutucuya maksimum sağlığını sormak için get() fonksiyonunu kullanır.``get()`` fonksiyonunun yanında``getOrNull()`` ve getOrElse() fonksiyonları da vardır, hepsi ilk parametre olarak Key fonksiyonunu kabul eder. Genellikle istenen veride bir Optional olarak dönecek olan ya da veri tutucu sağlanan şifreyi desteklemediğinde Optional.empty() olarak dönen get() kullanılmalıdır.``Key`` in desteklendiğini zaten doğruladığımız için,daha fazla kontrol yapmadan sadece opsiyoneldeki``get()``i kullanabiliriz.Ayrıca getOrNull()``u da kullanabiliriz ki bu da basitçe ``get(key).orNull() kısayoludur, böylelikle Optional dan kurtulabiliriz.Üçüncü ihtimal değer veri tutucuda olmayınca dönen ve ikinci parametreyi varsayılan değer olarak kabul eden getOrElse() olabilir.

Üçüncü satırda veri tutucuya veri dönüşü öneriyoruz.Maksimum sağlığı kazanmadan önceki ve güncel sağlığı simgeleyen bir Key sağlıyoruz ve böylelikle veri tutucu maksimum sağlığa ulaşıyor.Farklı parametre serileri kabul eden birçok offer() metodu var , hepsi de öneri kabul edilirse veri içeren bir :javadoc: DataTransactionResult olarak döner.Şimdilik sadece bir tane Key ve uyumlu olan değer kullanacağız,ama ileriki sayfalarda daha fazlasıyla karşılaşacağız.Önerimizin güncel sağlığının kabul edildiğini zaten bildiğimiz için ( çünkü veri tutucu destekliyor) , sessizce sonucu çıkarabiliriz.

Aynı zamanda remove() fonksiyonunu kullanarak bir :javadoc: DataHolder``dan bilgiyi tamamen silmek mümkündür.Basitçe silmek istediğiniz dosyayı simgeleyen bir ``Key oluşturun.Sonraki örnek, verilen veri tutucudan özel bir isim silmeyi deneyecek:

public void removeName(DataHolder target) {
    target.remove(Keys.DISPLAY_NAME);
}

Veri dönüştürme

Değer elde etme, değiştirme ve önerme dışında veriyle ilgili bir yol daha var. Veri tutucunun transform() metodunu kullanarak Key ve Function``ı geçebiliriz. Kodun değeri yeniden kazanılır ve verilen fonksiyon ona uygulanır. Sonuç kodun altında kayıtlanır ve``transform() metodu anında ``DataTransactionResult``a döner.

Şimdi, örnek olarak, bir veri tutucuyu maksimum sağlığını iki katına çıkararak güçlendirdiğimizi hayal edin.

import java.util.function.Function;

public void buff(DataHolder target) {
    target.transform(Keys.MAX_HEALTH, new Function<Double,Double>() {
        @Override
        public Double apply(Double input) {
            return (input == null) ? 0 : input * 2;
        }
    });
}

Veya Java 8’i kullanırsanız, satırı lambda ifadeleri ile kısaltabilirsiniz:

public void buff(DataHolder target) {
    target.transform(Keys.MAX_HEALTH, d -> (d == null) ? 0 : 2*d);
}

İki durumda da geçen fonksiyonun null``u geçtiğinden emin olmalıyız.Ayrıca hedef aslında :javadoc:`Keys#MAX_HEALTH` anahtarını destekliyorsa hiçbir kontrolün gerçekleşmediğini farkedeceksiniz.Eğer hedef desteklemiyorsa, ``transform() fonksiyonu başarısız olacak ve DataTransactionResult olarak geri dönecek.

Anahtarlı Değerler

Bazen sadece anahtarın kesin değerine değil onu kapsayan anahtarlı değere dikkat etmeniz gereken durumlar olabilir.Bu durumda``get(key)``i yerine getValue(key) i kullanın. Orijinal değerinin kopyasını içeren BaseValue den devralan bir obje alacaksınız. Güncel sağlığın MutableBoundedValue olduğunu bildiğimizden, minimum mümkün sağlığı ve hedefin sağlığının birazcık üstünü bulabiliriz.

Örnek Kod: Bir hedefi ölümün eşiğine getir

import org.spongepowered.api.data.value.mutable.MutableBoundedValue;

public void scare(DataHolder target) {
    if (target.supports(Keys.HEALTH)) {
        MutableBoundedValue<Double> health = target.getValue(Keys.HEALTH).get();
        double nearDeath = health.getMinValue() + 1;
        health.set(nearDeath);
        target.offer(health);
    }
}

Tekrar, hedefimizin sağlık anahtarını destekleyip desteklemediğini ve anahtarlı değeri elde edip etmediğini kontrol ediyoruz.``MutableBoundedValue`` bir getMinValue() metodu içerir,böylece minimum değeri elde ederiz, 1 ekleyin ve veri hafızasına kaydedin.``set()`` metodu sağlanan değer geçerli ise kontrol gerçekleştirecek değilse de sessizce başarısız olacak.``health.set(-2)`` kullanmak geçerlilik kontrolünden başarısız olacağı için``health`` içindeki değerleri değiştirmez. Değişikliklerimizi sonunda hedefe uygulamak için anahtarlı değere geri dönüş önermeliyiz.Ayrıca Anahtarlı değer onu tanımlaması için Key içerir.``target.offer(health)`` kullanmak ``target.offer(health.getKey(), health.get())``ile aynıdır.