Salah satu penggunaan kata kunci var di C # adalah deklarasi tipe implisit. Apakah sintaks yang setara dengan Java untuk var ?
Salah satu penggunaan kata kunci var di C # adalah deklarasi tipe implisit. Apakah sintaks yang setara dengan Java untuk var ?
Jawaban:
Tidak ada. Sayangnya, Anda harus mengetikkan nama tipe lengkap.
Sunting: 7 tahun setelah diposting, ketik inferensi untuk variabel lokal (dengan var
) ditambahkan di Java 10.
Sunting: 6 tahun setelah diposting, untuk mengumpulkan beberapa komentar dari bawah:
Alasan C # memiliki var
kata kunci adalah karena itu mungkin untuk memiliki Jenis yang tidak memiliki nama di .NET. Misalnya:
var myData = new { a = 1, b = "2" };
Dalam hal ini, tidak mungkin untuk memberikan tipe yang tepat myData
. 6 tahun yang lalu, ini tidak mungkin di Jawa (semua Jenis memiliki nama, bahkan jika mereka sangat verbose dan tidak berbahaya). Saya tidak tahu apakah ini telah berubah dalam waktu yang bersamaan.
var
tidak sama dengan dynamic
. var
iables masih 100% diketik secara statis. Ini tidak akan mengkompilasi:
var myString = "foo";
myString = 3;
var
juga berguna ketika jenisnya jelas dari konteks. Sebagai contoh:
var currentUser = User.GetCurrent();
Saya dapat mengatakan bahwa dalam kode apa pun yang menjadi tanggung jawab saya, currentUser
memiliki User
kelas turunannya. Jelas, jika implementasi Anda User.GetCurrent
mengembalikan int, maka mungkin ini merugikan Anda.
Ini tidak ada hubungannya dengan var
, tetapi jika Anda memiliki hierarki pewarisan aneh di mana Anda membayangi metode dengan metode lain (mis. new public void DoAThing()
), Jangan lupa bahwa metode non-virtual dipengaruhi oleh Tipe yang mereka gunakan.
Saya tidak bisa membayangkan skenario dunia nyata di mana ini menunjukkan desain yang baik, tetapi ini mungkin tidak berfungsi seperti yang Anda harapkan:
class Foo {
public void Non() {}
public virtual void Virt() {}
}
class Bar : Foo {
public new void Non() {}
public override void Virt() {}
}
class Baz {
public static Foo GetFoo() {
return new Bar();
}
}
var foo = Baz.GetFoo();
foo.Non(); // <- Foo.Non, not Bar.Non
foo.Virt(); // <- Bar.Virt
var bar = (Bar)foo;
bar.Non(); // <- Bar.Non, not Foo.Non
bar.Virt(); // <- Still Bar.Virt
Seperti yang ditunjukkan, metode virtual tidak terpengaruh oleh ini.
Tidak, tidak ada cara non-canggung untuk menginisialisasi var
tanpa variabel aktual.
var foo1 = "bar"; //good
var foo2; //bad, what type?
var foo3 = null; //bad, null doesn't have a type
var foo4 = default(var); //what?
var foo5 = (object)null; //legal, but go home, you're drunk
Dalam hal ini, lakukan saja dengan cara lama:
object foo6;
var p = new X(); p.Z()
tidak sama dengan SuperX p = new X(); p.Z()
untuk semua X dan dan SuperX, meskipun X : SuperX
. Dengan var
yang statis jenis p
selalu X
dalam contoh pertama di atas, tetapi selalu SuperX
dalam contoh kedua. Perbedaan yang halus tetapi penting untuk diperhatikan. Tetapi jawaban Anda sangat benar :-)
var
tidak membuat kode kurang jelas. Justru sebaliknya menurut saya. Mengapa misalnya menulis tipe dua (atau bahkan tiga) kali pada baris yang sama ketika Anda mendeklarasikan dan membuat instance ( RadioButton radioButton = new RadioButton();
)? var
membuat Anda lebih suka berpikir dua kali ketika Anda memberi nama variabel Anda karena itu mengubah fokus pada fungsi daripada jenis (misalnya UserCollection collection = new userRepository.GetUsers();
agak lebih alami berubah menjadi var users = userRepository.GetUsers();
). Jika Anda pikir var
tidak jelas itu hanya karena tidak terbiasa.
var
sangat jelas dapat membuat kode yang jelas digunakan dengan baik, tetapi juga dapat membuatnya tidak jelas terlalu buruk digunakan; seperti banyak opsi pemformatan. Saldo berbeda tergantung pada seberapa banyak Anda menggunakan objek dan generik anonim, yang tidak ada dalam. NET 1.0, menjadikannya kurang berguna sebagai kata kunci hipotetis dalam versi pertama C♯. Saya hanya akan menyebutkan RadioButton
radioButton
dalam kasus metode pabrik atau penolong di mana satu-satunya hal penting tentang tombol adalah bahwa itu adalah RadioButton
, kalau tidak itu gila dengan atau tanpa var
.
var
Anda, jika tidak lebih, tapi saya telah mengubah pendapat saya, dan mungkin itu sesederhana pertanyaan pendapat yang berbeda, karena saya masih berpikir Anda salah ketika Anda mengatakan itu adalah peduli seberapa banyak Anda menggunakan objek anonim dan generik;) Deklarasi tipe paling sering hanya kode noise, jika Anda tidak dapat memahami kode tanpa itu kode mungkin tidak jelas dalam kedua kasus.
var
itu sendiri hanya meminta kompiler untuk menyimpulkan jenis dari tugas; itu gula sintaksis. Awalnya saya ragu dengan itu, tetapi saya menggunakannya secara religius dan belum menemukan waktu di mana itu menyebabkan kebingungan. Ini menghilangkan redundansi saat instantiasi dan menghilangkan kebutuhan untuk memeriksa jenis ketika referensi. Tidak ada padanan JAVA pada JAVA 9.
Jika Anda menambahkan Lombok ke proyek Anda, Anda dapat menggunakan kata kunci val .
final
tidak selalu berubah. Pertimbangkanfinal StringBuilder strB = new StringBuilder("My reference is final"); strB.append("I'm not immutable");
var
. projectlombok.org/features/experimental/var.html
JEP - Proposal Peningkatan JDK
http://openjdk.java.net/jeps/286
JEP 286: Inferensi Tipe Variabel Lokal
Penulis Brian Goetz
// Goals:
var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>
Saya telah membuat plugin untuk IntelliJ yang - dengan cara - memberi Anda var
di Jawa. Ini adalah hack, jadi penafian yang biasa berlaku, tetapi jika Anda menggunakan IntelliJ untuk pengembangan Java Anda dan ingin mencobanya, itu ada di https://bitbucket.org/balpha/varsity .
Dengan dirilisnya JDK 10 pada 20 Maret, Java sekarang memasukkan var
nama tipe yang dicadangkan (bukan kata kunci — lihat di bawah) sebagaimana ditentukan dalam JEP 286 . Untuk variabel lokal, berikut ini sekarang berlaku di Java 10 atau lebih tinggi:
var map = new HashMap<String, Integer>();
Nama var
jenis yang dicadangkan di Jawa hampir identik dengan var
kata kunci dalam C # di mana keduanya memungkinkan untuk mengetik secara implisit (lihat di bawah untuk perbedaan penting). var
di Jawa hanya dapat digunakan untuk inferensi tipe implisit dalam konteks berikut (sebagaimana disebutkan dalam JEP 286: Tujuan ):
Oleh karena itu var
tidak dapat digunakan untuk bidang, tipe pengembalian, nama kelas, atau nama antarmuka. Alasannya adalah untuk menghapus kebutuhan untuk memasukkan nama tipe panjang ketika mendeklarasikan dan mendefinisikan variabel lokal, sebagaimana dinyatakan dalam JEP 286 (ditulis oleh Brian Goetz):
Kami berupaya meningkatkan pengalaman pengembang dengan mengurangi upacara yang terkait dengan penulisan kode Java, sambil mempertahankan komitmen Java terhadap keamanan tipe statis, dengan memungkinkan pengembang untuk menghilangkan deklarasi manifes tipe variabel lokal yang seringkali tidak perlu.
var
Pelingkupan di JawaPerlu dicatat bahwa var
ini bukan kata kunci di Jawa, melainkan nama jenis yang dilindungi undang-undang. Seperti dikutip dari JEP 286:
Identifier var bukan kata kunci; alih-alih itu adalah nama jenis yang dipesan. Ini berarti bahwa kode yang menggunakan var sebagai variabel, metode, atau nama paket tidak akan terpengaruh; kode yang menggunakan var sebagai nama kelas atau antarmuka akan terpengaruh (tetapi nama-nama ini jarang dalam praktik, karena mereka melanggar konvensi penamaan biasa).
Perhatikan bahwa karena var
nama jenis yang dicadangkan dan bukan kata kunci, itu masih dapat digunakan untuk nama paket, nama metode, dan nama variabel (bersama dengan peran campur-jenisnya yang baru). Sebagai contoh, berikut ini adalah semua contoh penggunaan yang valid var
di Jawa:
var i = 0;
var var = 1;
for (var i = 0; i < 10; i++) { /* ... */ }
public int var() { return 0; }
package var;
Seperti dikutip dari JEP 286:
Perawatan ini akan dibatasi untuk variabel lokal dengan inisialisasi, indeks dalam for-loop yang disempurnakan, dan penduduk lokal dinyatakan dalam for-loop tradisional; itu tidak akan tersedia untuk formals metode, formor konstruktor, metode tipe pengembalian, bidang, formals tangkap, atau jenis lain dari deklarasi variabel.
var
di Jawa & CIni adalah satu perbedaan penting antara var
dalam C # dan Java termasuk yang berikut: var
dapat digunakan sebagai nama jenis di C # tetapi tidak dapat digunakan sebagai nama kelas atau nama antarmuka di Jawa. Menurut dokumentasi C # (Variabel Lokal yang Diketik Secara Implisit) :
Jika suatu jenis nama
var
berada dalam lingkup, makavar
kata kunci tersebut akan menyelesaikan ke nama jenis itu dan tidak akan diperlakukan sebagai bagian dari deklarasi variabel lokal yang diketik secara implisit.
Kemampuan untuk digunakan var
sebagai nama tipe di C # menciptakan beberapa kompleksitas dan memperkenalkan beberapa aturan resolusi yang rumit, yang dihindari oleh var
di Jawa dengan melarang var
sebagai nama kelas atau antarmuka. Untuk informasi tentang kompleksitas var
nama jenis di C #, lihat Pembatasan berlaku untuk deklarasi variabel yang diketik secara implisit . Untuk informasi lebih lanjut tentang alasan di balik keputusan pelingkupan untuk `var di Jawa, lihat JEP 286: Pilihan Pelingkupan .
var
untuk bidang atau jenis kembali? Mengapa penting untuk diperhatikan?
var
di Java tidak dapat digunakan untuk bidang atau mengembalikan tipe. Ini penting karena pembatasan ini membuat var
konteks peka, di mana ia hanya dapat digunakan dalam beberapa konteks (variabel lokal) dan bukan yang lain. Ini belum tentu perbedaan antara Java dan C # yang harus dicatat, tetapi pembatasan penting secara umum saat menggunakan var
di Jawa.
var
nama kelas dan menggunakannya seperti itu. Secara teknis ini adalah "kata kunci konteks" dalam kasus c #, tetapi di Jawa tampaknya Anda tidak dapat melakukan hal yang sama. Koreksi saya jika saya salah.
var
sebagai nama kelas atau nama antarmuka di Java (yang tidak umum), tetapi Anda dapat menggunakannya untuk nama variabel, nama metode, dan nama paket. Sebagai contoh, var var = 1;
adalah pernyataan Java valid tetapi berusaha untuk menyatakan kelas sebagai public class var {}
hasil dalam kesalahan: as of release 10, 'var' is a restricted local variable type and cannot be used for type declarations
. Saya telah memperbarui jawaban di atas untuk lebih detail tentang alasan var
di balik Jawa dan perbedaannya dengan var
C #.
Ini akan didukung di JDK 10. Bahkan mungkin untuk melihatnya beraksi di build akses awal .
The JEP 286 :
Tingkatkan Bahasa Jawa untuk memperluas inferensi jenis ke deklarasi variabel lokal dengan inisialisasi.
Jadi sekarang alih-alih menulis:
List<> list = new ArrayList<String>();
Stream<> stream = myStream();
Anda menulis:
var list = new ArrayList<String>();
var stream = myStream();
Catatan:
var
sekarang menjadi nama jenis yang dipesanJika Anda ingin mencobanya tanpa menginstal Java di sistem lokal Anda, saya membuat gambar Docker dengan JDK 10 diinstal di dalamnya:
$ docker run -it marounbassam/ubuntu-java10 bash
root@299d86f1c39a:/# jdk-10/bin/jshell
Mar 30, 2018 9:07:07 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
| Welcome to JShell -- Version 10
| For an introduction type: /help intro
jshell> var list = new ArrayList<String>();
list ==> []
var
) tidak setara. Dalam var
contohnya list
adalah tipe ArrayList
, bukan a List
.
Solusi sederhana (dengan asumsi Anda menggunakan IDE yang layak) adalah cukup mengetik 'int' di mana saja dan kemudian membuatnya untuk mengatur jenisnya untuk Anda.
Saya sebenarnya baru saja menambahkan kelas yang disebut 'var' jadi saya tidak perlu mengetik sesuatu yang berbeda.
Kode masih terlalu bertele-tele, tetapi setidaknya Anda tidak harus mengetiknya!
int
) - apakah saya melewatkan sesuatu? (*: sementara saya tidak akan pernah menyebut Eclipse IDE yang layak, saya tidak bisa menilai untuk orang lain ...)
Java 10 memang mendapatkan inferensi tipe variabel lokal, jadi sekarang ia memiliki var
yang cukup banyak setara dengan C # satu (sejauh yang saya tahu).
Hal ini juga dapat menyimpulkan jenis non-denotable (jenis yang tidak bisa diberi nama di tempat itu oleh programmer; meskipun yang jenis non-denotable berbeda). Lihat misalnya Trik dengan var
dan kelas anonim (yang tidak boleh Anda gunakan di tempat kerja) .
Satu perbedaan yang saya dapat temukan adalah bahwa di C #,
Di Jawa 10 var
bukan nama jenis hukum.
Sebagai Jawa 10, setara adalah ... var
.
Saya tahu ini lebih tua tetapi mengapa tidak membuat kelas var dan membuat konstruktor dengan tipe yang berbeda dan tergantung pada konstruktor yang dipanggil, Anda dapat var dengan tipe yang berbeda. Anda bahkan dapat membangun metode untuk mengonversi satu jenis ke jenis lainnya.
Lombok
mendukung var tetapi masih diklasifikasikan sebagai percobaan:
import lombok.experimental.var;
var number = 1; // Inferred type: int
number = 2; // Legal reassign since var is not final
number = "Hi"; // Compilation error since a string cannot be assigned to an int variable
System.out.println(number);
Inilah jebakan yang harus dihindari ketika mencoba menggunakannya IntelliJ IDEA
. Tampaknya berfungsi seperti yang diharapkan meskipun termasuk penyelesaian otomatis dan segalanya. Sampai ada solusi "non-hacky" (misalnya karena JEP 286: Inferensi Tipe Variabel Lokal ), ini mungkin taruhan terbaik Anda saat ini.
Catatan yang val
didukung Lombok
juga tanpa mengubah atau membuat lombok.config
.
Anda bisa, dalam Java 10, tetapi hanya untuk variabel lokal , yang berarti,
Kamu bisa,
var anum = 10; var aString = "Var";
Tapi tidak bisa,
var anull = null; // Since the type can't be inferred in this case
Lihat spesifikasi untuk info lebih lanjut.
var
dapat digunakan untuk berbagai bentuk tipe yang tidak dapat didenotasikan, termasuk tipe penangkapan, tipe persimpangan, dan tipe kelas anonim. Dan, pada Java 11, ini juga dapat diterapkan pada parameter lambda.
Secara umum Anda dapat menggunakan kelas Object untuk semua tipe, tetapi Anda harus melakukan casting tipe nanti!
misalnya:-
Object object = 12;
Object object1 = "Aditya";
Object object2 = 12.12;
System.out.println(Integer.parseInt(object.toString()) + 2);
System.out.println(object1.toString() + " Kumar");
System.out.println(Double.parseDouble(object2.toString()) + 2.12);
var
kata sekarang secara resmi dalam bahasa, jawaban Anda juga mengacu pada cara yang sudah kuno.
Fitur ini sekarang tersedia di Java SE 10. Var statis, jenis-aman akhirnya berhasil masuk ke dunia java :)
sumber: https://www.oracle.com/corporate/pressrelease/Java-10-032018.html
val
(atauvar
) jika Anda menggunakan bahasa "penggantian Java" tertentu ;-)