আমি জাভাতে রেফারেন্স দিয়ে প্যারামিটারগুলি পাস করতে পারি?


উত্তর:


225

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

Object o = "Hello";
mutate(o)
System.out.println(o);

private void mutate(Object o) { o = "Goodbye"; } //NOT THE SAME o!

Helloকনসোলে মুদ্রণ করবে । অপশন যদি আপনি মুদ্রণ করতে উপরের কোড চেয়েছিলেন Goodbyeহয় একটি সুনির্দিষ্ট রেফারেন্স ব্যবহার নিম্নরূপ:

AtomicReference<Object> ref = new AtomicReference<Object>("Hello");
mutate(ref);
System.out.println(ref.get()); //Goodbye!

private void mutate(AtomicReference<Object> ref) { ref.set("Goodbye"); }

48
এছাড়াও, যদি আপনি সত্যিই মানুষকে বিভ্রান্ত করতে চান তবে রেফারেন্স তৈরি করতে 1 দৈর্ঘ্যের একটি অ্যারে ব্যবহার করা যেতে পারে :)
ক্রিস্টোফার

2
অ্যাটমিক রেফারেন্স এবং সম্পর্কিত ক্লাস (অ্যাটমিকআইন্টিজার) এই জাতীয় ক্রিয়াকলাপের জন্য সেরা
নবীন

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

আমি মনে করি না যে এটি বিভ্রান্তিকর, তবে এটি স্বাভাবিক আচরণ। স্তরের উপরে মূল্য প্রকারের উপস্থিতি রয়েছে এবং রেফারেন্সের ধরণগুলি স্তূপে বিদ্যমান, তবে রেফারেন্সের ধরণের জন্য রেফারেন্স স্ট্যাকের উপরও বিদ্যমান। সুতরাং আপনি সর্বদা স্ট্যাকের সাথে মানটি পরিচালনা করেন। আমি বিশ্বাস করি যে এখানে প্রশ্নটি ছিল: স্ট্যাক থেকে রেফারেন্স দেওয়া কি সম্ভব যে স্ট্যাকের সাথে থাকা অন্য কোনও মানকেও নির্দেশ করে? বা অন্যান্য রেফারেন্সের রেফারেন্সটি পাস করুন যা স্তূপে বেঁচে থাকা কোনও মানকে নির্দেশ করে?
ইওমরফ

এই আমি মহান তথ্য। আমি অ্যারে ব্যবহার করে আসছি তবে এটি মনে হয় কাজের জন্য তৈরি কিছু something তবে আমি এই ভার্সেস অ্যারেগুলির পারফরম্যান্স সম্পর্কে জানি না, যদি কোনও পারফরম্যান্স সমালোচিত লুপে
স্টিভ

65

আমি জাভাতে রেফারেন্স দিয়ে প্যারামিটারগুলি পাস করতে পারি?

না।

কেন? জাভাতে পদ্ধতির কাছে আর্গুমেন্টগুলি দেওয়ার একটিমাত্র পদ্ধতি রয়েছে: মান অনুসারে।

বিঃদ্রঃ:

আদিমদের জন্য এটি বোঝা সহজ: আপনি মানটির একটি অনুলিপি পান।

অন্য সকলের জন্য আপনি রেফারেন্সের একটি অনুলিপি পান এবং এটিকে মান দ্বারা পাসিংও বলা হয়।

সব কিছুই এই ছবিতে:

এখানে চিত্র বর্ণনা লিখুন


25

জাভাতে রেফের মতো ভাষা স্তরে কিছুই নেই । জাভাতে কেবল মূল্য মানের দ্বারা পাস হয়

কৌতূহলের খাতিরে আপনি জাভাতে একটি রেফ-এর মতো শব্দার্থক প্রয়োগ করতে পারেন আপনার জিনিসগুলিকে কেবল একটি পরিবর্তনীয় শ্রেণিতে আবৃত:

public class Ref<T> {

    private T value;

    public Ref(T value) {
        this.value = value;
    }

    public T get() {
        return value;
    }

    public void set(T anotherValue) {
        value = anotherValue;
    }

    @Override
    public String toString() {
        return value.toString();
    }

    @Override
    public boolean equals(Object obj) {
        return value.equals(obj);
    }

    @Override
    public int hashCode() {
        return value.hashCode();
    }
}

পরীক্ষা ক্ষেত্রে:

public void changeRef(Ref<String> ref) {
    ref.set("bbb");
}

