জাভাতে অপারেটর ওভারলোডিং


180

জাভাতে অপারেটরগুলি ওভারলোড করা সম্ভব কিনা দয়া করে আপনি আমাকে বলতে পারেন? এটি জাভা এর যে কোনও জায়গায় ব্যবহার করা থাকলে আপনি দয়া করে আমাকে এটি সম্পর্কে বলতে পারেন।


উত্তর:


234

না, জাভা ব্যবহারকারী-সংজ্ঞায়িত অপারেটর ওভারলোডিং সমর্থন করে না। জাভাটির একমাত্র দিক যা "কাস্টম" অপারেটর ওভারলোডিংয়ের কাছাকাছি আসে স্ট্রিংগুলির জন্য + এর হ্যান্ডলিং, যার ফলে স্ট্রিংবিল্ডার / স্ট্রিংবফার ব্যবহার করে ধ্রুবকগুলিকে সংকলন-সময় কনকনেটেশন বা এক্সিকিউশন-সময় কনকনেটেশন প্রদান করা হয়। আপনি নিজের অপারেটরগুলি সংজ্ঞায়িত করতে পারবেন না যারা একইভাবে কাজ করে।

জাভা-জাতীয় (এবং জেভিএম ভিত্তিক) ভাষার জন্য যা অপারেটর ওভারলোডিং সমর্থন করে , আপনি কোটলিন বা গ্রোভির দিকে নজর দিতে পারেন । বিকল্পভাবে, আপনি একটি জাভা সংকলক প্লাগইন সমাধানের সাথে ভাগ্য পেতে পারেন ।


4
আপনি বলছেন আমরা জাভাতে মোড়ক তৈরি করতে পারি না? যেমন পূর্ণসংখ্যার মতো স্মলইন্টিজার?
huseyin tugrul buyukisik

3
@ tuğrulbüyükışık: বিদ্যমান সমস্ত আদিম ধরণের জন্য ইতিমধ্যে মোড়ক রয়েছে - তবে আপনি যদি নিজের নিজস্ব নতুন র‌্যাপার তৈরি করতে চান তবে আপনি এটিকে অন্যগুলির মতো আচরণ করতে সক্ষম হবেন না, কারণ তাদের ভাষায় নির্দিষ্ট সমর্থন রয়েছে।
জন স্কিটি

