Pertanyaan Kapan waktu yang tepat untuk menggunakan kata kunci 'baru'?


Kapan perlu menggunakan new kata kunci di Java. Saya tahu Anda seharusnya menggunakannya saat Anda membuat instance objek seperti ini:

TextView textView = new TextView(this);

Terkadang dalam kode saya memperhatikan hal itu new tidak digunakan dan saya menjadi bingung .. Di baris kode ini:

    AssetManager assetManager = getAssets();

Mengapa instance dari AssetManager tidak dibuat seperti ini:

AssetManager assetManager = new AssetManager();

maka itu diatur sama dengan getAssests ()?

Kapan seharusnya new digunakan?

Terima kasih!


8
2018-01-06 22:32


asal


Jawaban:


Anda menggunakan kata kunci baru ketika suatu objek secara eksplisit dibuat untuk pertama kalinya. Kemudian mengambil objek menggunakan metode pengambil baru tidak diperlukan karena objek sudah ada di memori, sehingga tidak perlu dibuat ulang.

jika Anda ingin deskripsi yang lebih detail tentang kunjungan baru dokumen oracle

Sebuah objek akan membutuhkan kata kunci 'baru' jika itu nol (yang mewah untuk tidak diinisialisasi).

EDIT:

Ini akan selalu mencetak "kebutuhan baru" dalam keadaan saat ini.

Object mObj = null;
if (mObj == null)
    System.out.println("needs new");
else
    System.out.println("does NOT need new");

OUTPUTS: needs new

Jadi untuk memperbaikinya, Anda akan melakukan sesuatu seperti:

Object mObj = new Object();
if (mObj == null)
    System.out.println("needs new");
else
    System.out.println("does NOT need new");
OUTPUTS: does NOT need new

Dan dalam situasi seperti itu kita akan selalu melihat "TIDAK perlu neW"


9
2018-01-06 22:35



Di java Anda selalu harus menggunakan new untuk instantiate objek (baik, hampir selalu). Dengan getAssests() Anda mengambil yang sudah dibuat. Saya kira pertanyaan Anda berasal dari c ++ di mana new mengalokasikan memori dinamis, tetapi karena java hanya memiliki objek yang dinamis, yang baru selalu dibutuhkan.


5
2018-01-06 22:38



Di Jawa, new MyClass()  membuat instance baru dari MyClass dan mengembalikan referensi ke sana.

Sementara itu, deklarasi:

MyClass foo;

mendefinisikan suatu variabel foo yang dapat menyimpan referensi ke sebuah instance dari MyClass, atau nilai khusus null yang menunjukkan tidak adanya referensi tersebut. Jika Anda tidak mengacu pada apa pun foo, nilai defaultnya akan menjadi null.

Anda pasti bisa menggabungkan hal-hal ini, mis. seperti ini:

MyClass foo;           // define a variable foo that can store an object reference
foo = new MyClass();   // create a new object and assign a reference to it to foo

atau, dengan kata lain, seperti ini:

MyClass foo = new MyClass();  // combined variable definition and assignment

Tapi kamu tidak memiliki untuk membuat instance baru setiap kali Anda menetapkan sesuatu ke variabel referensi. Anda juga bisa melakukan misalnya, ini:

MyClass foo, bar;      // define two reference variables, foo and bar
foo = new MyClass();   // create a new object and assign a reference to it to foo
bar = foo;             // now foo and bar point to the same object

atau bahkan:

MyClass foo = new MyClass(), bar = foo;  // same, but shorter

Perhatikan bahwa di Java, dibandingkan dengan beberapa bahasa lain seperti C ++, Anda tidak dapat menugaskan (salinan) objek yang sebenarnya ke dalam sebuah variabel. Sebaliknya, objek Java selalu diakses melalui referensi kepada mereka. Ketika seseorang berbicara tentang "menetapkan objek ke variabel" atau "mengirimkan objek sebagai parameter" atau "mengembalikan objek dari metode" di Java, apa yang sebenarnya selalu mereka maksudkan adalah menetapkan atau meneruskan atau mengembalikan referensi ke suatu objek.


