Aneh "[]" setelah tanda tangan metode Java

119

Saya melihat beberapa kode Java hari ini, dan saya menemukan beberapa sintaks yang aneh:

public class Sample {
  public int get()[] {
    return new int[]{1, 2, 3};
  }
}

Saya pikir itu tidak dapat mengkompilasi dan ingin memperbaiki apa yang saya pikir salah ketik, tetapi kemudian saya ingat kompiler Java benar-benar menerimanya!

Bisakah seseorang membantu saya memahami apa artinya? Apakah ini serangkaian fungsi?

Johannes Schaub - litb
sumber
10
woah, itu .. aneh ...; D
Nanne
2
Yang paling gila ... hal yang pernah saya lihat. Mereka bilang ruby ​​memiliki banyak keajaiban, makanlah ruby ​​itu!
IAdapter
16
Bahkan tidak terlihat sedikit aneh dibandingkan dengan tanda tangan dari suatu fungsi yang mengembalikan pointer ke berbagai pointer ke fungsi di C. :)
Kos

Jawaban:

111

Ini adalah metode yang mengembalikan file int[].

Spesifikasi Bahasa Java (8.4 Deklarasi Metode)

Untuk kompatibilitas dengan versi platform Java yang lebih lama, formulir deklarasi untuk metode yang mengembalikan array diizinkan untuk menempatkan (beberapa atau semua) pasangan braket kosong yang membentuk deklarasi tipe array setelah daftar parameter.

Ini didukung oleh produksi usang:

MethodDeclarator :
    MethodDeclarator []

tetapi tidak boleh digunakan dalam kode baru.

Mehrdad Afshari
sumber
92
Bagian terbaik dari ini adalah sebagian atau seluruhnya . Jadi, jika Anda memiliki metode yang mengembalikan larik int 3 dimensi, Anda dapat melakukannya: public int[] foo()[][] {dan membuat mata orang berdarah.
Cowan
Saya harus mengatakan bahwa saya tertawa terbahak-bahak karena saya melihat kode itu! :-D
sdlins
20

Itu pertanyaan yang lucu. Di java Anda bisa mengatakan int[] a;, juga int a[];.
Dari perspektif ini, untuk mendapatkan hasil yang sama hanya perlu memindahkan []
dan menulis public int[] get() {.
Sepertinya kode tersebut berasal dari obfuscator ...

Costis Aivalis
sumber
2
Dari obfuscator? Kemungkinan besar dari programmer C (Anda tidak dapat mengembalikan array, tetapi pointer ke tipe array - ya .. dan itu akan terlihat serupa).
Kos
4
@Kos: Mengapa Anda menyiratkan bahwa obfuscator dan programmer C haruslah dua hal yang berbeda? Seringkali tidak!
Lii
10

Karena ada tag C, saya akan menunjukkan bahwa notasi serupa (tapi tidak identik) dimungkinkan di C dan C ++:

Di sini fungsi fmengembalikan pointer ke array 10 int.

int tab[10];

int (*f())[10]
{
    return &tab;
}

Java tidak membutuhkan tanda bintang dan tanda kurung.

Pemrogram
sumber
apakah ada sintaks yang lebih mudah untuk sebuah fungsi yang mengembalikan pointer ke array berdimensi n? (Bukan hanya int *)
ted
Sebenarnya saya harus menambahkan, pcc mendukung secara langsung f()[]artinya seperti (*f()).
AnArrayOfFunctions
4

sintaks java memungkinkan hal berikut:

int[] intArr = new int[0];

dan juga

int intArr[] = new int[0];

yang terlihat lebih fmiliar berasal dari sintaks gaya c.

begitu juga, dengan sebuah fungsi, namanya bisa muncul sebelum atau sesudah [], dan tipenya tetap int []

davin
sumber
1
Ini benar-benar mengganggu saya karena seharusnya int [] karena faktanya itu adalah sebuah array adalah bagian dari tipe, bukan bagian dari namanya. Pascasarjana yang menulis kursus java uni saya melakukan hal yang sebaliknya sepanjang waktu dalam kodenya, itu mengerikan!
danpalmer
1
@danpalmer, saya setuju, meskipun menempatkan diri Anda pada posisi programmer ac yang sebenarnya memiliki darah untuk menulis nama int []. Lagi pula, ini bukan masalah besar, bahasa ini mendukung keduanya dan sebagian besar programmer java menggunakan konvensi int [], jadi selain satu atau dua pascasarjana yang mengganggu, ini jarang terjadi. siapa tahu, itu bahkan mungkin menguntungkan Anda jika mereka mengajukan pertanyaan seperti ini di final Anda
davin