Bir sınıfın tüm nesnelerini takip etme


9

Nesneye yönelik programlama konusunda yeniyim ve bu sorunla karşılaşmaya devam ediyorum. (Java'da programlıyorum) Bu kadar basit bir sorun gibi göründüğünden, bu konuda soru sormak konusunda biraz isteksiz oldum, ancak bununla ilgili herhangi bir bilgi veya burada soru bulamıyorum ve hiçbiri Okuduğum ders kitapları (oldukça basit bir düzeyde) bu konuya değindi:

Genellikle, bir sınıfın tüm nesnelerini, çeşitli amaçlar için yinelemek için izlemem gerekir. Onlar şu anda programlar yazmak yolu, birçok nesne sadece diğer nesnelerden başvurulan, yani ben hepsini referans için hiçbir dizi veya koleksiyon var anlamına gelir.

Bu, OOP'ta çok temel bir gereklilik gibi göründüğünden, bunun için oldukça kurumsal ve basit bir yolun olması gerektiğini hayal ediyorum. Bir sınıfın tüm nesnelerinin ayrı bir listesini tutmak normal bir uygulama mıdır?

Oluşturucu aracılığıyla oluşturulan her yeni nesnenin ekleneceği statik bir dizi veya koleksiyon düşündüm. Ancak bu yapıcılar miras alınmadığından alt sınıflarla çalışmaz mı?

Bu sorunun kolay bir cevabı olmayabilir; Umarım birisi bu konuda beni biraz aydınlatabilir. Burada merkezi bir bilgi eksikliğim varmış gibi hissediyorum.


5
İzlenen ve izleyicinin daha spesifik bir örneği yardımcı olabilir. Bu sorun bağlama, nasıl kullanıldığına vb. Bağlı olarak birçok farklı yolla ele alınmaktadır.
JustinC

2
Sanırım soruna yanlış sondan yaklaşıyor olabilirsiniz. Belirli bir sınıfın tüm örneklerinin bir listesine ihtiyaç duyulması çok yaygın değildir ve bunlardan birine sahip olmak her türlü tasarım sorununa neden olacaktır (çünkü artık tamamen ilgisiz bağlamlarda oluşturulan örnekler bile bu liste yoluyla birbirine bağlıdır).
tdammers

1
"çeşitli amaçlar için onları yinelemek" ... gibi ...? Genel olarak, bir nesnenin bir 'sahibi' vardır (resmi bir terim değil, daha çok program anlambilimiyle ilgili bir ifade) ve başka kimsenin nesne ile 'çeşitli amaçları' olması değildir.
AakashM

Yanıtlar:


8

Neden bir sınıfın tüm örneklerinin bir listesini tutmanız gerektiğini bilmiyorum.

Bu, hiçbir nesne elden çıkarılmayacağından bellek sızıntısına neden olur, çünkü liste başka hiçbir sınıftan sonra bunlara referansta bulunacaktır.

Ancak bu rotayı gerçekten izlemek istiyorsanız:

  1. Fabrika modelini kullanın. Sınıfı örnekleyen ve nesneleri döndüren yöntemlere sahip bir fabrika sınıfı. Bu şekilde, örneklemeleri denetlemek için merkezi bir noktanız olur.
  2. Bir listeyi veya örnekleri içeren listeleri tutmak için Tek Ton desenini kullanın.
  3. Belirli bir türdeki her nesneyi oluşturduktan sonra bir listeye koymasını sağlayın.

Bu arada: inşaatçılar miras alınır.


Elbette fabrikaya, örneği izlenen örnekler listesinden kaldıran bir "imha etme" yöntemi verebilirsiniz. Ama açıkça çağırmanın bir yolu yok. Ya da örneğe, fabrikada aynı dezavantaja sahip olan, ancak kullanıcıya daha yakın olduğu, daha görünür olduğu için çağrılma olasılığı daha yüksek olan, imha yöntemini tetikleyen bir atma yöntemi verin.
2013'te

@jwenting Elbette bu bir yol. Ancak bu, sınıflar ve fabrika arasında çirkin, gereksiz bağımlılıklar yaratacaktır. Sınıflar onları yaratan fabrika hakkında hiçbir şey bilmemelidir.
Tulains Córdova

Bu nedenle, fabrikaya, fabrikayı kaydetmesini söyleyen nesneden ziyade, ne yarattığını takip
etmesini sağlayın

Tek bir teknik, sanırım tüm örnekleri barındırır. Tek örnek.
Rig

3

Çöp toplayıcının izlenen nesneleri artık başka bir yere başvurulmadığında bertaraf etmesini sağlamak için diğer referanslarla birlikte zayıf referansların kullanılabileceğine dikkat edilmelidir . Bu, nesneleri başka bir yere el ile atmak veya başka şekilde izlenmelerine dikkat etmek zorunda kalmadan bellek sızıntılarını ortadan kaldırır. Serbest bırakılmış nesnelere ilişkin başvuru bildirimleri almak için ReferenceQueue sağlayabilirsiniz.

Oluşturucu aracılığıyla oluşturulan her yeni nesnenin ekleneceği statik bir dizi veya koleksiyon düşündüm. Ancak bu yapıcılar miras alınmadığından alt sınıflarla çalışmaz mı?

Temel sınıfların yapıcıları türetilmiş sınıfların yapıcılarından önce çağrılır. Her sınıfın en az bir kurucusu vardır ve kurucular geçersiz kılınamaz.


2

Oyun yaparken insanlar bazen her oyun nesnesinin "kendi kendini yöneten" bir koleksiyonunu ister.

Bir uygulama şöyle görünür:

public class Car {

    static ArrayList<Car> list = new ArrayList<Car>();

    public Car() {
        list.add(this);
    }

    void kill() {
        list.remove(this);
    }

    static public void updateAll()
    {
        for (int i = list.size() - 1; i >= 0; i--)
        {
                list.get(i).update();
        }
    }

    public void update()
    {
        //update logic
    }
}

Bu şekilde, koleksiyonu işleyen yöntemler statik olarak bildirilirken, statik olmayan yöntemler bir örneği işlerken (updateAll ve update).

Çok basit senaryolar için iyi olsa da, orta derecede karmaşıklıkla bile, ayrı yönetici sınıfları oluşturmak genellikle en iyisidir.


1
Direkt olarak static ArrayList<ListeStatic> list = new ArrayList<ListeStatic>();ans yazabilirsiniz statc {..}
cl-r

2
Java yönteminde adı küçük harf ile başlar:uptdateAll(){..;}
cl-r

ayy ... java'mı herkese açık olarak yayınlamamın üzerinden bir süre geçti
Kelly Thomas

@KellyThomas Kendini listeye ekleyen ve kendisini listeden kaldıran bir otomobil. Kulağa doğal gelmiyor.
Tulains Córdova

1
@ CayetanoGon, statik bir alan olarak tüm örnekler tarafından paylaşılan bir listedir.
Kelly Thomas

2

Bağlamı düşünmeye çalışın. Bir nesne oluşturduğunuzda, bunu belirli bir bağlamda yaparsınız. Örneğin, oyununuz uzaylıları vurmakla ilgiliyse, uygulamanız her zaman yeni Uzaylı nesneleri oluşturacaktır. Bunlar Uzay (ana kullanıcı arayüzünü temsil eden sınıf olabilir) adlı bir alanda görüntülenir.

Space için oluşturduğunuz her yeni yabancıyı eklediğiniz bir dizi olan currentAliens adında bir özelliğe sahip olmak son derece doğaldır. Kullanıcınızın uzay-zamanın dokusunu parçalamasına ve tüm uzaylıları bir kerede imha etmesine izin vermek istiyorsanız, bu koleksiyon boyunca yinelenir ve her nesneyi yok edersiniz.

Uygulamanızın diğer bölümlerinden bu uzaylı koleksiyonuna erişmek istiyorsanız (örneğin, kullanıcıların bir tür düşme sırasında belirli türdeki uzaylıları silmesine izin verebileceğiniz Ayarlar sayfasından), Ayarlar bağlamınız Space nesnesine erişim izni verilmesi gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.