Di Scala saya melihat fitur seperti variabel objek-pribadi. Dari latar belakang Java saya yang tidak terlalu kaya, saya belajar untuk menutup semuanya (membuatnya pribadi) dan membuka (menyediakan pengakses) jika perlu. Scala memperkenalkan pengubah akses yang lebih ketat. Haruskah saya selalu menggunakannya secara default? Atau haruskah saya menggunakannya hanya dalam beberapa kasus tertentu di mana saya perlu secara eksplisit membatasi perubahan nilai bidang bahkan untuk objek dari kelas yang sama? Dengan kata lain, bagaimana saya harus memilih di antara keduanya
class Dummy {
private var name = "default name"
}
class Dummy {
private[this] var name = "default name"
}
Yang kedua lebih ketat dan saya menyukainya tetapi haruskah saya selalu menggunakannya atau hanya jika saya memiliki alasan yang kuat?
DIEDIT: Seperti yang saya lihat di sini private[this]
hanya beberapa sub-huruf dan alih-alih this
saya dapat menggunakan pengubah lain: "paket, kelas atau objek tunggal". Jadi saya akan meninggalkannya untuk beberapa kasus khusus.
Jawaban:
Saya tidak berpikir itu terlalu penting, karena perubahan apa pun hanya akan menyentuh satu kelas. Jadi alasan yang paling penting untuk memilih
private
lebihprotected
lebihpublic
tidak berlaku.Gunakan di
private[this]
mana kinerja benar-benar penting (karena Anda akan mendapatkan akses lapangan langsung daripada metode dengan cara ini). Jika tidak, hanya menetap di satu gaya sehingga orang tidak perlu mencari tahu mengapa ini propertiprivate
dan yang satu adalahprivate[this]
.sumber
private
, jadi dampaknya harus nol atau setidaknya sangat kecil.Ada kasus di mana
private[this]
diperlukan untuk membuat kompilasi kode. Ini ada hubungannya dengan interaksi notasi varians dan variabel yang bisa berubah. Pertimbangkan kelas (tidak berguna) berikut:Jadi kelas ini dirancang untuk menampung nilai opsional, mengembalikannya sebagai opsi dan memungkinkan pengguna untuk memanggil
makeEmpty
untuk menghapus nilai (karena itu var). Seperti yang dinyatakan, ini tidak berguna kecuali untuk menunjukkan maksudnya.Jika Anda mencoba mengompilasi kode ini dengan
private
alih - alihprivate[this]
itu akan gagal dengan pesan kesalahan berikut:Kesalahan ini terjadi karena nilai adalah variabel yang dapat berubah pada tipe kovarian T (+ T) yang biasanya menjadi masalah kecuali ditandai sebagai pribadi untuk instance dengan
private[this]
. Kompilator memiliki penanganan khusus dalam pemeriksaan variansnya untuk menangani kasus khusus ini.Jadi itu esoterik tetapi ada kasus di mana
private[this]
harus diselesaikanprivate
.sumber
private var name
dapat diakses dari metode apa punclass Dummy
(dan pendampingnyaobject Dummy
).private[this] var name
dapat diakses dari metodethis
objek saja, bukan dari objek lainclass Dummy
.sumber
sehingga Anda dapat melakukan [ini] pribadi setiap kali Anda mau tetapi Anda dapat memiliki beberapa masalah jika Anda perlu merujuknya
sumber
private[this]
tidak sama denganprotected[this]
.protected[this]
memungkinkan instance subclass mengakses anggota.this.y == that.y
menggunakan baik pribadi maupun pribadi [ini], saya baru mencoba keduanyaIni diuji menggunakan skala 2.11.5. Perhatikan kode di bawah ini
itu akan mengkompilasi dan bekerja sebagai kode java (1.8) ini
namun jika Anda menggunakan pengubah '[this]', kode di bawah ini tidak dapat dikompilasi
Ini karena dalam kasus pertama 'x' dapat diakses pada level kelas, sedangkan dalam kasus kedua adalah level instance yang lebih ketat. Ini berarti bahwa 'x' hanya dapat diakses dari instance yang dimilikinya. Jadi 'this.x' baik-baik saja tetapi 'other.x' tidak.
Anda dapat merujuk ke bagian 13.5 dari buku "Pemrograman dalam Skala: Panduan Langkah-demi-Langkah Komprehensif" untuk detail lebih lanjut tentang pengubah akses.
sumber
private[this]
artinya. Perhatikan kalimat pertama.Saat menambahkan cakupan ke pengubah privat ( private [X] ), ia secara efektif berperilaku sebagai "hingga" X, di mana X menunjuk beberapa paket, kelas, atau objek tunggal yang melingkupi.
Misalnya, private [bar] , di mana bar adalah sebuah paket berarti bahwa setiap instance dari setiap kelas yang termasuk dalam bilah paket dapat mengakses anggota mana pun yang dibatasi oleh pengubah.
Dalam kasus pribadi [ini] , itu berarti bahwa anggota hanya dapat diakses untuk setiap contoh. Ini menjadi lebih jelas dalam contoh berikut:
Seperti yang Anda lihat, Foo kedua tidak memiliki masalah karena setiap instance dapat mengakses private val i. Namun untuk Foo pertama, ada kesalahan karena setiap instance tidak dapat melihat instance lain i.
Merupakan praktik yang baik untuk menulis pribadi [ini] karena menerapkan batasan yang lebih besar.
sumber
Di sebagian besar bahasa pemrograman OOP seperti java, bidang / metode pribadi berarti bahwa bidang / metode pribadi ini tidak dapat diakses di luar kelas. Namun, instance / objek dari kelas yang sama dapat memiliki akses ke bidang privat objek menggunakan operator penugasan atau dengan cara menyalin konstruktor. Di Scala, private [this] adalah objek private, yang memastikan bahwa objek lain dari kelas yang sama tidak dapat mengakses anggota private [this].
Contoh
1. Tanpa pribadi [ini]
2. Menggunakan pribadi [ini]
Karenanya private [this] memastikan bahwa field _password hanya dapat diakses dengan ini.
sumber
Untuk menguraikan masalah kinerja yang disebutkan Alexey Romanov, berikut beberapa tebakan saya. Kutipan dari buku "Programming in Scala: A Comprehensive Step-by-Step Guide, 2nd Edition" Bagian 18.2:
Untuk mengujinya, kode ini akan menyebabkan kesalahan kompilasi:
Scala mengeluh tentang
error: ambiguous reference to overloaded definition
. Menambahkan kata kunci override kedata_=
tidak akan membantu harus membuktikan bahwa metode tersebut dihasilkan oleh compiler. Menambahkanprivate
kata kunci ke variabeldata
masih akan menyebabkan kesalahan kompilasi ini. Namun, kode berikut dapat dikompilasi dengan baik:Jadi, saya kira
private[this]
akan mencegah scala menghasilkan metode pengambil dan penyetel. Dengan demikian, mengakses variabel tersebut akan menghemat biaya pemanggilan metode pengambil dan penyetel.sumber
Lebih baik digunakan
private[this]
jika Anda berencana untuk menyinkronkan variabel.Berikut contoh bagus dari panduan gaya skala tim Spark :
sumber