জাভাতে কোনও জিনিস মুছে ফেলছেন?


101

আমি আমার তৈরি একটি বস্তু, (একটি ডিম্বাকৃতি যা আপনাকে অনুসরণ করে) মুছতে চাই, তবে আমি কীভাবে এটি করব?

delete follower1;

কাজ হয়নি।

সম্পাদনা:

ঠিক আছে, আমি আরও কিছু প্রসঙ্গ দেব। আমি ডিম্বাকৃতি, যা আপনি নিয়ন্ত্রণ করতে পারেন এবং একটি ডিম্বাকৃতি যা আপনাকে অনুসরণ করে একটি ছোট গেম তৈরি করছি। এখন আমি ফাইলগুলি পেয়েছি: ড্রপানেলক্লাস, এই শ্রেণিটি স্ক্রিনে সমস্ত কিছু আঁকবে এবং সংঘর্ষ, শব্দ ইত্যাদি পরিচালনা করে আমি একটি শত্রু। আমি একটি সত্তা.প্রেম পেয়েছি, যা আপনি নিয়ন্ত্রণ করতে পারেন প্লেয়ার। এবং যদি প্লেয়ার অনুগামীটির সাথে ছেদ করে তবে আমি চাই যে আমার প্লেয়ারটির উদ্দেশ্য মুছে ফেলা হোক। আমি যেভাবে এটি করছি:

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

4
আপনি কি আরও কিছু প্রসঙ্গ সরবরাহ করতে পারেন?
জোসেফ ওয়েইসম্যান

4
জাভাতে কোনও জিনিস মুছে ফেলা হচ্ছে না। তবে আপনার সাধারণত প্রয়োজন হয় না: আপনার যা প্রয়োজন তা হ'ল স্ক্রিনে আর কিছু দেখানো হয়নি তা নিশ্চিত করা (যদি এটি "আপনাকে অনুসরণ করে" কী করছে)।
পাওলো ইবারম্যান

সম্ভবত আপনি চেষ্টা করতে এবং জঞ্জাল সংগ্রহকারীকে কোনও বিষয় অপসারণ করতে বাধ্য করতে চান? এখানে ইতিমধ্যে এখানে একটি প্রশ্ন আছে । অথবা সম্ভবত আপনি অন্য কিছু চেষ্টা করছেন? আপনি এখানে বা এখানে আবর্জনা সংগ্রহকারী সম্পর্কে কিছুটা পড়ার চেষ্টা করতে পারেন এটি এখনও যদি কোনও সহায়তা না করে তবে আপনার আরও নির্দিষ্ট হওয়া দরকার।
ফওিক্স


আপনি যদি সত্যই সত্যই বস্তুর বরাদ্দগুলি ম্যানুয়ালি হ্যান্ডেল করতে চান তবে জেএনআই ব্যবহার করুন: একটি সি / সি ++ লাইব তৈরি করুন যা জাভা কোড থেকে ব্যবহৃত হয় তবে এটি নিজেই সবকিছু তৈরি করে (মুছুন, মুছুন ইত্যাদি) - তবে আপনার লাইবের ভিতরে আপনি সি / সি ++ কোড, জাভা নেই। আমি নিজে কোনও জাভা বস্তু মোছার কোনও উপায় দেখিনি। যদি আপনার প্রোফাইলার যদি আপনাকে বলে যে সমস্যা আছে, তবে এই সমস্যাগুলি প্রায়শই বস্তুর "ভুলে যাওয়া" রেফারেন্সের ভিত্তিতে থাকে। আপনার ক্ষেত্রে কোথাও কোনও সমস্যা বলে মনে হচ্ছে না।
জোহানেস

উত্তর:


178

নাল বরাদ্দ করে বা যেখানে ঘোষনা করা হয়েছে সেই ব্লকটি রেখে আপনার এর উল্লেখগুলি সরিয়ে ফেলতে হবে। এর পরে, এটি আবর্জনা সংগ্রহকারী দ্বারা স্বয়ংক্রিয়ভাবে মুছে ফেলা হবে (অবিলম্বে নয়, তবে শেষ পর্যন্ত)।

