Mengapa memiliki metode statis pribadi?

68

Saya hanya ingin menjernihkan pertanyaan yang saya miliki. Apa gunanya memiliki metode statis pribadi yang bertentangan dengan metode normal dengan visibilitas pribadi?

Saya akan berpikir keuntungan memiliki metode statis adalah bahwa ia dapat dipanggil tanpa turunan dari kelas, tetapi karena privasinya adakah yang menganggapnya statis?

Satu-satunya alasan yang dapat saya pikirkan adalah membantu secara konseptual memahami metode di tingkat kelas yang bertentangan dengan tingkat objek.

Rehan Naqvi
sumber
32
Ya, ada alasannya. Metode statis publik / default Anda masih dapat memanggil statika pribadi Anda. Apakah metode statis harus digunakan sama sekali, dan ketika layak untuk menggunakan metode pribadi dalam bentuk apa pun, adalah pertanyaan yang terpisah, jadi berhati-hatilah untuk tidak mencampurnya dengan pertanyaan ini.
2
Contoh cepat - metode pabrik yang digunakan oleh kelas dalam mencegah permohonan oleh kelas lain (Anda harus melalui metode pabrik untuk mendapatkan turunan dari kelas).
2
@MattFenwick: Anda harus memposting ini sebagai jawaban.
Doc Brown
9
Dengan membuat metode statis, Anda juga mengatakan bahwa itu tidak membaca atau menulis ke variabel instan. Metode yang tidak berinteraksi dengan variabel instan sering kali lebih mudah untuk dipindahkan dan direaktor ke tempat lain.
Mark Rogers
1
Jangan lupa bahwa terlepas dari apakah metode statis bersifat pribadi, internal, atau publik, metode ini tetap tidak aman tanpa upaya sinkronisasi kode khusus di pihak Anda.
Craig

Jawaban:

70

Karakteristik statis tidak tergantung pada visibilitas.

Alasan Anda ingin memiliki metode statis (beberapa kode yang tidak bergantung pada anggota non-statis) akan tetap berguna. Tapi mungkin Anda tidak ingin orang lain menggunakannya, hanya kelas Anda.

Miyamoto Akira
sumber
3
Saya pikir Anda berada di jalur yang benar, tetapi saya juga berpikir Anda kehilangan poin kunci. Sebagian besar metode statis tidak memiliki efek samping (mereka berfungsi secara efektif, bukan metode) - itulah sebabnya mereka dibuat statis. Argumen terhadap mereka menjadi pribadi adalah "Jika mereka tidak memiliki efek samping, mengapa tidak membuat mereka publik untuk mempromosikan penggunaan kembali kode". Itulah titik kunci: ketika kita menjadikannya pribadi, biasanya karena kami ingin Anda menggunakan kembali seluruh kelas yang menggunakan metode pribadi itu, bukan hanya metode itu.
corsiKa
Saya harus mengatakan saya tidak pernah melakukan itu atau melihat perilaku itu. Beberapa kali saya melakukannya adalah untuk metode pembantu untuk kelas statis publik.
Miyamoto Akira
1
@corsiKa: Efek samping bukan masalah. Menjadikan anggota statis kelas non-pribadi secara efektif menjanjikan bahwa setiap versi kelas yang akan datang akan memasukkan metode yang sama dengan nama yang sama yang melakukan hal yang sama. Jika kebutuhan berubah, dan versi kelas yang akan datang mungkin tidak membutuhkan metode yang bekerja persis seperti yang ada sekarang, metode pribadi dapat dengan aman diganti dengan yang lebih baik memenuhi kebutuhan baru kelas. Sebagai contoh sederhana, misalkan kelas membutuhkan sebuah metode yang mengambil string dan melakukan substitusi seperti <untuk &lt;, dll Ketika ada tertulis ...
supercat
1
... string yang diteruskan diketahui tidak mengandung ampersand, dan dengan demikian tidak dikonversi &menjadi &amp;[jika saya menulis kode, saya akan mengonversi &ke &amp;bahkan jika saya tidak mengharapkannya diperlukan, tetapi anggaplah tidak]. Hal itu kemudian menjadi perlu untuk menangani ampersands, tetapi metode ini umum, perubahan itu untuk memperluas &untuk &amp;bisa memecahkan kode luar yang melakukan sendiri &-to- &amp;substitusi. Namun, jika metode ini bersifat pribadi, bisa diperbaiki untuk ditangani &tanpa menimbulkan masalah bagi kode luar.
supercat
Itu masalah yang menarik untuk dikatakan, tapi saya tidak melihat bagaimana itu statis membuatnya lebih menjadi masalah daripada tidak statis, yang merupakan kunci untuk masalah ini. Jika kami mengikuti logika Anda, semuanya di mana saja akan menerapkan kembali semuanya karena "ya, bagaimana jika ada bug atau perubahan persyaratan suatu hari nanti?"
corsiKa
26