1
ধন্যবাদ, আমি এটি সম্পর্কে googled এবং খুঁজে না। আমি জানতে চেয়েছিলাম যে আমি দুটি আদিম (একটি ডাবল এবং একটি
আন্ত

40
@ জাজাকিল: অপারেটর ওভারলোডিং খারাপভাবে ব্যবহার করার সময় কোডটি কম পাঠযোগ্য হয় । যখন ভাল ব্যবহার করা হয়, এটি পঠনযোগ্যতা আইএমওকে ব্যাপকভাবে বাড়িয়ে তুলতে পারে। কোড যা ব্যবহার তাকান BigIntegerজাভা, তারপর ব্যবহার অনুরূপ কোড তাকান BigIntegerC # অপারেটার ব্যবহার করে। প্রতিনিধিরা কীভাবে ওওপি নীতিগুলি ভেঙে দেয় তা আমি দেখতে পাচ্ছি না - আপনার আপত্তিগুলির তুলনায় আপনাকে আরও বেশি সুনির্দিষ্ট হওয়া দরকার। জাভা ডিজাইনাররা কেন বিভিন্ন বৈশিষ্ট্য অন্তর্ভুক্ত করেননি তার বিবরণ আমি জানি না, তবে আমার সন্দেহ হয় যে সংস্থানটির চাপের মিশ্রণ রয়েছে এবং ভাষাটি ছোট এবং তুলনামূলকভাবে সহজ রাখার আকাঙ্ক্ষা রয়েছে।
জন স্কিটি

4
আমি জানি এটি দেরি হয়ে গেছে, তবে একটি উদাহরণ হাজার টি যুক্তিযুক্ত। প্রদত্ত m0হিসেবে Matrixএবং v0, v1, v2, v3, এবং v4যেমন VectorS, কেবল তুলনা কতদিন এটা আপনি লাগে সঠিকভাবে নিম্নলিখিত গাণিতিক অভিব্যক্তি ব্যাখ্যা m0.transpose().mult(v0.add(v1.mult(v2)).cross(v3)).sub(v4);। অপারেটর ওভারলোডিংয়ের জন্য সমর্থনটি অন্তর্ভুক্ত করা থাকলে এটি লেখা যেতে পারে m0.transpose() * (v0 + v1 * v2).cross(v3) - v4;
কোড_ড্রেড

38

অপারেটর ওভারলোডিং স্ট্রিং টাইপের সংমিশ্রনের জন্য জাভাতে ব্যবহৃত হয়:

String concat = "one" + "two";

তবে, আপনি নিজের অপারেটর ওভারলোডগুলি সংজ্ঞায়িত করতে পারবেন না


26

সমস্ত লোক যে ইশারা ছাড়াও +স্ট্রিং জন্য ওভারলোড হয়ে গেছে, -এছাড়াও উভয় ফ্লোটিং পয়েন্ট জন্য এবং অপারেশন পূর্ণসংখ্যা ওভারলোড হয়ে গেছে, হয় *এবং/

[সম্পাদনা] %ভাসমান পয়েন্টের জন্যও ওভারলোড করা হয়, যা সি বা সি ++ ব্যাকগ্রাউন্ডযুক্ত ব্যক্তিদের জন্য কিছুটা অবাক করে দিতে পারে।


20

জাভা অপারেটরকে ওভারলোডিংয়ের অনুমতি দেয় না। পছন্দের পদ্ধতির ক্রিয়াটি সম্পাদন করার জন্য আপনার ক্লাসে একটি পদ্ধতি নির্ধারণ করা: a.add(b)পরিবর্তে a + b। আপনি এখানে জাভা সি থেকে সিলেকৃত অন্যান্য বিটের সংক্ষিপ্তসার দেখতে পাবেন: বৈশিষ্ট্যগুলি সি এবং সি ++ থেকে সরানো হয়েছে


2
গুরুত্বপূর্ণ বিষয় হ'ল জাভা উত্স ফাইলগুলির প্রসঙ্গটি স্বাধীন করার নকশা লক্ষ্য। খুব বড় (এমএলকি) পড়ার চেষ্টা করছেন, ম্যাক্রো ভারী সি প্রোগ্রামগুলির একটি দীর্ঘ দীর্ঘ শেখার বক্ররেখা রয়েছে। তুলনীয় (বা বৃহত্তর) জাভা প্রোগ্রামটি একটি ছোট জাভা প্রোগ্রামের চেয়ে ডুব দেওয়া খুব কঠিন নয়। গোসলিং যেমন বলেছিলেন: নীল কলার প্রোগ্রামারদের কাজ করার জন্য একটি ভাষা [[এবং যে কেউ বয়লারপ্লেট ভার্বোসটি ক্ষতিকারক বলে মনে করেন তাদের বিশেষজ্ঞের জ্ঞান
চর্চা

2
ওরাকলকে ধন্যবাদ, java.sun.com লিঙ্কগুলির কোনওটিই কাজ করে না। আপনি যদি দয়া করে আপডেট লিঙ্কটি দিতে পারেন?
সৈয়দ আকিল আশিক

17

আপনি নিজে এটি করতে পারবেন না যেহেতু জাভা অপারেটর ওভারলোডিংয়ের অনুমতি দেয় না।

সঙ্গে এক ব্যতিক্রম অবশ্য। স্ট্রিং অবজেক্টের জন্য + এবং + = ওভারলোড করা হয়।


8
জাভাতে অপারেটর ওভারলোডিংয়ের আরও অনেক উদাহরণ রয়েছে। উদাহরণ হিসেবে বলা যায় &, |এবং ^জন্য জমিদার হয় booleanএবং অবিচ্ছেদ্য ধরনের। এবং প্রকৃতপক্ষে, গাণিতিক এবং রিলেশনাল অপারেটরগুলি বিভিন্ন সংখ্যার ধরণের জন্য ওভারলোড হয়। (অবশ্যই, ওভারলোডগুলির শব্দার্থকতা আরও কাছাকাছি ...)
স্টিফেন সি

16

আরও অনেকে উত্তর দিয়েছেন: জাভা ব্যবহারকারী-সংজ্ঞায়িত অপারেটর ওভারলোডিং সমর্থন করে না।

হতে পারে এটি অফ-টপিক, তবে আমি কিছু উত্তরে যা কিছু পড়েছি তার বিষয়ে মন্তব্য করতে চাই।

পাঠযোগ্যতা সম্পর্কে।
তুলনা করা:

  1. সি = এ + খ
  2. c = a.add (খ)

আবার দেখ!
কোনটি বেশি পাঠযোগ্য?

একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ যা ব্যবহারকারী-সংজ্ঞায়িত প্রকারের তৈরি করতে দেয়, তাদের অন্তর্নির্মিত প্রকারের (বা আদিম ধরণের) মতো কাজ করার অনুমতি দেওয়া উচিত।

সুতরাং জাভা জেনেরিক প্রোগ্রামিংয়ের একটি মৌলিক নীতি ভঙ্গ করে:
আমাদের ব্যবহারকারীর দ্বারা সংজ্ঞায়িত প্রকারের অবজেক্টগুলির সাথে অন্তর্নির্মিত ধরণের অবজেক্টগুলিকে আদান প্রদান করতে সক্ষম হওয়া উচিত।
(আপনি ভাবতে পারেন: "তিনি কি 'বিল্ট-ইন অবজেক্টস' বলেছিলেন?"। হ্যাঁ, এখানে দেখুন ))