উদাহরণ 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

উদাহরণ 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.

আপনি বর্তমানে সন্ধান করছেন এমন কিছু নয়, তবে এফওয়াইআই: আপনি আবর্জনা সংগ্রহকারীকে কল করতে পারেন System.gc () কল দিয়ে


24
ম্যানুয়ালি কল System.gc()করা সাধারণত ভাল ধারণা নয় , যেহেতু এটি আসলে জেভিএম দ্বারা উপেক্ষা করা যেতে পারে।
cdeange

4
একটি ভাল ধারণা নয়, তবে আপনি সিস্টেমের মতোও কল করতে পারেন .. রানটাইম.জেটআরটাইম ()। গিসি ()। আরও তথ্য: তিনি আবর্জনা সংগ্রহের রুটিনগুলি যা জাভা সরবরাহ করে তা রানটাইম ক্লাসের সদস্য। রানটাইম ক্লাসটি একটি বিশেষ শ্রেণি যা প্রতিটি প্রধান প্রোগ্রামের জন্য একটি একক অবজেক্ট (একটি সিঙ্গলটন) থাকে। রানটাইম অবজেক্টটি ভার্চুয়াল মেশিনের সাথে সরাসরি যোগাযোগের জন্য একটি ব্যবস্থা সরবরাহ করে। রানটাইম উদাহরণটি পেতে, আপনি রানটাইম.সেটআরটাইম () পদ্ধতিটি ব্যবহার করতে পারেন, যা সিঙ্গলটনে ফিরে আসে।
টিমো

4
nullনিয়োগটি কি জিসির একটি নির্দিষ্ট লক্ষণ যে এই বস্তুটি পরবর্তী জিসির অনুরোধে আবর্জনা পরিষ্কার করা উচিত? * nullসংগ্রহের জিনিসগুলিকে (তালিকা, অ্যারেগুলি) নির্ধারণের জন্য সেগুলি পরিষ্কার করার জন্য চিহ্নিত করে? stackoverflow.com/questions/449409/...
জর্জ Daramouskas

সুতরাং আমার আমার সমস্ত পাঠ্যদর্শন এবং ইমেজবটনগুলি নালায় করা উচিত onPause?
রুচির বড়োনিয়া

আবর্জনা সংগ্রাহক কখনই চলবে তার কোনও গ্যারান্টি নেই বা এটি যদি তা করে তবে এটি কোনও নির্দিষ্ট অবজেক্ট সংগ্রহ করবে ('মুছবে না')।
মারকুইস

65

আপনার সি ++ প্রদর্শিত হচ্ছে।

deleteজাভাতে কোনও নেই , এবং সমস্ত বস্তু গাদা উপর তৈরি করা হয়। জেভিএম-এর একটি আবর্জনা সংগ্রাহক রয়েছে যা রেফারেন্স গণনার উপর নির্ভর করে।

একবার কোনও বস্তুর আর কোনও উল্লেখ নেই, এটি আবর্জনা সংগ্রহকারী সংগ্রহের জন্য উপলব্ধ হয়ে যায়।

myObject = nullএটা নাও করতে পারে; উদাহরণ স্বরূপ:

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

এই সমস্ত কাজটি রেফারেন্স সেট করে myObjectদেয়, এটি myObjectএকবারে রেফারেন্স গণনা ১ দ্বারা হ্রাস ব্যতীত একবার নির্দেশিত বস্তুকে প্রভাবিত করে না, যেহেতু myOtherObjectএখনও সেই বস্তুকে বোঝায়, এটি সংগ্রহ করার জন্য এখনও উপলভ্য নয়।


সুতরাং আমার আমার সমস্ত পাঠ্যদর্শন এবং ইমেজবটনগুলি নালায় করা উচিত onPause?
রুচির বড়োনিয়া

