Menghapus objek di java?


99

Saya ingin menghapus objek yang saya buat, (oval yang mengikuti Anda), tetapi bagaimana saya melakukannya?

delete follower1;

tidak berhasil.

EDIT:

Oke, saya akan memberikan lebih banyak konteks. Saya membuat permainan kecil dengan oval yang bisa Anda kendalikan, dan oval yang mengikuti Anda. Sekarang saya punya file bernama: DrawPanel.class, kelas ini menggambar semua yang ada di layar, dan menangani tabrakan, suara, dll. Saya punya musuh.class, yang berbentuk oval mengikuti pemain. Saya mendapat entitas.class, yang merupakan pemain yang dapat Anda kontrol. Dan jika pemain berpotongan dengan pengikut, saya ingin objek pemain saya dihapus. Cara saya melakukannya:

    public void checkCollisions(){
    if(player.getBounds().intersects(follower1.getBounds())){
        Follower1Alive = false;
        player.health = player.health - 10;
    }
}

1
dapatkah Anda memberikan lebih banyak konteks?
Joseph Weissman

2
Tidak ada penghapusan objek di Java. Tetapi biasanya Anda tidak perlu: yang Anda butuhkan adalah memastikan tidak ada lagi yang ditampilkan di layar (jika ini yang dilakukan "mengikuti Anda").
Paŭlo Ebermann

Mungkin Anda ingin mencoba dan memaksa pengumpul sampah untuk membuang suatu objek? sudah ada pertanyaan tentang itu di sini . Atau mungkin Anda mencoba sesuatu yang lain? Anda dapat mencoba membaca sedikit tentang pengumpul sampah di sini atau di sini. Jika masih tidak membantu, Anda perlu lebih spesifik.
Fawix


Jika Anda benar-benar ingin menangani alokasi objek secara manual, gunakan JNI: create a C / C ++ lib yang digunakan dari kode Java tetapi melakukan semuanya (membuat, menghapus, dll.) Sendiri - tetapi di dalam lib Anda memiliki C / Kode C ++, tanpa Java. Saya belum melihat cara untuk menghapus objek Java secara manual. Jika profiler Anda memberi tahu Anda bahwa ada masalah, masalah ini sering kali didasarkan pada referensi "lupa" ke objek. Dalam kasus Anda, tampaknya tidak ada masalah di mana pun.
Johannes

Jawaban:


171

Anda harus menghapus referensi ke sana dengan menetapkan null atau meninggalkan blok di mana ia dideklarasikan. Setelah itu, secara otomatis akan dihapus oleh pengumpul sampah (tidak langsung, tapi akhirnya).

Contoh 1:

Object a = new Object();
a = null; // after this, if there is no reference to the object,
          // it will be deleted by the garbage collector

Contoh 2:

if (something) {
    Object o = new Object(); 
} // as you leave the block, the reference is deleted.
  // Later on, the garbage collector will delete the object itself.

Bukan sesuatu yang Anda cari saat ini, tetapi FYI: Anda dapat memanggil pengumpul sampah dengan panggilan System.gc ()


23
Harus menelepon secara manual System.gc()umumnya bukan ide yang baik , karena hal itu sebenarnya dapat diabaikan oleh JVM.
cdeange

3
Bukan ide yang bagus, tetapi Anda juga dapat memanggil seperti System .. Runtime.getRuntime (). Gc (). Info Lebih Lanjut: rutinitas pengumpulan sampah yang disediakan Java adalah anggota kelas Runtime. Kelas Runtime adalah kelas khusus yang memiliki satu objek (Singleton) untuk setiap program utama. Objek Runtime menyediakan mekanisme untuk berkomunikasi langsung dengan mesin virtual. Untuk mendapatkan instance Runtime, Anda bisa menggunakan metode Runtime.getRuntime (), yang mengembalikan file Singleton.
Timo

1
Apakah nullpenugasan merupakan tanda yang pasti bagi GC bahwa obyek ini akan Dibersihkan Sampah pada pemanggilan GC berikutnya? * Menetapkan nullke obyek koleksi (Daftar, Array) menandainya untuk dibersihkan? stackoverflow.com/questions/449409/…
George Daramouskas

