উত্তর:
জাভা বিভ্রান্তিকর কারণ সমস্ত কিছু মান দিয়ে যায় । তবে রেফারেন্স টাইপের একটি প্যারামিটারের জন্য (যেমন আদিম ধরণের কোনও পরামিতি নয়) এটি রেফারেন্সটি যা মান দ্বারা পাস হয়, তাই এটি পাস-রেফারেন্স হিসাবে উপস্থিত হয় (এবং লোকেরা প্রায়শই এটি দাবি করে যে)। এটি নিম্নলিখিত হিসাবে দেখানো হিসাবে এটি নয়:
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"); }
আমি জাভাতে রেফারেন্স দিয়ে প্যারামিটারগুলি পাস করতে পারি?
না।
কেন? জাভাতে পদ্ধতির কাছে আর্গুমেন্টগুলি দেওয়ার একটিমাত্র পদ্ধতি রয়েছে: মান অনুসারে।
বিঃদ্রঃ:
আদিমদের জন্য এটি বোঝা সহজ: আপনি মানটির একটি অনুলিপি পান।
অন্য সকলের জন্য আপনি রেফারেন্সের একটি অনুলিপি পান এবং এটিকে মান দ্বারা পাসিংও বলা হয়।
সব কিছুই এই ছবিতে:
জাভাতে রেফের মতো ভাষা স্তরে কিছুই নেই । জাভাতে কেবল মূল্য মানের দ্বারা পাস হয়
কৌতূহলের খাতিরে আপনি জাভাতে একটি রেফ-এর মতো শব্দার্থক প্রয়োগ করতে পারেন আপনার জিনিসগুলিকে কেবল একটি পরিবর্তনীয় শ্রেণিতে আবৃত:
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"
AtomicReference
(অ-আদিমদের জন্য) কেন ব্যবহার করবেন না? বা AtomicSomething
(যেমন AtomicBoolean
:) আদিমদের জন্য?
int
পরিবর্তে Integer
, এর bool
পরিবর্তে Boolean
এবং আরও অনেক কিছু ব্যবহার করা কি সত্যই যথেষ্ট গুরুত্বপূর্ণ ? অর্থাত, মোড়কের ক্লাসগুলি (যা সিনট্যাক্স নিয়ে উদ্বেগ প্রকাশ করলে স্বয়ংক্রিয়ভাবে আবদ্ধ হয়) কাজ করে না?
"জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজে" জেমস গোসলিং থেকে:
"... জাভাতে ঠিক একটি প্যারামিটার পাস করার মোড রয়েছে - মান অনুসারে পাস করুন - এবং এটি বিষয়গুলি সহজ রাখে .."
The pronouncement of the language god should be declared the answer
সত্যই নয়। জাভা স্রষ্টা যা মনে করেন বা বিশ্বাস করেন তা সত্ত্বেও এর সম্পূর্ণ উত্তরটি ভাষার স্পেসিফিকেশনের একটি উদ্ধৃতি থেকে আসবে।
আমি মনে করি না আপনি পারবেন। আপনার সেরা বিকল্পটি আপনি অন্য শ্রেণীর উদাহরণে "রেফ" দ্বারা পাস করতে চান এমন জিনিসটি এনপ্যাপুলেট করা এবং (বাহ্যিক) শ্রেণীর রেফারেন্স (মান অনুসারে) পাস করা হতে পারে। আপনি যদি দেখেন আমার অর্থ কি ...
অর্থ্যাৎ আপনার পদ্ধতিটি এটি পাস করা অবজেক্টের অভ্যন্তরীণ অবস্থার পরিবর্তন করে, যা কলারের কাছে দৃশ্যমান।
আরেকটি বিকল্প একটি অ্যারে, যেমন ব্যবহার করা
void method(SomeClass[] v) { v[0] = ...; }
এই ভাবে, JDK ব্যবহার করা হয় যেমন করুন ... সামনে পদ্ধতি প্রার্থনা, 2 কিন্তু 1) অ্যারে সক্রিয়া করা আবশ্যক) এখনও এক এই ভাবে যেমন swap 'র পদ্ধতি বাস্তবায়ন করতে পারবে না java.util.concurrent.atomic.AtomicMarkableReference.get(boolean[])
।