Alasan yang cukup umum (di Jawa) adalah untuk menginisialisasi variabel bidang yang tidak dapat diubah dalam sebuah konstruktor dengan menggunakan private staticmetode sederhana untuk mengurangi kekacauan konstruktor.

  • Yaitu private: kelas eksternal seharusnya tidak melihatnya.
  • Ini adalah static: ia dapat melakukan beberapa operasi, 1 independen dari kelas host.

Contoh yang agak dibuat-buat mengikuti ...

misalnya:

public class MyClass{
    private final String concatenated;

    public MyClass(String a, String b){
        concatenated = concat(a,b);
    }

    public String getConcatenated(){
       return concatenated;
    }

    /**
    *  Concatenates two Strings as `s1---s2`
    **/
    private static final String concat(String s1, String s2){
        return String.format("%s---%s", s1, s2);
    }
}

1 Dengan asumsi tidak ada interaksi dengan staticvariabel lain .

Sheldon Warkentin
sumber
15
Ini bahkan lebih berharga ketika Anda harus meneruskan argumen turunan (dihitung) ke konstruktor superclass. The super(...)panggilan harus menjadi baris pertama Anda konstruktor kelas, sehingga Anda tidak dapat mendeklarasikan variabel lokal untuk membantu Anda bekerja apa untuk lolos ke panggilan super. Namun, Anda dapat memanggil metode statis (pribadi), yang menggunakan sebanyak mungkin garis untuk mengetahui nilai yang akan diteruskan ke konstruktor super.
Andrzej Doyle
perhatikan bahwa ada kemungkinan blok penginisialisasi statis
Franz Ebner
13

Kasus penggunaan umum untuk suatu private staticmetode adalah metode utilitas

  1. hanya digunakan oleh satu kelas itu
  2. independen dari keadaan internal kelas itu
Philipp
sumber
12

Anda melihat bahwa Anda memiliki beberapa baris kode yang diulang dalam banyak metode Anda, jadi Anda memutuskan untuk mengekstraknya ke metode tunggal, karena kode duplikat tidak baik.

Anda menjadikan metode ini pribadi karena tidak dirancang untuk penggunaan luas dan Anda tidak ingin kode yang tidak terkait memanggilnya. (Debatkan poin ini di komentar ....)

Karena metode ini tidak mengakses bidang instance apa pun, itu bisa menjadi statis, dengan membuatnya statis Anda membuatnya lebih mudah untuk dipahami dan mungkin bahkan sedikit lebih cepat.

Lalu .... (Mungkin sekarang, mungkin nanti, mungkin tidak pernah)

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.

Ian
sumber
Saya suka jawaban ini, tetapi apakah Anda memiliki referensi terkini untuk ini? "dan mungkin bahkan sedikit lebih cepat"
Magnilex
@ Magnagnx, Pointer "this" tidak diteruskan ke metode kelas statis, oleh karena itu mereka akan cenderung lebih cepat daripada metode instance statis, kecuali jika kompiler mendeteksi "ini" tidak digunakan dalam metode instance (tidak mungkin).
Ian
2

Saya dapat memikirkan setidaknya dua alasan mengapa Anda memerlukan metode privat statis di kelas.

1: Mesin virtual Anda memiliki alasan untuk memanggil metode statis yang tidak ingin Anda panggil secara langsung, mungkin karena alat ini membagikan data di antara semua mesin virtual dari kelas Anda.

2: Metode statis publik Anda memiliki subrutin yang tidak ingin Anda panggil secara langsung. Metode ini masih dipanggil tanpa instance, hanya saja tidak secara langsung.

Tentu saja, "itu membantu kelas masuk akal" adalah alasan yang baik semua sendiri.

DougM
sumber
1

Secara umum, jika saya menemukan saya sedang menulis metode statis pribadi, saya menganggapnya sebagai indikasi bahwa ada sesuatu yang harus saya modelkan secara terpisah.

Karena mereka tidak terikat pada keadaan instance objek tertentu, kumpulan metode statis publik dan pribadi dapat membentuk kelas yang sepenuhnya terpisah dengan semantik sendiri & metode non-statis.

(Tip-off lain adalah jika saya menemukan saya memiliki banyak metode statis (publik dan pribadi) yang semuanya memiliki parameter umum dari beberapa jenis, mereka mungkin lebih baik sebagai anggota dari jenis itu.)

Jadi, untuk menjawab pertanyaan Anda, metode statis pribadi muncul ketika kelas menyediakan sekelompok metode terkait yang tidak bergantung pada turunan dari kelas itu. (... dan karena mereka mandiri, mereka mungkin lebih baik di kelas mereka sendiri.)

rampok
sumber
-1

Contoh yang sangat sederhana yang dapat saya pikirkan adalah, jika Anda ingin melakukan pemrosesan pada argumen input (atau manipulasi) yang dilewatkan ke fungsi utama. Jadi dalam hal ini jika pemrosesan besar dan fungsionalitas yang sama tidak akan digunakan di tempat lain akan masuk akal untuk memiliki fungsi pribadi karena tidak akan digunakan / dipanggil dari tempat lain + statis karena utama adalah statis.

techExplorer
sumber