Jadi saya harus membuat semua textview dan imagebuttons menjadi null di onPause?
Ruchir Baronia

Tidak ada jaminan bahwa pengumpul sampah akan berjalan, atau jika ya, ia akan mengumpulkan (bukan 'menghapus') objek tertentu.
Marquis dari Lorne

64

C ++ Anda ditampilkan.

Tidak ada deletedi java, dan semua objek dibuat di heap. JVM memiliki pengumpul sampah yang bergantung pada jumlah referensi.

Setelah tidak ada lagi referensi ke suatu objek, itu akan tersedia untuk dikumpulkan oleh pengumpul sampah.

myObject = nullmungkin tidak melakukannya; sebagai contoh:

Foo myObject = new Foo(); // 1 reference
Foo myOtherObject = myObject; // 2 references
myObject = null; // 1 reference

Semua yang dilakukan ini adalah menyetel referensi myObjectke null, ini tidak memengaruhi objek yang myObjectpernah ditunjuk kecuali untuk hanya mengurangi jumlah referensi sebesar 1. Karena myOtherObjectmasih merujuk ke objek itu, itu belum tersedia untuk dikumpulkan.


Jadi saya harus membuat semua textview dan imagebuttons menjadi null di onPause?
Ruchir Baronia

8
"JVM memiliki pengumpul sampah yang mengandalkan jumlah referensi." -> itu penjelasan yang sangat disederhanakan. Ia memeriksa apakah objek dapat dijangkau dari "root" tertentu
Johannes

2
JVM memiliki pengumpul sampah yang secara khusus tidak bergantung pada jumlah referensi. Ini bergantung pada jangkauan. Jika mengandalkan jumlah referensi, ia tidak akan pernah bisa mengumpulkan siklus, dan memang demikian.
Marquis dari Lorne

14

Jika Anda ingin membantu suatu objek pergi, setel referensinya ke null.

String x = "sadfasdfasd";
// do stuff
x = null;

Menyetel referensi ke null akan membuat objek lebih mungkin menjadi sampah yang dikumpulkan, selama tidak ada referensi lain ke objek tersebut.


Setiap kali saya melakukan itu, saat objek saya berpotongan, seluruh permainan saya akan berhenti, dan tidak akan menghapus objek tersebut.
Stan

Karena Anda mungkin melempar pengecualian pointer nol yang tidak tertangkap. Lebih banyak konteks pasti akan membantu kami memandu Anda melalui ini.
Joseph Weissman

Jadi saya harus membuat semua textview dan imagebuttons menjadi null di onPause?
Ruchir Baronia

Jika Anda benar-benar membutuhkannya untuk pergi, hal itu pada akhirnya akan berhasil.
John Percival Hackworth

3

Anda tidak perlu menghapus objek di java. Jika tidak ada referensi ke suatu objek, objek tersebut akan dikumpulkan oleh pengumpul sampah secara otomatis.


Jadi saya harus membuat semua textview dan imagebuttons menjadi null di onPause?
Ruchir Baronia

0

Anda dapat menghapus referensi menggunakan null.

Katakanlah Anda memiliki kelas A:

A a = new A();
a=null;

Pernyataan terakhir akan menghapus referensi objek adan objek itu akan "sampah dikumpulkan" oleh JVM. Ini adalah salah satu cara termudah untuk melakukan ini.


Jadi saya harus membuat semua textview dan imagebuttons menjadi null di onPause?
Ruchir Baronia


-6
//Just use a List
//create the list
public final List<Object> myObjects;

//instantiate the list
myObjects = new ArrayList<Object>();

//add objects to the list
Object object = myObject;
myObjects.add(object);

//remove the object calling this method if you have more than 1 objects still works with 1
//object too.

private void removeObject(){
int len = myObjects.size();
for(int i = 0;i<len; i++){
Objects object = myObjects.get(i);
myObjects.remove(object);
}
}

Alasan jawaban ini salah adalah karena hanya menghapus referensi ke Objek, dan bukan objek itu sendiri.
Ben Morris

Alasan mengapa jawaban ini salah karena ini menunjukkan bagaimana Anda dapat menghapus objek dari daftar - ini bukanlah pertanyaannya.
phil
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.