8
"জেভিএমের একটি আবর্জনা সংগ্রাহক রয়েছে যা রেফারেন্স গণনার উপর নির্ভর করে।" -> এটি খুব সরল ব্যাখ্যা। এটি নির্দিষ্ট "মূল" থেকে অবজেক্টগুলি পৌঁছনীয় কিনা তা যাচাই করে
জোহানেস

4
জেভিএমের একটি আবর্জনা সংগ্রাহক রয়েছে যা নির্দিষ্ট করে রেফারেন্স গণনার উপর নির্ভর করে না । এটি পুনঃপ্রকাশের উপর নির্ভর করে। যদি এটি রেফারেন্স গণনার উপর নির্ভর করে তবে এটি কখনই চক্র সংগ্রহ করতে পারে না এবং তা করে।
Lorne এর মার্কুইস

14

আপনি যদি কোনও জিনিসকে দূরে যেতে সহায়তা করতে চান তবে তার রেফারেন্সটি নালায় সেট করুন।

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

নালকে রেফারেন্স সেট করা এটির আরও বেশি সম্ভাবনা তৈরি করবে যে যতক্ষণ অবজেক্টের সাথে অন্য কোনও রেফারেন্স না থাকে।


যখনই আমি এটি করি, যখন আমার বস্তুটি ছেদ করে, আমার পুরো গেমটি হিমশীতল হয়ে যায় এবং এটি অবজেক্টটিকে মুছবে না।
স্ট্যান

কারণ আপনি সম্ভবত একটি অপ্রয়োজনীয় নাল পয়েন্টার ব্যতিক্রম ছোঁড়াচ্ছেন। আরও প্রসঙ্গ অবশ্যই আপনাকে এর মাধ্যমে আপনাকে গাইড করতে সহায়তা করবে।
জোসেফ ওয়েইসমান

সুতরাং আমার আমার সমস্ত পাঠ্যদর্শন এবং ইমেজবটনগুলি নালায় করা উচিত onPause?
রুচির বড়োনিয়া

আপনার যদি সত্যিই তাদের চলে যাওয়ার দরকার হয়, তবে এটি শেষ পর্যন্ত এটি করবে।
জন পারসিভাল হ্যাকওয়ার্থ

3

আপনার জাভাতে অবজেক্টগুলি মুছতে হবে না। যখন কোনও জিনিসের কোনও রেফারেন্স নেই, এটি আবর্জনা সংগ্রহকারী স্বয়ংক্রিয়ভাবে সংগ্রহ করবে।


সুতরাং আমার আমার সমস্ত পাঠ্যদর্শন এবং ইমেজবটনগুলি নালায় করা উচিত onPause?
রুচির বড়োনিয়া

0

আপনি ব্যবহার করে রেফারেন্সটি সরাতে পারেন null

এর ক্লাস আছে বলে দিন A:

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

শেষ বিবৃতিটি অবজেক্টের রেফারেন্স সরিয়ে ফেলবে aএবং সেই বস্তুটি জেভিএম দ্বারা "আবর্জনা সংগ্রহ করা" হবে। এটি করার অন্যতম সহজ উপায় এটি।


সুতরাং আমার আমার সমস্ত পাঠ্যদর্শন এবং ইমেজবটনগুলি নালায় করা উচিত onPause?
রুচির বড়োনিয়া


-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);
}
}

এই উত্তরটি ভুল হওয়ার কারণ এটি কেবলমাত্র অবজেক্টের একটি রেফারেন্স সরিয়ে দেয় এবং প্রকৃত অবজেক্টটি নিজেই নয়।
বেন মরিস

এই উত্তরটি ভুল হওয়ার কারণ এটি আপনাকে দেখায় যে কীভাবে আপনি কোনও তালিকা থেকে কোনও বস্তু সরিয়ে ফেলতে পারেন - এটি প্রশ্ন ছিল না।
ফিল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.