// ...
Ref<String> ref = new Ref<String>("aaa");
changeRef(ref);
System.out.println(ref); // prints "bbb"

পরিবর্তে java.lang.ref.References ব্যবহার করবেন না কেন?
হার্ডকোড

java.lang.ref.References একটি সেট পদ্ধতি নেই, এটি পরিবর্তনীয় নয়
dfa

AtomicReference(অ-আদিমদের জন্য) কেন ব্যবহার করবেন না? বা AtomicSomething(যেমন AtomicBoolean:) আদিমদের জন্য?
আরভিন

দুর্ভাগ্যক্রমে, <T> আদিম ধরণের গ্রহণ করে না। এটি করতে চাই: রেফ <int>
jk7

1
@ jk7 এর intপরিবর্তে Integer, এর boolপরিবর্তে Booleanএবং আরও অনেক কিছু ব্যবহার করা কি সত্যই যথেষ্ট গুরুত্বপূর্ণ ? অর্থাত, মোড়কের ক্লাসগুলি (যা সিনট্যাক্স নিয়ে উদ্বেগ প্রকাশ করলে স্বয়ংক্রিয়ভাবে আবদ্ধ হয়) কাজ করে না?
পল স্টেলিয়ান

18

"জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজে" জেমস গোসলিং থেকে:

"... জাভাতে ঠিক একটি প্যারামিটার পাস করার মোড রয়েছে - মান অনুসারে পাস করুন - এবং এটি বিষয়গুলি সহজ রাখে .."


2
ভাষা godশ্বরের উচ্চারণের উত্তরটি ঘোষণা করা উচিত।
ingyhere

3
@ ইঙ্গিতে:: The pronouncement of the language god should be declared the answerসত্যই নয়। জাভা স্রষ্টা যা মনে করেন বা বিশ্বাস করেন তা সত্ত্বেও এর সম্পূর্ণ উত্তরটি ভাষার স্পেসিফিকেশনের একটি উদ্ধৃতি থেকে আসবে।
প্যার্সেবল

1
প্রকৃতপক্ষে এটি জেএলএসে রয়েছে, বিভাগ 8.4.1 এ এবং জেএলএস গোসলিংকে প্রথম লেখক হিসাবে উদ্ধৃত করেছেন: "যখন পদ্ধতি বা নির্মাতা প্রার্থনা করা হয় (§15.12), তখন প্রকৃত যুক্তি প্রকাশের মানগুলি নতুন নির্মিত প্যারামিটার ভেরিয়েবলগুলি শুরু করে , প্রতিটি পদ্ধতি বা কনস্ট্রাক্টরের শরীরে কার্যকর হওয়ার আগে ঘোষিত প্রকারের ""
ingyhere

যথাযথভাবে। নিম্ন প্রতিনিধিদের কাছ থেকে সরকাজম সহায়ক নয়।
duffymo

11

আমি মনে করি না আপনি পারবেন। আপনার সেরা বিকল্পটি আপনি অন্য শ্রেণীর উদাহরণে "রেফ" দ্বারা পাস করতে চান এমন জিনিসটি এনপ্যাপুলেট করা এবং (বাহ্যিক) শ্রেণীর রেফারেন্স (মান অনুসারে) পাস করা হতে পারে। আপনি যদি দেখেন আমার অর্থ কি ...

অর্থ্যাৎ আপনার পদ্ধতিটি এটি পাস করা অবজেক্টের অভ্যন্তরীণ অবস্থার পরিবর্তন করে, যা কলারের কাছে দৃশ্যমান।


7

জাভা সর্বদা মান দ্বারা পাস হয়।

আপনি যখন কোনও আদিম পাস করেন তখন এটি মানটির একটি অনুলিপি হয়, যখন আপনি কোনও বস্তু পাস করেন এটি রেফারেন্স পয়েন্টারটির একটি অনুলিপি।


4

আরেকটি বিকল্প একটি অ্যারে, যেমন ব্যবহার করা void method(SomeClass[] v) { v[0] = ...; } এই ভাবে, JDK ব্যবহার করা হয় যেমন করুন ... সামনে পদ্ধতি প্রার্থনা, 2 কিন্তু 1) অ্যারে সক্রিয়া করা আবশ্যক) এখনও এক এই ভাবে যেমন swap 'র পদ্ধতি বাস্তবায়ন করতে পারবে না java.util.concurrent.atomic.AtomicMarkableReference.get(boolean[])

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