জাভা: রেফারেন্স দিয়ে ইন পাস করার সেরা উপায়


84

আমার একটি পার্সিং ফাংশন রয়েছে যা একটি বাইট বাফার থেকে একটি এনকোড দৈর্ঘ্যকে পার্স করে, এটি পার্সড দৈর্ঘ্যকে একটি ইনট হিসাবে ফিরিয়ে দেয় এবং একটি ইনটিজার আর্গ হিসাবে বাফারে একটি সূচি গ্রহণ করে। আমি ফাংশনটি সূচকটি যা পার্স করা হয়েছে তার আপডেট করতে চাই, অর্থাত্ সূচকটি রেফারেন্স দিয়ে পাস করতে চাই। সি তে আমি কেবল একটি পাস করতাম int *। জাভাতে এটি করার সর্বোত্তম উপায় কী? আমি বর্তমানে সূচক আরগ পাশ করার দিকে তাকিয়ে আছি। হিসাবে একটি int[], কিন্তু এটি কিছুটা কদর্য


13
Integerঅপরিবর্তনীয়
যুবাল আদম

4
আপনি যদি অ্যাপাচি লাইব্রেরি এড়াতে চান তবে আপনি ইনটি পাস করতে পারেন এবং আপডেট করা মানটি ফিরিয়ে দিতে পারেন। যদি এটির দুটি মান হয় তবে আমি পয়েন্টটিকে একটি ধারক হিসাবে ব্যবহার করার পরামর্শ দিচ্ছি। অন্যথায়, অ্যারের বিকল্প বা অন্য পরামর্শগুলির মধ্যে একটি এখানে ভাল।
EntangledLoops

আপনার কোনও ইনট বা কোনও জিনিস ফেরত দেওয়া উচিত; আপনার যদি সত্যিই একাধিকের প্রয়োজন হয় তবে সম্ভবত আপনার 'ক্লাস' নকশাটি পুনর্বিবেচনা করা উচিত
উজ্জ্বল সিং

উত্তর:


72

আপনি org.apache.commons.lang.mutable.MutableIntঅ্যাপাচি কমন্স লাইব্রেরি থেকে চেষ্টা করে দেখতে পারেন । ভাষাতে এটি করার সরাসরি কোনও উপায় নেই।


24

জাভাতে এটি সম্ভব নয়। আপনি যেমন পরামর্শ দিয়েছেন একটি উপায় পাস করা int[]। অন্য একটি সামান্য ক্লাস আছে যেমন IntHolderএকটি মোড়ানো একটি হবে int


20

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

আপনি যা করতে পারেন তা হ'ল একটি পরিবর্তনীয় অবজেক্টে আপনার পূর্ণসংখ্যার মানটি মোড়ানো। অ্যাপাচি কমন্স ব্যবহার MutableIntকরা একটি ভাল বিকল্প। আরেকটি, কিছুটা অবলুপ্ত উপায়, int[]আপনার প্রস্তাবিত মত ব্যবহার করা । আপনি কেন intএকটি এককোষী অ্যারেতে মোড়ক রাখছেন তা পরিষ্কার না হওয়ায় আমি এটি ব্যবহার করব না ।

নোট যে java.lang.Integerঅপরিবর্তনীয়।


অ্যাটমিকআইন্টিজারের ব্যবহার সম্পর্কে কী? এই পরিবর্তনযোগ্য এবং রেফারেন্স মাধ্যমে পাস করা হয়? (আফাক অ্যাটমিক রেফারেন্স <বুলিয়ান> এটি সঠিকভাবে করে)।
আইসবিটিস


14

বাইট বাফার অবজেক্টে বাইট বাফার এবং সূচি মোড়ক করুন । একটি বাইটবফার একটি বাফার + অবস্থানের ধারণাটি সজ্জিত করে এবং আপনাকে সূচিকৃত অবস্থান থেকে পড়তে এবং লিখতে দেয়, যা আপনার সাথে যেতে যেতে আপডেট হয়।


6
হুবহু জাভাটিকে আপনার পথে এটি করতে বাধ্য করবেন না, এটি জাভা উপায়ে করুন। জাভা সি নয়, এটিকে সি এর মতো কাজ করার চেষ্টা সর্বদা কুৎসিত হ্যাক থাকবে।
এড়িয়ে হেড

9

আপনি এর মতো নতুন ক্লাস ডিজাইন করতে পারেন:

public class Inte{
       public int x=0;
}

পরে আপনি এই শ্রেণীর অবজেক্ট তৈরি করতে পারেন:

Inte inte=new Inte();

তারপরে আপনি inteযুক্তি হিসাবে পাস করতে পারেন যেখানে আপনি পূর্ণসংখ্যের ভেরিয়েবলটি পাস করতে চান:

public void function(Inte inte) {
some code
}

সুতরাং পূর্ণসংখ্যা মান আপডেট করার জন্য:

inte.x=value;

মান পাওয়ার জন্য:

Variable=inte.x;

8

আদিমগুলি মোড়ানোর জন্য আপনি একটি রেফারেন্স ক্লাস তৈরি করতে পারেন:

public class Ref<T>
{
    public T Value;

    public Ref(T value)
    {
        Value = value;
    }
}

তারপরে আপনি এমন ফাংশন তৈরি করতে পারেন যা পরামিতি হিসাবে একটি রেফারেন্স নেয়:

public class Utils
{
    public static <T> void Swap(Ref<T> t1, Ref<T> t2)
    {
        T temp = t1.Value;
        t1.Value = t2.Value;
        t2.Value = temp;
    }
}

ব্যবহার:

Ref<Integer> x = 2;
Ref<Integer> y = 9;
Utils.Swap(x, y);

System.out.println("x is now equal to " + x.Value + " and y is now equal to " + y.Value";
// Will print: x is now equal to 9 and y is now equal to 2

আশাকরি এটা সাহায্য করবে.

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