স্ট্রিং সংক্ষিপ্তকরণ সম্পর্কে:

গণিতবিদরা সেটগুলিতে কম্যেটেটিভ ক্রিয়াকলাপের জন্য + চিহ্নটি ব্যবহার করেন।
সুতরাং আমরা নিশ্চিত হতে পারি যে a + b = b + a।
স্ট্রিং কনকনেটেশন (বেশিরভাগ প্রোগ্রামিং ভাষায়) এই সাধারণ গাণিতিক স্বরলিপিটিকে সম্মান করে না।

a := "hello";
b := "world";
c := (a + b = b + a);

বা জাভাতে:

String a = "hello";
String b = "world";
boolean c = (a + b).equals(b + a);

অতিরিক্ত:
লক্ষ্য করুন যে জাভাতে কীভাবে সাম্যতা এবং পরিচয় বিভ্রান্ত হয়। == (সাম্য) প্রতীকটির অর্থ:
ক। আদিম ধরণের জন্য সমতা।
খ। ব্যবহারকারী-সংজ্ঞায়িত প্রকারের জন্য পরিচয়-পরীক্ষা, অতএব, আমরা সমতা জন্য ফাংশন সমান () ব্যবহার করতে বাধ্য হই ।
তবে ... অপারেটর ওভারলোডিংয়ের সাথে এর কী আছে?
ভাষা যদি অপারেটরকে ওভারলোডিং ব্যবহারকারীর অনুমতি দেয় তবে ব্যবহারকারী সাম্যতা অপারেটরের যথাযথ অর্থ দিতে পারে।


==সি এবং সি ++ এর মতো জাভাতেও সমতার জন্য প্রতীকটি ব্যবহৃত হয়। অপারেটর ওভারলোডিংয়ের সাথে এর কোনও যোগসূত্র নেই।
হট লিকস