Metode yang dapat dipanggil oleh kode Anda (dan sering dilakukan) juga mengembalikan referensi ke objek. Misalnya, jika kelas Anda memiliki metode seperti ini:

private MyClass getSomeObject() {
    // ...some code here...
}

Anda bisa menyebutnya dan menyimpan referensi itu kembali ke variabel seperti ini:

MyClass foo;
foo = getSomeObject();

atau seperti ini:

MyClass foo = getSomeObject();

Kita bisa tahu dari deklarasi metode itu getSomeObject() akan selalu mengembalikan referensi ke a MyClass contoh (atau null), tetapi bukan darimana asalnya itu berasal. Itu sepenuhnya tergantung pada apa kode di dalam getSomeObject()metode tidak. Kode mungkin selalu membuat yang baru MyClass misalnya dengan new MyClass() setiap kali dipanggil, dan mengembalikan referensi ke sana, atau mungkin selalu mengembalikan referensi ke sama obyek. Atau, tentu saja, terkadang bisa mengembalikan referensi ke objek baru, dan kadang-kadang ke yang sebelumnya dibuat.


Perhatikan bahwa, jika Anda menetapkan nilai baru ke variabel, variabel apa pun yang terkandung sebelumnya akan dilupakan. Jika nilai yang terlupakan terjadi menjadi referensi terakhir untuk beberapa objek, maka objek itu sendiri akan dihancurkan oleh pengumpul sampah Java.

Jadi, misalnya, meski sudah pasti mungkin untuk melakukan sesuatu seperti ini:

MyClass foo = new MyClass();  // create a new object and assign (a reference to) it to foo
foo = getSomeObject();        // forget the previous content of foo and replace it with whatever getSomeObject() returns

itu biasanya tidak masuk akal, karena Anda akan membuat yang baru MyClass Misalnya hanya untuk segera membuang referensi Anda hanya untuk itu dan menggantinya dengan sesuatu yang lain. Sebenarnya, kode di atas sama persis dengan:

new MyClass();       // create a new object and throw away(!) the reference to it
MyClass foo = getSomeObject();  // assign whatever getSomeObject() returns to foo

Satu-satunya waktu yang bisa sangat masuk akal adalah jika Anda ingin untuk membuat yang baru MyClass contoh dan segera biarkan sampah dikumpulkan, mis. karena MyClass konstruktor memiliki beberapa efek samping yang ingin Anda picu. Tapi karena biasanya dianggap gaya buruk bagi konstruktor untuk memiliki efek samping yang tidak sepele (atau, lebih umum, untuk melakukan apa saja selain menyiapkan objek baru), Anda seharusnya tidak memiliki alasan untuk menulis kode tersebut.


4
2017-10-29 18:05



new selalu digunakan untuk membuat objek baru.

ini

AssetManager assetManager = getAssets();

hanya penugasan nilai yang dikembalikan dari metode getAssets() untuk referensi assetManager.

[sunting]

aku berbohong tentang new mungkin untuk melakukan sesuatu seperti ini:

Foo.class.newInstance();

dan juga Anda bisa menggunakan refleksi:

Foo.class.getDeclaredConstructors(Class[] parameterTypes).newInstance(arguments);

3
2018-01-06 22:40



Yang baru digunakan ketika Anda memanggil konstruktor untuk suatu fungsi. getAssets () mengembalikan AssetManager, tidak perlu membuat yang baru.


2
2018-01-06 22:36



Dengan menggunakan new Anda mengalokasikan memori untuk objek.

Menggunakan sebuah getXXX() digunakan untuk mendapatkan objek yang sudah ada yang sudah dialokasikan.


2
2018-01-06 22:36



Karena Anda menandai ini dengan [android], saya menduga kode Anda ada di dalam Activity atau Service. Pada kasus ini, getAssets() adalah metode kelas yang Anda kembangkan. Jadi Anda tidak benar-benar menciptakannya, Anda meminta kode yang sudah ada untuk memberi Anda referensi ke apa yang sudah ada.


2
2018-01-06 22:36