Satu aturan dasar: tanyakan pada diri sendiri "Apakah masuk akal untuk memanggil metode ini, bahkan jika belum ada objek yang dibangun?" Jika demikian, itu pasti statis.
Jadi di kelas Car
Anda mungkin memiliki metode:
double convertMpgToKpl(double mpg)
... yang akan menjadi statis, karena orang mungkin ingin tahu apa konversi 35mpg, bahkan jika tidak ada yang pernah membangun Car
. Tetapi metode ini (yang menetapkan efisiensi satu Car
):
void setMileage(double mpg)
... tidak bisa statis karena tidak dapat memanggil metode sebelum ada yang Car
dibangun.
(Omong-omong, kebalikannya tidak selalu benar: Anda mungkin kadang-kadang memiliki metode yang melibatkan dua Car
objek, dan masih ingin itu menjadi statis. Misalnya:
Car theMoreEfficientOf( Car c1, Car c2 )
Meskipun ini dapat dikonversi ke versi non-statis, beberapa orang akan berpendapat bahwa karena tidak ada pilihan "istimewa" yang Car
lebih penting, Anda tidak boleh memaksa penelepon untuk memilih satu Car
sebagai objek yang Anda akan memanggil metode aktif. Namun, situasi ini menyumbang sebagian kecil dari semua metode statis.)
Car#isMoreEfficientThan(Car)
. Ini memiliki keuntungan bahwa mobil mana yang Anda kembalikan tidak tidak sembarangan. Jelas dengan judul metode apa yang dikembalikan dalam dasi.Tetapkan metode statis hanya dalam skenario berikut:
sumber
Ada beberapa alasan yang valid untuk menggunakan metode statis:
Kinerja : jika Anda ingin beberapa kode dijalankan, dan tidak ingin membuat instance objek tambahan untuk melakukannya, masukkan menjadi metode statis. JVM juga dapat mengoptimalkan metode statis banyak (saya pikir saya pernah membaca James Gosling menyatakan bahwa Anda tidak memerlukan instruksi khusus di JVM, karena metode statis akan sama cepatnya, tetapi tidak dapat menemukan sumbernya - dengan demikian itu bisa sepenuhnya salah). Ya, ini adalah mikro-optimasi, dan mungkin tidak dibutuhkan. Dan kita programmer tidak pernah melakukan hal-hal yang tidak dibutuhkan hanya karena mereka keren, bukan?
Kepraktisan : alih-alih menelepon
new Util().method(arg)
, meneleponUtil.method(arg)
, ataumethod(arg)
dengan impor statis. Lebih mudah, lebih pendek.Menambahkan metode : Anda benar-benar ingin String kelas memiliki
removeSpecialChars()
metode contoh, tetapi tidak ada di sana (dan seharusnya tidak, karena karakter khusus proyek Anda mungkin berbeda dari proyek lain), dan Anda tidak dapat menambahkannya (karena Java agak waras), jadi Anda membuat kelas utilitas, dan panggilremoveSpecialChars(s)
alih-alihs.removeSpecialChars()
. Manis.Kemurnian : mengambil beberapa tindakan pencegahan, metode statis Anda akan menjadi fungsi murni , yaitu, satu-satunya hal yang tergantung pada parameternya. Data masuk, data keluar. Ini lebih mudah dibaca dan di-debug, karena Anda tidak perlu kuatir tentang pewarisan. Anda dapat melakukannya dengan metode instance juga, tetapi kompiler akan membantu Anda sedikit lebih banyak dengan metode statis (dengan tidak mengizinkan referensi ke atribut instance, metode utama, dll.).
Anda juga harus membuat metode statis jika Anda ingin membuat singleton, tetapi ... jangan. Maksudku, pikirkan dua kali.
Sekarang, yang lebih penting, mengapa Anda tidak ingin membuat metode statis? Pada dasarnya, polimorfisme keluar dari jendela . Anda tidak akan bisa menimpa metode,
atau mendeklarasikannya dalam antarmuka(pra-Java 8) . Dibutuhkan banyak fleksibilitas dari desain Anda. Juga, jika Anda perlu menyatakan , Anda akan berakhir dengan banyak bug konkurensi dan / atau kemacetan jika Anda tidak berhati-hati.sumber
Setelah membaca artikel Misko saya percaya bahwa metode statis buruk dari sudut pandang pengujian. Anda seharusnya memiliki pabrik (mungkin menggunakan alat injeksi ketergantungan seperti Guice ).
bagaimana cara memastikan bahwa saya hanya punya satu saja
Masalah mendasar dengan metode statis adalah mereka adalah kode prosedural
sumber
Math.abs()
atauArrays.sort()
, bahkan metode Anda dapat meneruskan semua dependensi , saya tidak melihat bagaimana hal itu akan menghambat pengujian unit. Saya akan mengatakan aturan sederhana adalah: jika Anda pernah memiliki alasan untuk mengejek logika prosedural, maka jangan memasukkannya dalam metode statis. Saya tidak pernah punya alasan untuk mengejekArrays.sort()
atauMath.abs()
.Sebuah
static
metode adalah salah satu jenis metode yang tidak perlu objek apapun diinisialisasi untuk itu harus disebut. Pernahkah Anda perhatikanstatic
digunakan dalammain
fungsi di Jawa? Eksekusi program dimulai dari sana tanpa objek dibuat.Perhatikan contoh berikut:
sumber
Metode statis di java milik kelas (bukan turunan dari itu). Mereka tidak menggunakan variabel instan dan biasanya akan mengambil input dari parameter, melakukan tindakan di atasnya, lalu mengembalikan beberapa hasil. Metode instance dikaitkan dengan objek dan, seperti namanya, dapat menggunakan variabel instan.
sumber
Tidak, metode statis tidak terkait dengan sebuah instance; mereka termasuk kelas. Metode statis adalah contoh kedua Anda; metode instance adalah yang pertama.
sumber
Jika Anda menerapkan kata kunci statis dengan metode apa pun, itu dikenal sebagai metode statis.
// Program untuk mengubah properti umum semua objek (bidang statis).
O / P: 111 India BBDIT 222 Amerika BBDIT 333 Cina BBDIT
sumber
Metode statis tidak terkait dengan turunan, sehingga mereka tidak dapat mengakses bidang non-statis di kelas.
Anda akan menggunakan metode statis jika metode ini tidak menggunakan bidang apa pun (atau hanya bidang statis) dari suatu kelas.
Jika bidang non-statis suatu kelas digunakan, Anda harus menggunakan metode non-statis.
sumber
Metode statis harus dipanggil di Kelas, Metode Instans harus dipanggil pada Instans Kelas. Tetapi apa artinya itu dalam kenyataan? Ini adalah contoh yang bermanfaat:
Kelas mobil mungkin memiliki metode instan yang disebut Mempercepat (). Anda hanya dapat Mempercepat mobil, jika mobil itu benar-benar ada (telah dibangun) dan karenanya ini akan menjadi metode instan.
Kelas mobil mungkin juga memiliki metode penghitungan yang disebut GetCarCount (). Ini akan mengembalikan jumlah total mobil yang dibuat (atau dibuat). Jika tidak ada mobil yang dibangun, metode ini akan mengembalikan 0, tetapi harus tetap dapat dipanggil, dan karena itu harus menjadi metode statis.
sumber
Sebenarnya, kami menggunakan properti dan metode statis di kelas, ketika kami ingin menggunakan beberapa bagian dari program kami, harus ada di sana sampai program kami berjalan. Dan kita tahu bahwa, untuk memanipulasi properti statis, kita memerlukan metode statis karena mereka bukan bagian dari variabel instan. Dan tanpa metode statis, untuk memanipulasi properti statis membutuhkan waktu.
sumber
Gunakan metode statis ketika Anda ingin dapat mengakses metode tanpa turunan dari kelas.
sumber
Statis:
Obj.someMethod
Gunakan
static
ketika Anda ingin memberikan akses tingkat kelas ke suatu metode, yaitu di mana metode harus dapat dipanggil tanpa turunan dari kelas.sumber
Metode statis tidak perlu dipanggil pada objek dan saat itulah Anda menggunakannya. Contoh: Main () Anda adalah statis dan Anda tidak membuat objek untuk menyebutnya.
sumber
Metode dan variabel statis adalah versi terkontrol dari fungsi dan variabel 'Global' di Jawa. Di mana metode dapat diakses sebagai
classname.methodName()
atauclassInstanceName.methodName()
, yaitu metode dan variabel statis dapat diakses menggunakan nama kelas serta instance dari kelas.Kelas tidak dapat dinyatakan sebagai statis (karena tidak masuk akal. Jika kelas dinyatakan publik, itu dapat diakses dari mana saja), kelas dalam dapat dinyatakan statis.
sumber
Metode statis dapat digunakan jika
Seseorang tidak ingin melakukan tindakan atas contoh (metode utilitas)
Seseorang ingin menggunakan fungsi sederhana. Input secara eksplisit diteruskan, dan mendapatkan data hasil sebagai nilai balik. Inheritence, objek instanciation tidak muncul dalam gambar. Ringkas, Dapat Dibaca .
CATATAN : Beberapa orang menentang pengujian metode statis, tetapi metode statis juga dapat diuji! Dengan jMockit, seseorang dapat mengejek metode statis. Testabilitas . Contoh di bawah ini:
sumber
Metode statis adalah metode di Jawa yang dapat dipanggil tanpa membuat objek kelas. Itu milik kelas.
Kami menggunakan metode statis ketika kami tidak perlu menggunakan metode instance.
sumber
static
metode adalah untuk mengaksesstatic
bidang.Tetapi Anda dapat memiliki
static
metode, tanpa referensistatic
variabel. Metode pembantu tanpa merujukstatic
variabel dapat ditemukan di beberapa kelas java seperti java.lang.MathKasus penggunaan lain, saya bisa memikirkan metode ini dikombinasikan dengan
synchronized
metode adalah implementasi penguncian tingkat kelas di lingkungan multi-threaded.Jika Anda perlu mengakses metode pada objek instan kelas, metode Anda seharusnya tidak statis.
Halaman dokumentasi Oracle memberikan rincian lebih lanjut.
Tidak semua kombinasi instance dan variabel kelas dan metode diizinkan:
sumber
A common use for static methods is to access static fields.
bukan argumen.Metode statis memiliki dua tujuan utama:
sumber
Dalam gerhana Anda dapat mengaktifkan peringatan yang membantu Anda mendeteksi metode statis potensial. (Di atas garis yang disorot adalah satu lagi yang saya lupa tandai)
sumber
Setiap kali Anda tidak ingin membuat objek untuk memanggil metode dalam kode Anda hanya menyatakan metode itu sebagai statis. Karena metode statis tidak memerlukan turunan untuk dipanggil dengan tetapi tangkapan di sini tidak semua metode statis dipanggil oleh JVM secara otomatis. Hak istimewa ini hanya dapat dinikmati dengan metode main () "public static void main [String ... args]" di java karena pada Runtime ini adalah metode Signature public "static" void main [] yang dicari oleh JVM sebagai titik masuk ke mulai eksekusi kode.
Contoh:
Output: - Metode statis ini dijalankan oleh JVM. Metode statis ini perlu disebut secara eksplisit. Metode statis ini perlu disebut secara eksplisit. Metode statis ini perlu disebut secara eksplisit.
sumber