2
জাভাতে অপারেটর ==, কেবল আদিম ধরণের জন্য সমতার অর্থ। ব্যবহারকারীর দ্বারা সংজ্ঞায়িত প্রকারের অর্থ পরিচয়। সি ++ এ শব্দার্থক ব্যবহারকারীর দ্বারা সংজ্ঞায়িত করা হয় তবে বিল্ট-ইন শব্দার্থকতা, সাম্যতা সংরক্ষণ করা উচিত। স্ট্রিং a = "হ্যালো"; স্ট্রিং বি = "হ্যালো"; বুলিয়ান সি = (এ == খ);
ফার্নান্দো পেলেসিওনি

3
সুতরাং আপনি আপনার প্রথম মন্তব্যে যা বলেছেন তা ভুল। রাইট? দয়া করে, আমাকে সি-তে ব্যবহারকারী-সংজ্ঞায়িত প্রকারের মধ্যে কীভাবে সাম্যতা এবং পরিচয় পরীক্ষা করতে হয় তা বলুন আপনি ঠিক বলেছেন, সমতা সম্পর্কে আমার মন্তব্যটি ওটি, তবে আমি এটি স্পষ্ট করে দিয়েছি ("অতিরিক্তগুলি দেখুন")। আমি একটি প্রোগ্রামিং ভাষা তৈরি করি নি তার অর্থ এই নয় যে আমি বিদ্যমান ভাষার সমালোচনা করতে পারি না। আপনি যদি সমালোচনাটিকে ধর্মীয় যুদ্ধ হিসাবে দেখেন তবে আমি দুঃখিত।
ফার্নান্দো পেলেসিসিওনি

1
দীর্ঘ জিনিস ছোট করা: জাভা স্তন্যপান।
কোল্যা ইভানকভ

12

কেউ জাভা অপারেটর ওভারলোডিং চেষ্টা করতে পারেন । এটির নিজস্ব সীমাবদ্ধতা রয়েছে তবে আপনি যদি সত্যই অপারেটর ওভারলোডিং ব্যবহার করতে চান তবে এটি চেষ্টা করে দেখার মতো।


6

আপনার জাভা কোডের সাথে কেবল এক্সট্যান্ড ব্যবহার করুন। এটি অপারেটর ওভারলোডিং সমর্থন করে:

    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
    }

}

অফিসিয়াল ওয়েবসাইটে, প্রতিটি অপারেটরের জন্য প্রয়োগের পদ্ধতিগুলির একটি তালিকা রয়েছে!


5

অথবা, আপনি জাভা গ্রোভি তৈরি করতে পারেন এবং যা চান তা অর্জন করতে এই ফাংশনগুলিকে কেবল ওভারলোড করতে পারেন

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

কারা গ্রোভি হতে / ব্যবহার করতে চান না? : ডি

না আপনি জাভাতে সংকলিত গ্রোভি জারগুলি একইভাবে ব্যবহার করতে পারবেন না। এটি এখনও জাভার জন্য একটি সংকলক ত্রুটি।


1

সি ++ এর বিপরীতে, জাভা ব্যবহারকারী সংজ্ঞায়িত অপারেটর ওভারলোডিং সমর্থন করে না। জাভাতে ওভারলোডিং অভ্যন্তরীণভাবে করা হয়।

+উদাহরণস্বরূপ আমরা (প্লাস) নিতে পারি :

int a = 2 + 4;
string = "hello" + "world";

এখানে, দুটি আরও পূর্ণসংখ্যার সংখ্যা যুক্ত করে এবং দুটি স্ট্রিং সংযুক্ত করে। সুতরাং আমরা বলতে পারি যে জাভা অভ্যন্তরীণ অপারেটর ওভারলোডিং সমর্থন করে তবে ব্যবহারকারী সংজ্ঞায়িত নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.