İlkel türler yerine sarmalayıcı sınıfına ne zaman gitmeliyim? Veya hangi durumlarda sarmalayıcı / İlkel türler arasında seçim yapmalıyım?
Yanıtlar:
Diğerleri, Collections
nesneler gibi belirli yapıların ve nesnelerin ilkel emsallerinden (bellek ve kutulama) daha fazla ek yüke sahip olduğunu belirtmişlerdir.
Dikkate alınacak başka bir konu:
Durum veya işlevi belirtmek için Nesneleri bir yönteme / yapıcıya başlatmak null
veya null
parametreleri göndermek kullanışlı olabilir . Bu ilkellerle yapılamaz.
Birçok programcı bunu belirtmek için sayıları 0 (varsayılan) veya -1 olarak başlatır, ancak senaryoya bağlı olarak bu yanlış veya yanıltıcı olabilir.
Bu aynı zamanda, bir NullPointerException
şeyin yanlış kullanıldığı bir sahneyi de ayarlayacaktır , bu, sıradaki bazı rasgele hatalardan çok daha programcı dostudur.
Genel olarak, herhangi bir nedenle bir nesneye ihtiyaç duymadığınız sürece (örneğin bir koleksiyon eklemek için) ilkel türleri kullanmalısınız . O zaman bile, sayısal performansı en üst düzeye çıkarmak istiyorsanız, bir nesne gerektirmeyen farklı bir yaklaşım düşünün. Bu, dokümantasyon tarafından tavsiye edilmektedir ve bu makale , otomatik kutunun nasıl büyük bir performans farkına neden olabileceğini göstermektedir.
Integer
daha okunaklı olduğunu açıklayın int
.
Benim görüşüme göre, eğer sınıf üyelerim sarmalayıcı değişkenler ise, geliştirici dostu davranış olan varsayılan değerlere dayanmaz.
1.
class Person {
int SSN ; // gets initialized to zero by default
}
2.
class PersonBetter {
Integer SSN; //gets initialized to null by default
}
İlk durumda, SSN değerini başlatılmamış halde tutamazsınız. Kullanmayı denemeden önce değerin ayarlanıp ayarlanmadığını kontrol etmemeniz canınızı yakabilir.
İkinci durumda, SSN'yi null ile başlatılmış halde tutabilirsiniz. Bu, NullPointerException'a yol açabilir, ancak SSN alanını başlatmadan kullanmaya çalıştığınızda, varsayılan değerleri (sıfır) bilmeden SSN olarak veritabanına eklemekten daha iyidir.
PersonBuilder
almak için "derleme" çağrısı yapmadan önce SSN ayarlanmadıysa bir istisna atar Person
. Bence bu tür şeyler aşırı, ancak Java dilinin uygun kalıplar için teşvik ettiği şey bu.
Gerekirse sadece sarıcı türlerini kullanırım.
Onları kullanırken, oldukları gerçeğinin yanı sıra fazla bir şey kazanmazsınız Objects
.
Ayrıca, bellek kullanımındaki ek yükü ve boks / kutudan çıkarma için harcanan zamanı kaybedersiniz.
Pratik olarak sarmalayıcı sınıfının kullanımının açıklanabileceği bir durumla karşılaştım.
Bir long
tür değişkeni olan bir hizmet sınıfı oluşturdum
long
türdeyse - başlatılmadığında 0'a ayarlanacaktır - bu, GUI'de görüntülendiğinde kullanıcı için kafa karıştırıcı olacaktır. Long
türdeyse - başlatılmadığında, olarak ayarlanacaktır null
- bu boş değer GUI'de görünmeyecektir.Bu Boolean
, ilkel kullandığımızda değerlerin daha kafa karıştırıcı olabileceği durumlar için de geçerlidir boolean
(çünkü varsayılan değer yanlıştır).
Koleksiyonlar, basit Java sarmalayıcı nesnelerinin tipik durumudur. Bununla birlikte, Sarmalayıcıya kodda (değer nesnesi) daha özel bir anlam vermeyi düşünebilirsiniz.
IMHO, kodun okunabilirliğine ve korunmasına indirgendiğinde, değer nesnelerini kullanmanın neredeyse her zaman bir faydası vardır. Belirli sorumluluklara sahip olduklarında nesnelerin içine basit veri yapılarını sarmak, genellikle kodu basitleştirir. Bu, Etki Alanına Dayalı Tasarımda çok önemli olan bir şeydir .
Elbette performans sorunu var, ancak performansı uygun verilerle ölçme ve sorunlu alana yönelik daha yönlendirilmiş eylemler yapma olanağına sahip olana kadar bunu görmezden gelme eğilimindeyim. Kodun anlaşılması kolaysa, performans sorununu anlamak da daha kolay olabilir.
Sayısal hesaplamaların hakim olduğu uygulamaların performansı , ilkellerin kullanımından büyük ölçüde faydalanabilir.
ilkel türler, biri == operatörünü kullanır, ancak sarmalayıcı için tercih edilen seçenek, equals () yöntemini çağırmaktır.
"İlkel tipler zararlı kabul edilir" çünkü "prosedürel semantiği başka türlü tek tip nesne yönelimli modelle karıştırırlar.
Birçok programcı bunu belirtmek için sayıları 0 (varsayılan) veya -1 olarak başlatır, ancak senaryoya bağlı olarak bu yanlış veya yanıltıcı olabilir.
Koleksiyonları kullanmak istiyorsanız, Wrapper sınıflarını kullanmanız gerekir .
İlkel türler, diziler için kullanılır. Ayrıca, sayacı veya boole koşulu gibi davranışı olmayan verileri temsil etmek için.
Otomatik kutudan bu yana, "ilkel veya sarmalayıcı ne zaman kullanılmalı" sınırı oldukça belirsiz hale geldi.
Ancak unutmayın, Sarmalayıcılar nesnelerdir, bu nedenle tüm lüks Java özelliklerini elde edersiniz. Örneğin, Tamsayı nesneleri oluşturmak için refleksyonu kullanabilirsiniz, ancak int değerlerini kullanamazsınız. Sarmalayıcı sınıfları da valueOf gibi yöntemlere sahiptir.
Bir değer türü oluşturmak istiyorsanız. ProductSKU veya AirportCode gibi bir şey.
İlkel bir tür (örneklerimdeki dize) eşitliği tanımladığında, eşitliği geçersiz kılmak isteyeceksiniz.
Java'daki ilkel değerler nesne değildir. Bu değerleri nesne olarak işlemek için, java.lang paketi her bir ilkel veri türü için bir sarmalayıcı sınıf sağlar.
Tüm Sarmalayıcı sınıfları nihaidir. Başlatılabilen tüm sarmalayıcı sınıflarının nesnesi değişmezdir, yani sarmalayıcı nesnesindeki değer değiştirilemez.
Ancak, void sınıfı bir sarmalayıcı sınıf olarak kabul edilir, ancak herhangi bir ilkel değeri sarmaz ve başlatılabilir değildir. Public constructor'ı yoktur, sadece void anahtar sözcüğünü temsil eden bir sınıf nesnesini belirtir.
İlkel Türler Ne Zaman Kullanılır?
Sarmalayıcı Sınıfı Ne Zaman Kullanılmalı
dan https://medium.com/@bpnorlander/java-understanding-primitive-types-and-wrapper-objects-a6798fb2afe9