Saya menemukan beberapa kode Java yang memiliki struktur berikut:
public MyParameterizedFunction(String param1, int param2)
{
this(param1, param2, false);
}
public MyParameterizedFunction(String param1, int param2, boolean param3)
{
//use all three parameters here
}
Saya tahu bahwa di C ++ saya dapat menetapkan parameter sebagai nilai default. Sebagai contoh:
void MyParameterizedFunction(String param1, int param2, bool param3=false);
Apakah Java mendukung sintaks semacam ini? Adakah alasan mengapa sintaks dua langkah ini lebih disukai?
public MyParameterizedFunction(String param1, int param2)
adalah konstruktor, bukan metode, deklarasi.Jawaban:
Tidak, struktur yang Anda temukan adalah bagaimana Java menanganinya (yaitu, dengan overloading bukan parameter default).
Untuk konstruktor, Lihat Tip Java yang Efektif: Memprogram Tip Item 1 Panduan Bahasa (Pertimbangkan metode pabrik statis alih-alih konstruktor) jika kelebihan beban semakin rumit. Untuk metode lain, mengganti nama beberapa case atau menggunakan objek parameter dapat membantu. Ini adalah ketika Anda memiliki kompleksitas yang cukup yang membedakan sulit. Kasus yang pasti adalah di mana Anda harus membedakan menggunakan urutan parameter, bukan hanya jumlah dan jenisnya.
sumber
static
segala sesuatu yang dianggap berbahaya pada tahun 2015. JenisBuilder
contoh lancar yang aman yang menegakkan kontrak konstruksi yang lengkap dan valid adalah solusi yang jauh lebih baik sekarang.new
. Mereka digunakan sepanjang waktu dalam kode baru. Pembangun untuk objek bernilai sederhana seringkali merupakan hasil rekayasa berlebihan.Tidak, tetapi Anda dapat menggunakan Pola Builder , seperti yang dijelaskan dalam jawaban Stack Overflow ini .
Seperti dijelaskan dalam jawaban yang ditautkan, Pola Builder memungkinkan Anda menulis kode seperti
di mana beberapa bidang dapat memiliki nilai default atau opsional.
sumber
Student s1 = new Student().age(16);
itu akan meninggalkan Anda dengan seorang Siswa tanpa nama, yang mungkin buruk. Jika tidak buruk, maka solusi Anda baik-baik saja.Ada beberapa cara untuk mensimulasikan parameter default di Java:
Metode kelebihan beban.
Salah satu batasan dari pendekatan ini adalah bahwa itu tidak berfungsi jika Anda memiliki dua parameter opsional dari jenis yang sama dan salah satu dari mereka dapat dihilangkan.
Varargs.
a) Semua parameter opsional memiliki tipe yang sama:
b) Jenis parameter opsional mungkin berbeda:
Kelemahan utama dari pendekatan ini adalah bahwa jika parameter opsional dari tipe yang berbeda Anda kehilangan pemeriksaan tipe statis. Lebih jauh, jika setiap parameter memiliki arti yang berbeda, Anda perlu cara untuk membedakannya.
Nulls. Untuk mengatasi keterbatasan pendekatan sebelumnya, Anda dapat mengizinkan nilai nol dan kemudian menganalisis setiap parameter dalam tubuh metode:
Sekarang semua nilai argumen harus disediakan, tetapi yang standar mungkin nol.
Kelas opsional. Pendekatan ini mirip dengan nol, tetapi menggunakan kelas Java 8 Opsional untuk parameter yang memiliki nilai default:
Opsional membuat metode kontrak eksplisit untuk penelepon, namun, orang mungkin menemukan tanda tangan seperti itu terlalu lisan.
Pola pembangun. Pola pembangun digunakan untuk konstruktor dan diimplementasikan dengan memperkenalkan kelas Builder yang terpisah:
Peta. Ketika jumlah parameter terlalu besar dan sebagian besar dari mereka nilai default biasanya digunakan, Anda bisa meneruskan argumen metode sebagai peta nama / nilai mereka:
Harap dicatat bahwa Anda dapat menggabungkan salah satu dari pendekatan ini untuk mencapai hasil yang diinginkan.
sumber
return this
dilakukan? Juga, bukanFooBuilder().setA("a").build();
karena (menurut definisi) konstruktor dipanggil pertama danFooBuilder()
mengembalikan nilai, bukankah ini berarti.setA("a"):
tidak mendapatkan kesempatan untuk dipanggil?return this
mengembalikan objek yang sama di mana metode dipanggil (dalam contoh,FooBuilder
). Hal ini memungkinkan perangkaian metode dalam satu pernyataan yang bekerja pada objek yang sama:new FooBuilder().setA(..).setB(..).setC(..)
dll sebagai lawan memanggil setiap metode dalam pernyataan terpisah.new FooBuilder()
mengembalikanFooBuilder
objek tempatsetA
metode ini dipanggil. SepertisetB
tidak dipanggil,this.b
mempertahankan nilai default. Akhirnyabuild
metode ini dipanggil padaFooBuilder
objek ini . Thebuild
Metode menciptakan dan mengembalikan sebuahFoo
objek yang diatur ke variabelFoo foo
. Perhatikan bahwaFooBuilder
objek tidak disimpan dalam variabel apa pun.Sayangnya tidak.
sumber
Sayangnya ya.
dapat ditulis dalam Java 1.5 sebagai:
Tetapi apakah Anda harus bergantung pada bagaimana perasaan Anda tentang pembuat kompiler a
untuk setiap panggilan.
Untuk beberapa parameter default:
dapat ditulis dalam Java 1.5 sebagai:
Ini cocok dengan sintaksis C ++, yang hanya mengizinkan parameter default di akhir daftar parameter.
Di luar sintaks, ada perbedaan di mana ini telah menjalankan jenis waktu memeriksa untuk melewati parameter defaultable dan tipe C ++ memeriksa mereka selama kompilasi.
sumber
assert
kode produksi. Lempar pengecualian.Tidak, tetapi Anda dapat dengan mudah meniru mereka. Apa yang ada di C ++ adalah:
Di Jawa, itu akan menjadi fungsi kelebihan beban:
Sebelumnya disebutkan, bahwa parameter default menyebabkan kasus ambigu dalam fungsi yang berlebihan. Itu tidak benar, kita dapat melihat dalam kasus C ++: ya, mungkin itu dapat membuat kasus yang ambigu, tetapi masalah ini dapat dengan mudah ditangani. Itu tidak dikembangkan di Jawa, mungkin karena pembuatnya menginginkan bahasa yang lebih sederhana seperti C ++ - jika mereka benar, adalah pertanyaan lain. Tetapi kebanyakan dari kita tidak berpikir dia menggunakan Jawa karena kesederhanaannya.
sumber
Anda dapat melakukannya di Scala, yang berjalan pada JVM dan kompatibel dengan program Java. http://www.scala-lang.org/
yaitu
sumber
Tidak , tetapi cara paling sederhana untuk mengimplementasikan ini adalah:
atau alih-alih operator ternary , Anda dapat menggunakan
if
:sumber
Saya mungkin menyatakan yang jelas di sini tapi mengapa tidak menerapkan parameter "default" sendiri?
untuk standarnya, Anda akan menggunakannya
dan jika Anda tidak ingin menggunakan default, Anda akan menggunakannya
sumber
//This is better public class Foo() { /* This does something */ public void func(String s){ //do something } /* This does something else with b */ public void func(String s, boolean b){ // b was passed } }
//Than this public class Foo() { /* This does something unless b = value, then it does something else */ public void func(String s, boolean b = value){ If (b){ // Do Something } else{ // Do something else } } }
Seperti Scala disebutkan, Kotlin juga layak disebut. Di Kotlin, parameter fungsi dapat memiliki nilai default juga dan mereka bahkan dapat merujuk ke parameter lain:
Seperti Scala, Kotlin berjalan pada JVM dan dapat dengan mudah diintegrasikan ke dalam proyek Java yang ada.
sumber
Tidak.
Anda dapat mencapai perilaku yang sama dengan melewati Obyek yang memiliki default pintar. Tetapi sekali lagi itu tergantung pada kasus Anda.
sumber
Tidak. Secara umum Jawa tidak memiliki banyak gula sintaksis, karena mereka mencoba membuat bahasa yang sederhana.
sumber
const
dangoto
harus dilindungi kata kunci yang ada implementasi? - Terutamaconst
adalah sesuatu yang saya rindukan -final
tidak ada pengganti dan mereka tahu itu. - Dan jika Anda membuat keputusan sadar untuk tidak pernah menerapkangoto
Anda tidak perlu memesan kata kunci. - Dan kemudian dalam Java Team ditipu dengan membuat Label berdasarkanbreak
dancontinue
sekuat Pascalgoto
.Alih-alih menggunakan:
Anda dapat menggunakan fungsionalitas opsional java dengan memiliki satu metode:
Perbedaan utama adalah bahwa Anda harus menggunakan kelas wrapper alih-alih tipe Java primitif untuk memungkinkan
null
input.Boolean
bukannyaboolean
,Integer
bukannyaint
dan sebagainya.sumber
Itu tidak didukung tetapi ada beberapa opsi seperti menggunakan pola objek parameter dengan beberapa gula sintaks:
Dalam sampel ini kami membangun
ParameterObject
dengan nilai default dan menimpanya di bagian inisialisasi instance kelas{ param1 = 10; param2 = "bar";}
sumber
Coba solusi ini:
sumber
Anda dapat menggunakan Java Method Invocation Builder untuk secara otomatis menghasilkan builder dengan nilai default.
Cukup tambahkan @GenerateMethodInvocationBuilder ke kelas, atau antarmuka, dan @Default ke parameter dalam metode di mana Anda ingin nilai default. Builder akan dihasilkan pada waktu kompilasi, menggunakan nilai default yang Anda tentukan dengan anotasi Anda.
Dan kemudian Anda dapat memanggil metode.
Atau atur nilai default apa pun ke sesuatu yang lain.
sumber
Pendekatan serupa dengan https://stackoverflow.com/a/13864910/2323964 yang berfungsi di Java 8 adalah dengan menggunakan antarmuka dengan getter default. Ini akan menjadi lebih banyak spasi putih, tetapi bisa dipermainkan, dan itu bagus untuk ketika Anda memiliki banyak contoh di mana Anda benar-benar ingin menarik perhatian pada parameter.
sumber
Saya sekarang telah menghabiskan cukup banyak waktu untuk mencari tahu bagaimana menggunakan ini dengan metode yang mengembalikan nilai, dan saya belum melihat contoh sejauh ini, saya pikir mungkin berguna untuk menambahkan ini di sini:
sumber
Beginilah cara saya melakukannya ... mungkin tidak semudah mungkin memiliki 'argumen opsional' terhadap parameter yang Anda tentukan, tetapi menyelesaikan pekerjaan:
Perhatikan saya bisa memanggil nama metode yang sama hanya dengan string atau saya bisa memohonnya dengan string dan nilai boolean. Dalam hal ini, pengaturan wipeClean ke true akan mengganti semua teks di TextArea saya dengan string yang disediakan. Mengatur wipeClean ke false atau membiarkannya bersama-sama cukup menambahkan teks yang disediakan ke TextArea.
Perhatikan juga saya tidak mengulangi kode dalam dua metode, saya hanya menambahkan fungsionalitas untuk dapat mengatur ulang TextArea dengan membuat metode baru dengan nama yang sama hanya dengan boolean yang ditambahkan.
Saya benar-benar berpikir ini sedikit lebih bersih daripada jika Java memberikan 'argumen opsional' untuk parameter kita karena kita perlu kode untuk nilai-nilai default dll. Dalam contoh ini, saya tidak perlu khawatir tentang semua itu. Ya, saya telah menambahkan metode lain ke kelas saya, tetapi lebih mudah untuk membaca dalam jangka panjang menurut pendapat saya.
sumber
TIDAK, Tapi kami punya alternatif dalam bentuk fungsi kelebihan beban.
dipanggil ketika tidak ada parameter yang dilewati
dipanggil ketika "a" parameter dilewatkan
dipanggil ketika parameter b berlalu
sumber
Ada setengah lusin masalah atau lebih baik seperti ini, pada akhirnya, Anda tiba di pola pabrik statis ... lihat API crypto untuk itu. Agak sulit untuk dijelaskan, tetapi pikirkan seperti ini: Jika Anda memiliki konstruktor, default atau sebaliknya, satu-satunya cara untuk menyebarkan keadaan di luar kurung kurawal adalah dengan memiliki Boolean yang valid; (bersama dengan null sebagai nilai default v gagal konstruktor) atau melemparkan pengecualian yang tidak pernah informatif ketika mendapatkannya kembali dari pengguna bidang.
Terkutuklah kode, saya menulis ribuan konstruktor garis dan melakukan apa yang saya butuhkan. Saya menemukan menggunakan isValid pada konstruksi objek - dengan kata lain, konstruktor dua baris - tetapi untuk beberapa alasan, saya bermigrasi ke pola pabrik statis. Saya sepertinya Anda bisa melakukan banyak hal jika Anda dalam pemanggilan metode, masih ada masalah sync () tetapi default dapat 'diganti' lebih baik (lebih aman)
Saya pikir apa yang perlu kita lakukan di sini adalah mengatasi masalah nol sebagai nilai default vis-a-vis sesuatu String one = new String (""); sebagai variabel anggota, kemudian melakukan pemeriksaan untuk null sebelum menetapkan string yang diteruskan ke konstruktor.
Sangat luar biasa jumlah ilmu komputer stratosfer mentah yang dilakukan di Jawa.
C ++ dan seterusnya memiliki lib vendor, ya. Java dapat berlari lebih cepat dari mereka di server skala besar karena itu adalah kotak peralatan besar. Pelajari blok penginisialisasi statis, tetap bersama kami.
sumber
Ini tidak didukung di java seperti dalam bahasa lain untuk ex. Kotlin.
sumber
Anda dapat menggunakan berikut-
sumber