Jawaban:
Tidak, Java tidak mendukung overloading operator yang ditentukan pengguna. Satu-satunya aspek Java yang mendekati "overloading" custom "operator adalah penanganan + untuk string, yang menghasilkan hasil kompilasi konstanta waktu kompilasi atau penggabungan waktu eksekusi menggunakan StringBuilder / StringBuffer. Anda tidak dapat menentukan operator Anda sendiri yang bertindak dengan cara yang sama.
Untuk bahasa Jawa-seperti (dan JVM-based) yang tidak operator overloading dukungan, Anda bisa melihat Kotlin atau Groovy . Atau, Anda mungkin menemukan keberuntungan dengan solusi plugin kompiler Java .
BigInteger
di Java, lalu lihat kode yang sama menggunakan BigInteger
di C # menggunakan operator. Saya tidak melihat bagaimana para delegasi melanggar prinsip-prinsip OOP - Anda harus lebih tepat dari itu dalam keberatan Anda. Saya tidak tahu detail mengapa desainer Java tidak memasukkan berbagai fitur, tapi saya curiga ada campuran tekanan sumber daya dan keinginan untuk menjaga bahasa tetap kecil dan relatif sederhana.
m0
sebagai Matrix
dan v0
, v1
, v2
, v3
, dan v4
sebagai Vector
s, hanya membandingkan berapa lama waktu Anda untuk benar menafsirkan ekspresi matematika berikut m0.transpose().mult(v0.add(v1.mult(v2)).cross(v3)).sub(v4);
. Seandainya dukungan untuk operator kelebihan beban sudah dimasukkan, itu bisa saja ditulis sebagai m0.transpose() * (v0 + v1 * v2).cross(v3) - v4;
.
Selain semua orang yang menunjukkan bahwa +
kelebihan beban untuk String, -
juga kelebihan beban untuk operasi floating point dan integer, seperti halnya *
dan /
.
[Sunting]
%
juga kelebihan beban untuk floating point, yang bisa sedikit mengejutkan bagi mereka dengan latar belakang C atau C ++.
Java tidak memungkinkan kelebihan operator. Pendekatan yang disukai adalah mendefinisikan metode di kelas Anda untuk melakukan tindakan: a.add(b)
alih-alih a + b
. Anda dapat melihat ringkasan dari bit lain yang ditinggalkan Java dari bahasa seperti C di sini: Fitur Dihapus dari C dan C ++
Anda tidak dapat melakukan ini sendiri karena Java tidak mengizinkan overloading operator.
Namun, dengan satu pengecualian. + dan + = kelebihan beban untuk objek String.
&
,, |
dan ^
kelebihan beban untuk boolean
dan tipe integral. Dan memang, operator aritmatika dan relasional kelebihan beban untuk berbagai jenis numerik. (Tentu saja, semantik yang berlebihan lebih dekat ...)
Seperti yang telah dijawab oleh banyak orang lain: Java tidak mendukung overloading operator yang ditentukan pengguna.
Mungkin ini di luar topik, tetapi saya ingin mengomentari beberapa hal yang saya baca dalam beberapa jawaban.
Tentang keterbacaan.
Membandingkan:
Lihat lagi!
Mana yang lebih mudah dibaca?
Bahasa pemrograman yang memungkinkan pembuatan tipe yang ditentukan pengguna, harus memungkinkan mereka untuk bertindak dengan cara yang sama seperti tipe bawaan (atau tipe primitif).
Jadi Java mematahkan prinsip dasar Generic Programming:
Kita harus bisa menukar objek tipe bawaan dengan objek tipe yang ditentukan pengguna.
(Anda mungkin bertanya-tanya: "Apakah dia mengatakan 'objek bawaan'?". Ya, lihat di sini .)
Tentang rangkaian string:
Matematikawan menggunakan simbol + untuk operasi komutatif pada set.
Jadi kita dapat yakin bahwa a + b = b + a.
Rangkaian string (dalam kebanyakan bahasa pemrograman) tidak menghormati notasi matematika yang umum ini.
a := "hello"; b := "world"; c := (a + b = b + a);
atau di Jawa:
String a = "hello"; String b = "world"; boolean c = (a + b).equals(b + a);
Ekstra:
Perhatikan bagaimana di Jawa kesetaraan dan identitas bingung. Simbol == (persamaan) berarti:
a. Kesetaraan untuk tipe primitif.
b. Pemeriksaan identitas untuk tipe yang ditentukan pengguna, oleh karena itu, kami dipaksa untuk menggunakan fungsi equals () untuk kesetaraan.
Tapi ... Apa hubungannya ini dengan overloading operator?
Jika bahasa memungkinkan operator overloading pengguna dapat memberikan makna yang tepat kepada operator kesetaraan.
==
ini digunakan untuk kesetaraan di Jawa, seperti di C dan C ++. Ini tidak ada hubungannya dengan overloading operator.
Satu dapat mencoba Java Operator Overloading . Ini memiliki keterbatasannya sendiri, tetapi patut dicoba jika Anda benar-benar ingin menggunakan operator yang berlebihan.
Cukup gunakan Xtend bersama dengan kode Java Anda. Ini mendukung Kelebihan Operator:
package com.example;
@SuppressWarnings("all")
public class Test {
protected int wrapped;
public Test(final int value) {
this.wrapped = value;
}
public int operator_plus(final Test e2) {
return (this.wrapped + e2.wrapped);
}
}
package com.example
class Test2 {
new() {
val t1 = new Test(3)
val t2 = new Test(5)
val t3 = t1 + t2
}
}
Di situs web resmi, ada daftar metode yang harus diterapkan untuk setiap operator!
Atau, Anda dapat membuat Java Groovy dan hanya membebani fungsi-fungsi ini untuk mencapai apa yang Anda inginkan
//plus() => for the + operator
//multiply() => for the * operator
//leftShift() = for the << operator
// ... and so on ...
class Fish {
def leftShift(Fish fish) {
print "You just << (left shifted) some fish "
}
}
def fish = new Fish()
def fish2 = new Fish()
fish << fish2
Siapa yang tidak ingin menjadi / menggunakan asyik? : D
Tidak, Anda tidak dapat menggunakan JAR groovy yang dikompilasi di Jawa dengan cara yang sama. Ini masih merupakan kesalahan kompiler untuk Java.
Tidak seperti C ++, Java tidak mendukung overloading operator yang ditentukan pengguna. Overloading dilakukan secara internal di java.
Kita dapat mengambil +
(plus) misalnya:
int a = 2 + 4;
string = "hello" + "world";
Di sini, ditambah menambahkan dua angka integer dan menggabungkan dua string. Jadi kita dapat mengatakan bahwa Java mendukung overloading operator internal tetapi tidak ditentukan pengguna.