2016-03-23 18 views
2

Java OOP ve Java API/kaynak kodu düzenlemesi ile ilgili aşağıdaki durum hakkında kafam karıştı. Oracle's Java 8 API dayanarak, hasNext() soyut bir yöntemdir, ancak hasNext() öğesinin uygulandığı yeri bulamadım. Özel iç sınıfların her bir Koleksiyon sınıfında farklı Iteratörler uygulamak için kullanıldığını okudum, ancak uygulamanın yerini bulma konusunda daha fazla bilgi yok. Bazı kullanıcılar Eclipse IDE'ye Java JRE 1.8 kaynak kodu eklememi önerdi, ancak yalnızca Iterator arabiriminde soyut bir yöntem olarak bildirilen boolean hasNext(); görebiliyorum.Soyut yöntemin uygulanmasını nasıl bulabilirim, hasNext()?

Aşağıda gösterilen örnekte, yineleyici obj, doğrudan onu uygulayarak hasNext() yöntemini kullanır. Ancak, bir arayüzde soyut bir yöntem uygulamanız gerektiğini öğrettim.

Benim Soru:
(1) özet yönteminin uygulanmasını nasıl bulabilirim, hasNext()? (2) Bir yorum here kodunu bulabileceğimi söylüyor. ArrayList sınıfında hasNext() yönteminin uygulanmasının nedeni nedir, ancak soyut bir yöntem olarak hasNext() işareti var mı? Bu şekilde hasNext() uygulamasını bulmak sezgisel değildir.

List<String> list = new ArrayList<String>(); 
    list.add("item-1"); 
    list.add("item-2"); 
    list.add("item-3"); 

    Iterator<String> it = list.iterator(); 
    while (it.hasNext()) { 
     System.out.println(it.next()); 
    } 
+1

Hangi IDE'yi kullanıyorsunuz? IntelliJ IDEA'da bir yöntem seçebilir, CTRL ve sol fare tıklatma tuşlarına basabilirsiniz ve sizi doğrudan yöntemin yazıldığı yere götürecektir. –

+3

Tam burada. http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#748 –

+0

Sormaya çalıştığınız gibi geliyor "Nerede * ArrayList's * 'Iterator.hasNext()' uygulandı.Bu durum söz konusu ise (özellikle de bir uygulama arıyorsanız) bunu söylemek de faydalı olacaktır. – dimo414

cevap

-2

next() ve hasNext() yöntem Iterator arabiriminin bir parçasıdır. Her belirli uygulama kendi versiyonlarını sağlayacaktır. için ortak koleksiyon kitaplığı here veya SingletonListIteratorhere'da nasıl tanımlandığına bakabilirsiniz.

+2

"Özel iç sınıfların farklı Yineleyicileri uygulamak için kullanıldığını biliyorum" ifadesine göre OP bunu biliyor. Asıl sorunun "* IDE'de özel uygulamaların nasıl kolayca bulunacağı" olduğundan şüpheleniyorum. – Pshemo

+0

Anlattığınız noktayı görüyorum, fakat dürüstçe, sorunun tartışmalı bir şekilde yanlış bir formülasyonunun, şu soruya doğru bir yanıt üzerinde bir düşüşe yol açmaması gerektiğini düşünüyorum: '' Benim Soru: Soyut yöntem nerNext(), uygulandı? Bunu nasıl bulabilirim? ' –

+0

Katılıyorum, bu yüzden sizi reddetmedim (ancak başkalarının bunu yapmasını engelleyemiyorum ve size cevap veremiyorum çünkü OP sorununu düzgün bir şekilde cevaplayıp cevaplamadığından emin değilim). – Pshemo

1

Kodunuzda, Listenin bir ArrayList olduğunu görebilirsiniz. ArrayList'te yineleyici() adı verilen yöntem, Yineleyici uygulamasının bir sürümünü döndürecektir. Yineleyicinin bu uygulaması, uygulananNext() yöntemine sahip olacaktır.

Meraklı olmak harika bir şey ve yorumda belirtildiği gibi, bir IDE'deki kodu tıklayabilirsiniz (ya da bu sizin için işe yaramıyorsa, hata ayıklayıcıda bir kesme noktası ayarlayın ve adım atınız). Java kodunu okumak, onu gizlemenin harika bir yoludur. Tabii ki, Java insanlarının genel olarak ne yaptıklarını bilmelerini bekleyebilir ve mantıklı olduğu ve genel kullanıma uygun hale getirdiğiniz uygulamalara güvenebilirsiniz. Buradaki uyarı, belgeleri de okumalısınız. Örneğin. Bu sınıfın yineleyici tarafından döndürülen https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

yineleyiciler ve listIterator gelen yöntemlerdir başarısız hızlı: yineleyici oluşturulduktan sonra liste yapısal yineleyici kendi kaldır kullanma dışında herhangi bir şekilde, herhangi zamanda değiştirilirse veya yöntemleri ekleyin, yineleyici bir ConcurrentModificationException öğesini atar. Bu nedenle, eşzamanlı olarak modifikasyonunda, iteratör 'dan ziyade, belirsiz bir zaman zarfında belirlenemeyen bir zaman içinde riskli, belirleyici olmayan davranışlar yerine hızlı ve temiz bir şekilde başarısız olur.