Caching Rujukan Kaedah dalam Java 8
Java 8 memperkenalkan rujukan kaedah, yang menyediakan sintaks ringkas untuk merujuk kaedah dan pembina contoh. Walau bagaimanapun, terdapat kebimbangan mengenai sama ada caching rujukan ini bermanfaat. Untuk memahami topik ini, adalah penting untuk membezakan antara rujukan kaedah caching untuk pelaksanaan kerap tapak panggilan yang sama dan cachingnya untuk pelbagai kegunaan rujukan kaedah oleh tapak panggilan yang berbeza.
Caching Rujukan Kaedah untuk Tapak Panggilan yang Sama
Pertimbangkan kod berikut di mana Foo.func() dipanggil berulang kali melalui doSomethingWithAFunc():
class Foo { Y func(X x) {...} void doSomethingWithAFunc(Function<X,Y> f){...} void hotFunction(){ doSomethingWithAFunc(this::func); } }
Caching this::func kononnya akan menghapuskan penciptaan kejadian kelas tanpa nama baharu setiap kali hotFunction() dilaksanakan. Walau bagaimanapun, JVM sudah pun mengoptimumkan senario ini dengan menggunakan semula tika tapak panggilan yang dibuat semasa seruan pertama lambda. Caching rujukan kaedah dalam kes ini adalah berlebihan.
Caching Rujukan Kaedah untuk Tapak Panggilan Berbeza
Sebaliknya, pertimbangkan contoh berikut:
Runnable r1 = System::gc; Runnable r2 = System::gc;
Di sini, dua tapak panggilan berbeza menghasilkan rujukan kaedah kepada kaedah sasaran yang sama System.gc() dalam java.lang.System. JVM dibenarkan untuk berkongsi satu contoh lambda di antara mereka, tetapi pelaksanaan semasa dalam Java 8 tidak berbuat demikian. Ini disebabkan oleh faedah prestasi yang tidak menentu dalam mengekalkan cache kejadian lambda.
Amalan Terbaik
Memandangkan pertimbangan ini, secara amnya tidak disyorkan untuk menggunakan rujukan kaedah cache melainkan terdapat adalah kebimbangan prestasi khusus yang telah dikenal pasti melalui pengukuran. Caching boleh berpotensi mengubah tingkah laku pelaksanaan program, dan ia hanya perlu dipertimbangkan dalam kes berikut:
Apabila lambda dicipta dalam pembina atau permulaan kelas dan:
Atas ialah kandungan terperinci Adakah Caching Rujukan Kaedah dalam Java 8 Menawarkan Keuntungan Prestasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!