Değeri ne olursa olsun, çoğu komut dosyası oluşturma dili (Perl gibi) ve statik olmayan derleme zamanı dilleri (Pick gibi) otomatik çalışma zamanı dinamik String'den (nispeten rastgele) nesne dönüşümlerini destekler. Bu, Java'da da tür güvenliğini kaybetmeden gerçekleştirilebilir ve statik olarak yazılan diller, dinamik döküm ile kötü şeyler yapan bazı diğer dillerin kötü yan etkileri OLMADAN sağlar. Şüpheli matematik yapan bir Perl örneği:
print ++($foo = '99'); # prints '100'
print ++($foo = 'a0'); # prints 'a1'
Java'da bu, "çapraz döküm" adını verdiğim bir yöntemi kullanarak daha iyi gerçekleştirilir (IMHO). Çapraz çevrim ile yansıma, aşağıdaki statik yöntemle dinamik olarak keşfedilen yapıcıların ve yöntemlerin tembel yüklü bir önbelleğinde kullanılır:
Object fromString (String value, Class targetClass)
Ne yazık ki, Class.cast () gibi yerleşik Java yöntemleri bunu String'den BigDecimal'e veya String'den Tamsayıya ya da destekleyen sınıf hiyerarşisinin olmadığı başka herhangi bir dönüştürme için yapmaz. Benim açımdan önemli olan, bunu başarmak için tamamen dinamik bir yol sağlamaktır - bunun için önceki referansın doğru yaklaşım olduğunu düşünmüyorum - her dönüşümü kodlamak zorunda. Basitçe söylemek gerekirse, eğer yasal / mümkünse, uygulama dizgeden çevrimdir.
Dolayısıyla çözüm, aşağıdakilerden birinin halka açık Üyelerini arayan basit bir düşüncedir:
STRING_CLASS_ARRAY = (yeni Sınıf [] {String.class});
a) Üye üye = targetClass.getMethod (method.getName (), STRING_CLASS_ARRAY); b) Üye üye = targetClass.getConstructor (STRING_CLASS_ARRAY);
Tüm ilkellerin (Tamsayı, Uzun, vb.) Ve tüm temellerin (BigInteger, BigDecimal, vb.) Ve hatta java.regex.Pattern'in tümünün bu yaklaşımla kaplandığını göreceksiniz. Bunu, bazı daha sıkı kontrollerin gerekli olduğu büyük miktarda keyfi String değeri girdisinin olduğu üretim projelerinde önemli bir başarıyla kullandım. Bu yaklaşımda, bir yöntem yoksa veya yöntem çağrıldığında bir istisna atılır (çünkü bu, bir BigDecimal'e sayısal olmayan bir girdi veya bir Desen için yasa dışı RegEx gibi geçersiz bir değerdir), hedef sınıfın içsel mantığı.
Bunun bazı dezavantajları var:
1) Yansımayı iyi anlamanız gerekir (bu biraz karmaşıktır ve acemiler için değildir). 2) Bazı Java sınıfları ve gerçekten de 3. taraf kitaplıkları (şaşırtıcı) düzgün kodlanmamıştır. Yani, girdi olarak tek bir dizge argümanı alan ve hedef sınıfın bir örneğini döndüren yöntemler vardır, ancak bu sizin düşündüğünüz gibi değildir ... Integer sınıfını düşünün:
static Integer getInteger(String nm)
Determines the integer value of the system property with the specified name.
Yukarıdaki yöntemin, ilkel tamsayıları saran nesneler olarak Tamsayılarla hiçbir ilgisi yoktur. Yansıma, bunu bir Dizeden hatalı bir şekilde bir Tamsayı oluşturmak için olası bir aday olarak bulacaktır.Kod çözme, değer ve yapıcı Üyeler - bunların tümü girdi verileriniz üzerinde gerçekten kontrol sahibi olmadığınız ancak sadece yapmak istediğiniz çoğu keyfi Dize dönüşümü için uygundur. bir Tamsayı olup olmadığını bilin.
Bu tür nesnelerin örneklerini oluşturmak geçersiz giriş değerleri nedeniyle yukarıdaki düzeltmek için, İstisnalar atmak yöntemleri arayan iyi bir başlangıç olmalıdır bir özel durum atar. Ne yazık ki, uygulamalar, İstisnaların işaretli olarak beyan edilip edilmediğine göre değişir. Integer.valueOf (String), örneğin kontrol edilmiş bir NumberFormatException oluşturur, ancak Pattern.compile () istisnaları yansıma aramaları sırasında bulunmaz. Yine, bu dinamik "çapraz döküm" yaklaşımının bir başarısızlığı değil, nesne oluşturma yöntemlerinde istisna bildirimleri için çok standart olmayan bir uygulama olduğunu düşünüyorum.
Yukarıdakilerin nasıl uygulandığına dair daha fazla ayrıntı isteyen biri varsa, bana bildirin, ancak bu çözümün çok daha esnek / genişletilebilir ve tür güvenliğinin iyi kısımlarını kaybetmeden daha az kodla olduğunu düşünüyorum. Elbette "verilerinizi bilmek" her zaman en iyisidir, ancak çoğumuzun bulduğu gibi, bazen sadece yönetilmeyen içeriğin alıcılarıyız ve onu doğru şekilde kullanmak için elimizden gelenin en iyisini yapmak zorundayız.
Şerefe.