Baru-baru ini saya mulai pemrograman di Groovy untuk kerangka pengujian integrasi, untuk proyek Java. Saya menggunakan Intellij IDEA dengan plug-in Groovy dan saya terkejut melihat sebagai peringatan untuk semua metode yang tidak statis dan tidak bergantung pada bidang contoh apa pun. Di Jawa, bagaimanapun, ini bukan masalah (setidaknya dari sudut pandang IDE).
Haruskah semua metode yang tidak bergantung pada bidang instance diubah menjadi fungsi statis? Jika benar, apakah ini khusus untuk Groovy atau tersedia untuk OOP secara umum? Dan mengapa?
Jawaban:
Perhatikan bahwa IDEA memiliki inspeksi ini untuk Java juga, itu disebut Metode mungkin 'statis' ,
Masalahnya adalah bahwa untuk kode Java, inspeksi ini dimatikan secara default (programmer dapat menyalakannya atas kebijakan mereka). Alasan untuk hal ini kemungkinan besar bahwa validitas / kegunaan inspeksi semacam itu dapat ditentang, berdasarkan beberapa sumber yang cukup otoritatif.
Untuk memulainya, tutorial resmi Java agak membatasi kapan metode harus statis:
Diberikan di atas, orang dapat berargumen bahwa menyalakan secara default pemeriksaan yang disebutkan tidak sesuai dengan penggunaan pengubah statis yang disarankan di Jawa.
Selain itu, ada beberapa sumber lain yang sejauh menyarankan pendekatan yang bijaksana dalam menggunakan ide-ide yang ada di balik inspeksi ini atau bahkan mengecilkannya.
Lihat misalnya artikel Java World - Tn. Happy Object mengajarkan metode statis :
Sebuah artikel di blog pengujian Google bahkan menyatakan bahwa Metode Statis adalah Kematian untuk Testabilitas :
Anda lihat, mengingat di atas tampak wajar bahwa inspeksi yang disebutkan dimatikan secara default untuk Java.
Pengembang IDE akan memiliki benar-benar kesulitan menjelaskan mengapa mereka pikir itu sangat penting untuk mengaturnya secara default, terhadap rekomendasi diakui secara luas dan praktik terbaik.
Bagi Groovy, segalanya sangat berbeda. Tak satu pun dari argumen yang tercantum di atas berlaku, terutama yang tentang testability, seperti yang dijelaskan misalnya dalam Mocking Static Methods dalam artikel Groovy di Javalobby:
Perbedaan ini kemungkinan mengapa pengaturan default untuk inspeksi yang disebutkan berlawanan di Groovy. Sementara di Java default "on" akan menjadi sumber kebingungan pengguna, di Groovy, pengaturan yang berlawanan bisa membingungkan pengguna IDE.
"Hei metode ini tidak menggunakan bidang contoh, mengapa kamu tidak memperingatkanku tentang hal itu?" Pertanyaan itu akan mudah dijawab untuk Jawa (seperti dijelaskan di atas), tetapi untuk Groovy, tidak ada penjelasan yang meyakinkan.
sumber
Sulit membayangkan bahwa ini akan membuat efek yang terlihat pada kinerja. Satu-satunya manfaat yang dapat saya lihat untuk membuatnya
static
adalah memberikan indikasi visual bahwa keadaan instance tidak terpengaruh. Dengan kata lain, ini memberitahu orang yang membaca kode sumber sesuatu ... "menarik" tentang metode itu, hanya karena ada di sana. Pertanyaan sebenarnya adalah, apakah itu menjelaskan atau membingungkan? "Mengapa metode ini statis? Apakah ini metode pabrik? Apakah kemampuan untuk menyebutnya tanpa instance objek diperlukan?"Selain itu, beberapa orang tidak suka metode statis, karena mereka mengklaim bahwa Anda tidak dapat mengejek mereka, dan karena itu mereka tidak dapat diuji, atau sesuatu di sepanjang garis itu. Tentu saja, jika Anda membuatnya statis untuk alasan biasa, seperti memberikan metode pabrik misalnya, maka saya semua untuk itu. Saya hanya tidak yakin bahwa membuat metode statis hanya karena mereka tidak menyentuh keadaan instance adalah amanah.
sumber
final
atau secara khusus dirancang dengan pewarisan dalam pikiran.Saya pikir ini untuk memungkinkan kemungkinan refactoring terlihat .
Setelah metode dibuat statis, jelas bahwa itu dapat dipindahkan dari kelas, katakanlah ke kelas persatuan.
Juga mudah untuk mengubahnya menjadi metode instan dari salah satu parameternya, sering kali ini adalah tempat kode seharusnya.
sumber
Perhatikan bahwa Anda mungkin memiliki kelas stateless yang mengimplementasikan beberapa antarmuka (misalnya
java.lang.Runnable
- Anda tidak dapat membuat metodenya statis. Beberapa pola (misalnya Strategi) juga dapat menghasilkan objek stateless yang bahkan mungkin memiliki beberapa metode.Statika adalah sepupu pertama dari lajang. Akan sangat sulit untuk beralih dari statika ke non statika pada titik selanjutnya - jadi ketika Anda perlu menambahkan status Anda akan tergoda untuk mulai memperkenalkan variabel statis.
sumber