Kelebihan operator di Jawa

Jawaban:

235

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 .

Jon Skeet
sumber
4
Anda mengatakan bahwa kita tidak dapat membuat wrapper di java? Seperti SmallInteger seperti Integer?
huseyin tugrul buyukisik
3
@ tuğrulbüyükışık: Sudah ada pembungkus untuk semua jenis primitif yang ada - tetapi jika Anda ingin membuat jenis pembungkus baru Anda sendiri, Anda tidak akan dapat membuatnya berperilaku seperti yang lain, karena mereka memiliki dukungan khusus dalam bahasa tersebut.
Jon Skeet
1
terima kasih, saya googled tentang hal itu dan tidak dapat menemukan. Saya ingin tahu apakah saya bisa membuat variabel kompleks yang terdiri dari dua primitif (ganda dan int ---> presisi baik + rentang yang baik)
huseyin tugrul buyukisik
40
@djaqeel: Operator overloading membuat kode kurang terbaca saat digunakan dengan buruk . Ketika digunakan dengan baik, itu dapat sangat meningkatkan keterbacaan IMO. Lihatlah kode yang digunakan BigIntegerdi Java, lalu lihat kode yang sama menggunakan BigIntegerdi 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.
Jon Skeet
4
Saya tahu ini terlambat, tetapi sebuah contoh bernilai ribuan argumen. Mengingat m0sebagai Matrixdan v0, v1, v2, v3, dan v4sebagai Vectors, 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;.
code_dredd
38

Overloading operator digunakan di Jawa untuk rangkaian tipe String:

String concat = "one" + "two";

Namun, Anda tidak dapat menentukan kelebihan operator Anda sendiri.

teh celup
sumber
26

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 ++.

MSalters
sumber
21

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 ++

rampok
sumber
2
Yang penting adalah tujuan desain membuat konteks file sumber Java independen. Mencoba membaca sangat besar (MLOC), program makro berat C memiliki kurva belajar yang sangat panjang. Program Java yang sebanding (atau lebih besar) tidak lebih sulit untuk dicoba daripada program Java kecil. Seperti kata Gosling: Sebuah bahasa yang bisa digunakan oleh programmer kerah biru. [Dan siapa pun yang menganggap
verplositas pelat baja
2
Berkat oracle, tidak ada tautan java.sun.com yang berfungsi. Bisakah Anda memberikan tautan yang diperbarui, jika memungkinkan?
Syed Aqeel Ashiq
17

Anda tidak dapat melakukan ini sendiri karena Java tidak mengizinkan overloading operator.

Namun, dengan satu pengecualian. + dan + = kelebihan beban untuk objek String.

Brian Agnew
sumber
8
Ada banyak contoh lain dari kelebihan operator di Jawa. Misalnya &,, |dan ^kelebihan beban untuk booleandan tipe integral. Dan memang, operator aritmatika dan relasional kelebihan beban untuk berbagai jenis numerik. (Tentu saja, semantik yang berlebihan lebih dekat ...)
Stephen C
16

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:

  1. c = a + b
  2. c = a.add (b)

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.

Fernando Pelliccioni
sumber
Simbol ==ini digunakan untuk kesetaraan di Jawa, seperti di C dan C ++. Ini tidak ada hubungannya dengan overloading operator.
Hot Licks
2
Operator ==, di Jawa hanya berarti Kesetaraan untuk tipe primitif. Untuk tipe yang ditentukan pengguna berarti Identitas. Dalam C ++ semantik didefinisikan oleh pengguna, tetapi harus mempertahankan semantik bawaan, persamaan. String a = "hello"; String b = "hello"; boolean c = (a == b);
Fernando Pelliccioni
3
Jadi apa yang Anda katakan dalam komentar pertama Anda salah. Baik? Tolong, beri tahu saya cara menguji kesetaraan dan identitas pada jenis yang ditentukan pengguna dalam C. Anda benar, komentar saya tentang kesetaraan adalah PL, tetapi saya mengklarifikasi itu (lihat "figuran"). Fakta bahwa saya belum membuat bahasa pemrograman tidak berarti saya tidak bisa mengkritik yang sudah ada. Saya minta maaf jika Anda melihat kritik sebagai perang agama.
Fernando Pelliccioni
1
Singkatnya: java sucks.
Kolya Ivankov
12

Satu dapat mencoba Java Operator Overloading . Ini memiliki keterbatasannya sendiri, tetapi patut dicoba jika Anda benar-benar ingin menggunakan operator yang berlebihan.

Alexander Mironov
sumber
6

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!

Aurelien B
sumber
5

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.

tahu bagaimana
sumber
1

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.

nayanjyoti sharma
sumber