Mengapa ada keuntungan menggunakan metode statis dan meneruskan referensi ke objek sebagai parameter daripada memanggil metode pada objek?
Untuk memperjelas apa yang saya maksud, pertimbangkan kelas berikut:
public class SomeClass {
private double someValue;
public SomeClass() {
// Some constructor in which someValue is set
}
public void incrementValue() {
someValue++;
}
}
Dibandingkan dengan penerapan alternatif ini dengan metode statis:
public class SomeClass {
private double someValue;
public SomeClass() {
// Some constructor in which someValue is set
}
public static void incrementValue(SomeClass obj) {
obj.someValue++;
}
}
Pertanyaan saya tidak terbatas pada kelas ini saja; setiap titik di mana Anda akan melewati objek alih-alih menyebutnya dengan metode adalah hal yang saya minati. Apakah ini pernah menguntungkan? Jika demikian, mengapa?
java
object-oriented
static-methods
Addison Crump
sumber
sumber
Jawaban:
Contoh sepele: ketika instance dilewatkan dapat menjadi nol dan Anda ingin memasukkan penanganan (non-sepele) ini ke dalam metode.
sumber
Dalam contoh Anda, metode instance adalah pemenang yang jelas.
Dalam kasus umum, saya dapat memikirkan beberapa alasan di mana metode statis mungkin sesuai:
Anda ingin meletakkan metode statis di kelas lain, karena Anda memiliki situasi di mana masuk akal untuk memisahkan logika dari data (catatan: contoh Anda bukan salah satunya).
Anda melewati dua atau lebih objek dan ingin menekankan bahwa mereka sama pentingnya.
null
adalah nilai yang valid (seperti yang dijelaskan oleh pengguna 9000).sumber
Akan lebih bijaksana untuk memasukkan metode yang mengubah keadaan objek sebagai metode instance daripada metode statis .
Namun kita dapat menemukan contoh metode statis yang merupakan
pure
metode dan mengambil objek sebagai input, seperti ketika kita perlu instantiate objek berdasarkan aturan validasi tertentu. Misalnya, .NET memiliki metodeDateTime.TryParse(String s, DateTime d)
untuk memvalidasi dan membuat instance objek. Tetapi parameterDateTime d
secara eksplisit ditandai sebagaiout
.Kasus lain dapat terjadi ketika kita membandingkan objek dan ingin mendapatkan objek yang diinginkan sebagai nilai balik daripada nilai boolean / integer dari hasil perbandingan, misalnya
Team.GetHigherScorer(teamA, teamB).IncreaseRanking()
,. Ini akan lebih bersih daripada:(meninggalkan case "menarik" untuk kesederhanaan).
sumber
out
adalah.Net
kata kunci yang digunakan sebagai pengubah parameter. Ini menyatakan bahwa parameter dilewatkan oleh referensi. Lihat untuk detail msdn.microsoft.com/en-us/library/t3c3bfhx.aspxclass C { int x; static void M() {
maka M dapat diakses dengan sempurnax
. Misalnyaint y = (new C()).x;
legal.static void M() { this.x = 1; }
tidak mungkin.this.x
salah bukan karenax
tidak dapat diakses tetapi karenathis
tidak ada. Ini bukan masalah akses sama sekali, ini masalah keberadaan .Ketergantungan Injeksi akan menjadi alasan yang baik untuk melakukan panggilan ke metode statis. Dengan asumsi bahwa implementasi konkret
SomeClass
memiliki rantai warisan atau implementasi dari kelas lain. Anda dapat menggunakan tiruan dari suatu objek, meneruskannya untuk tujuan pengujian untuk memastikan bahwa metode Anda melakukan apa yang seharusnya, dan kemudian melaporkan status itu.sumber