জাভাতে কি সি # এর রেফ এবং আউট কীওয়ার্ডের মতো কিছু রয়েছে?


113

নিম্নলিখিত মত কিছু:

রেফ উদাহরণ

void changeString(ref String str) {
    str = "def";
}

void main() {
    String abc = "abc";
    changeString(ref abc);
    System.out.println(abc); //prints "def"
}

উদাহরণস্বরূপ:

void changeString(out String str) {
    str = "def";
}

void main() {
    String abc;
    changeString(out abc);
    System.out.println(abc); //prints "def"
}


5
আইএমও আপনি খুব বেশি মিস করছেন না। আমি কখনই সি ব্যবহার করি refবা outসি # তে কেবল তখনই যখন আমি একটি প্যাটার্ন ব্যবহার করি TryParse(), যেখানে পদ্ধতিটি বুলিয়ান ফলাফল প্রদান করে এবং এর মধ্যে বিশ্লেষণকারী মান পাওয়ার একমাত্র উপায় হল ব্যবহার refবা out
রবার্ট হার্ভে

3
অনুমান করুন কি, এটি আমার সঠিক ব্যবহারের প্রয়োজন! ;)

এটি করার অন্য উপায়টি হ'ল স্থিতি এবং এর মধ্যে একটি অবনমিত মান উভয় সহ একটি যৌগিক বস্তুটি ফিরিয়ে আনা। তবে আমি স্বীকার করি এটি কিছুটা রুবে গোল্ডবার্গ-ইশ।
রবার্ট হার্ভে

1
যৌগিক অবজেক্টটি ফেরত দেওয়ার ক্ষেত্রে কোনও সমস্যা নেই, কেবলমাত্র যদি পূর্বনির্ধারিত ব্যবহারযোগ্য (যেমন টিপলস) থাকে। তবে অপেক্ষা করুন, দক্ষ হওয়ার জন্য আদিম ধরণের সাথে কাজ করা নন-মুছে ফেলা জেনেরিকগুলির দরকার হবে :)
পাভেল মিনায়েভ

উত্তর:


102

না, জাভাতে সি # এর মতো কিছু নেই refএবং outরেফারেন্স দিয়ে যাওয়ার জন্য কীওয়ার্ড।

আপনি কেবল জাভাতে মান দ্বারা পাস করতে পারেন। এমনকি উল্লেখগুলি মান দ্বারা পাস হয় passed দেখুন জন স্কিট এর সম্পর্কে পৃষ্ঠা প্যারামিটার জাভা ক্ষণস্থায়ী আরো বিস্তারিত জানার জন্য।

এর মতো refবা অন্য কিছু করার জন্য outআপনাকে নিজের প্যারামিটারগুলিকে অন্য কোনও অবজেক্টের মধ্যে গুটিয়ে রাখতে হবে এবং সেই বস্তুর রেফারেন্সটিকে প্যারামিটার হিসাবে পাস করতে হবে।


5
এটি কিছু উপর প্রসারিত করা উচিত। আপনি মান হিসাবে কেবল আদিম (পূর্ববর্তী, সংক্ষিপ্ত, চর, ইত্যাদি) পাস করতে পারেন। এবং না, কোন আউট নেই।
কোরি সানউল্ড

14
এটি ১০০% সত্য নয়, আপনি যদি অ্যারে বা ক্লাসে পাস করেন তবে অ্যারে বা অবজেক্টের রেফারেন্সটি মান দ্বারা পাস করা হয়, আপনি অ্যারে বা অবজেক্টের অভ্যন্তরীণ পরিবর্তন করতে পারেন এবং এটি কলারের মধ্যে প্রতিফলিত হবে।
রোমেন হিপ্পি

12
@ ফায়ারফাউহ্যাকপ্ল্যানেট: উম, আপনি যদি না ব্যবহার করেন ref
রবার্ট হার্ভে

2
@ ফিয়ারোফ্যাকহ্যাকপ্ল্যানেট: Reference parameters need the ref modifier as part of both the declaration and the invocation - that means it's always clear when you're passing something by reference. yoda.arachsys.com/csharp/paraters.html
মার্ক বাইয়ার্স

5
সিএলআর দৃষ্টিকোণ থেকে, আপনি T&মান দ্বারা একটি পরিচালিত রেফারেন্স ( ) পাস করছেন yes তবে সি # এর নিজস্ব পরিভাষা রয়েছে এবং এটি নির্দিষ্ট ধরণের মানের হিসাবে নির্দিষ্টভাবে অন্তর্ভুক্ত করে না ref T- সি # দৃষ্টিকোণ থেকে, refকঠোরভাবে একটি পরামিতি সংশোধক, এবং এটির সাথে "মান দ্বারা একটি রেফারেন্স পাস করার" কথা বলার অর্থ হয় না doesn't ।
পাভেল মিনায়েভ

30

সরাসরি উত্তর: না

তবে আপনি মোড়ক দিয়ে রেফারেন্স অনুকরণ করতে পারেন ।

এবং নিম্নলিখিতগুলি করুন:

void changeString( _<String> str ) {
    str.s("def");
}

void testRef() {
     _<String> abc = new _<String>("abc");
     changeString( abc );
     out.println( abc ); // prints def
}

আউট

void setString( _<String> ref ) {
    str.s( "def" );
}
void testOut(){
    _<String> abc = _<String>();
    setString( abc );
    out.println(abc); // prints def
}

এবং মূলত অন্য যে কোনও ধরণের যেমন:

_<Integer> one = new <Integer>(1);
addOneTo( one );

out.println( one ); // May print 2

28
সেকি। এটা কুৎসিত।

46
আমি কখনও বলিনি, আপনি এই মার্জিত উপায়ে এটি করতে পারেন : পি
অস্কাররাইজ

সুতরাং নিম্নলিখিতগুলি কেন কাজ করে না: ব্যক্তিগত স্ট্যাটিক শূন্যতা পার্সলাইন (স্ট্রিং নিউলাইন, স্ট্রিং [] এরাপর, পূর্ণসংখ্যা [] বি-র্যাপার) {স্ট্রিংটোকেনাইজার স্টাট = নতুন স্ট্রিংটোকেনাইজার (নিউলাইন); aWrapper [0] = st.nextToken (); bWrapper [0] = নতুন পূর্ণসংখ্যা (st.nextToken ()); Ars পার্সলাইন (নতুন লাইন, নতুন স্ট্রিং []; এ}, নতুন পূর্ণসংখ্যা [] {বি});
এলাদ বেনদা

3
@ user311130 আপনার কোড পড়া কঠিন, কিন্তু আপনি একটি নতুন প্রশ্ন ভালো কিছু বলার অপেক্ষা রাখে না তৈরী করতে পারে: "আমি এই উত্তর <আমার উত্তর লিংক> পাওয়া কিন্তু নিম্নলিখিত <এখানে আপনার কোড> কাজ করে না
OscarRyz

এটি অদ্ভুত, তবে আমি এখনও এটির মতো একটি কারণ দিচ্ছি কারণ এটি "পরিষ্কার" উপায়ে সমস্যার সমাধান করতে পারে যা আমি
জাভাটির

8

আসলে সেখানে তন্ন তন্ন হয় সুত্র কিংবা আউট মধ্যে শব্দ সমতুল্য জাভা ভাষা হিসেবে যতদূর আমি জানি। তবে আমি কেবল জাভাতে একটি সি # কোড রূপান্তর করেছি যা প্যারামিটার ব্যবহার করে এবং আমি সবেমাত্র কী করেছি তা পরামর্শ দেব will আপনার যেকোন বস্তু একটি মোড়কের ক্লাসে আবৃত করা উচিত এবং মোড়কের অবজেক্টের উদাহরণে মোড়ানো মানগুলি নিম্নরূপে পাস করুন;

র‍্যাপার ব্যবহারের জন্য একটি সাধারণ উদাহরণ

এখানে র‍্যাপার ক্লাস ;

public class Wrapper {
    public Object ref1; // use this as ref
    public Object ref2; // use this as out

    public Wrapper(Object ref1) {
        this.ref1 = ref1;
    }
}

এবং এখানে পরীক্ষার কোডটি রয়েছে;

public class Test {

    public static void main(String[] args) {
        String abc = "abc";
        changeString(abc);
        System.out.println("Initial object: " + abc); //wont print "def"

        Wrapper w = new Wrapper(abc);
        changeStringWithWrapper(w);
        System.out.println("Updated object: " + w.ref1);
        System.out.println("Out     object: " + w.ref2);
    }

    // This won't work
    public static void changeString(String str) {
        str = "def";
    }

    // This will work
    public static void changeStringWithWrapper(Wrapper w) {
        w.ref1 = "def";
        w.ref2 = "And this should be used as out!";
    }

}

একটি বাস্তব বিশ্বের উদাহরণ

প্যারামিটার ব্যবহার করে এসি # .NET পদ্ধতি

এখানে একটি হল C # এর .NET পদ্ধতি যা ব্যবহার করছে আউট শব্দ;

public bool Contains(T value)
{
    BinaryTreeNode<T> parent;
    return FindWithParent(value, out parent) != null;
}

private BinaryTreeNode<T> FindWithParent(T value, out BinaryTreeNode<T> parent)
{
    BinaryTreeNode<T> current = _head;
    parent = null;

    while(current != null)
    {
        int result = current.CompareTo(value);

        if (result > 0)
        {
            parent = current;
            current = current.Left;
        }
        else if (result < 0)
        {
            parent = current;
            current = current.Right;
        }
        else
        {
            break;
        }
    }

    return current;
}

আউট প্যারামিটারটি ব্যবহার করছে এমন সি # কোডের জাভা সমতুল্য

এবং জাভা সমতুল্য এই পদ্ধতিটির মোড়কের সাহায্যে নিম্নরূপ:

public boolean contains(T value) {
    BinaryTreeNodeGeneration<T> result = findWithParent(value);

    return (result != null);
}

private BinaryTreeNodeGeneration<T> findWithParent(T value) {
    BinaryTreeNode<T> current = head;
    BinaryTreeNode<T> parent = null;
    BinaryTreeNodeGeneration<T> resultGeneration = new BinaryTreeNodeGeneration<T>();
    resultGeneration.setParentNode(null);

    while(current != null) {
        int result = current.compareTo(value);

        if(result >0) {
            parent = current;
            current = current.left;
        } else if(result < 0) {
            parent = current;
            current = current.right;
        } else {
            break;
        }
    }

    resultGeneration.setChildNode(current);
    resultGeneration.setParentNode(parent);

    return resultGeneration;
}

মোড়ক ক্লাস

এবং এই জাভা কোডে ব্যবহৃত র‍্যাপার ক্লাসটি নীচের মতো রয়েছে;

public class BinaryTreeNodeGeneration<TNode extends Comparable<TNode>>  {

    private BinaryTreeNode<TNode>   parentNode;
    private BinaryTreeNode<TNode>   childNode;

    public BinaryTreeNodeGeneration() {
        this.parentNode = null;
        this.childNode = null;
    }

    public BinaryTreeNode<TNode> getParentNode() {
        return parentNode;
    }

    public void setParentNode(BinaryTreeNode<TNode> parentNode) {
        this.parentNode = parentNode;
    }

    public BinaryTreeNode<TNode> getChildNode() {
        return childNode;
    }

    public void setChildNode(BinaryTreeNode<TNode> childNode) {
        this.childNode = childNode;
    }

}

প্রাক্তন উত্তর দেখুন।

নেতিবাচক ভোটের একটি বিস্তারিত উত্তর দেওয়া মজার is আমি SO পরীক্ষা করে দেখেছি এবং ডেমো কোড সহ একটি সূক্ষ্ম সঠিক উত্তর খুঁজে পাইনি, এ কারণেই আমি এই উত্তরটি যতদূর মনে করতে পারি তাই লিখেছি। যদি আপনি কোনও একক উত্তরের জন্য অপেক্ষা করেন এবং প্রতিটি অন্য উত্তরটি ভোট দিয়ে যান, তবে এস-ও এর উত্তর ছাড়া অন্য সমস্ত প্রশ্নের নিষেধাজ্ঞা জারি করা উচিত।
লেভেন্ট ডিভিলিওগ্লু

ঠিক আছে, আপনি উত্তরটি সম্পাদনা করলেই আমি নেতিবাচক ভোটটি সরিয়ে ফেলতে পারি। সুতরাং অন্যান্য উত্তরগুলি পড়ুন এবং ব্যাখ্যা করুন যে আপনি কেন এই সমাধানগুলি ব্যবহার করতে চান নি। একটি মোড়ক (এবং কেবল এটির মজাদার জন্য একটি আরএফ এবং আউট র‍্যাপার)। 5 জন ব্যক্তি উদাহরণ সহ সংক্ষিপ্ত এবং পূর্ণ উত্তর দিয়েছিলেন , এবং কেবল এয়াল মূলত লিখেছিলেন: "না আপনি পারবেন না"।
পাশুট

1
এই উত্তরটি দুর্দান্ত দেখাচ্ছে। এটি শীর্ষ উত্তরের সাথে সমান, তবে জাভাতে কীভাবে র‌্যাপার ক্লাস ব্যবহার করবেন সে সম্পর্কে পুরোপুরি বিশদ উদাহরণ দেয়।
হুবাতিশ

8

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

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


6

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

নীচের কোডে একটি উদাহরণ অন্তর্ভুক্ত রয়েছে।

//*******************************************************************************************
//XOUT CLASS
//*******************************************************************************************
public class XOUT<T>
{
    public XOBJ<T> Obj = null;

    public XOUT(T value)
    {
        Obj = new XOBJ<T>(value);
    }

    public XOUT()
    {
      Obj = new XOBJ<T>();
    }

    public XOUT<T> Out()
    {
        return(this);
    }

    public XREF<T> Ref()
    {
        return(Obj.Ref());
    }
};

//*******************************************************************************************
//XREF CLASS
//*******************************************************************************************

public class XREF<T>
{
    public XOBJ<T> Obj = null;

    public XREF(T value)
    {
        Obj = new XOBJ<T>(value);
    }

    public XREF()
    {
      Obj = new XOBJ<T>();
    }

    public XOUT<T> Out()
    {
        return(Obj.Out());
    }

    public XREF<T> Ref()
    {
        return(this);
    }
};

//*******************************************************************************************
//XOBJ CLASS
//*******************************************************************************************
/**
 *
 * @author jsimms
 */
/*
    XOBJ is the base object that houses the value. XREF and XOUT are classes that
    internally use XOBJ. The classes XOBJ, XREF, and XOUT have methods that allow
    the object to be used as XREF or XOUT parameter; This is important, because
    objects of these types are interchangeable.

    See Method:
       XXX.Ref()
       XXX.Out()

    The below example shows how to use XOBJ, XREF, and XOUT;
    //
    // Reference parameter example
    //
    void AddToTotal(int a, XREF<Integer> Total)
    {
       Total.Obj.Value += a;
    }

    //
    // out parameter example
    //
    void Add(int a, int b, XOUT<Integer> ParmOut)
    {
       ParmOut.Obj.Value = a+b;
    }

    //
    // XOBJ example
    //
    int XObjTest()
    {
       XOBJ<Integer> Total = new XOBJ<>(0);
       Add(1, 2, Total.Out());    // Example of using out parameter
       AddToTotal(1,Total.Ref()); // Example of using ref parameter
       return(Total.Value);
    }
*/


public class XOBJ<T> {

    public T Value;

    public  XOBJ() {

    }

    public XOBJ(T value) {
        this.Value = value;
    }

    //
    // Method: Ref()
    // Purpose: returns a Reference Parameter object using the XOBJ value
    //
    public XREF<T> Ref()
    {
        XREF<T> ref = new XREF<T>();
        ref.Obj = this;
        return(ref);
    }

    //
    // Method: Out()
    // Purpose: returns an Out Parameter Object using the XOBJ value
    //
    public XOUT<T> Out()
    {
        XOUT<T> out = new XOUT<T>();
        out.Obj = this;
        return(out);
    }

    //
    // Method get()
    // Purpose: returns the value
    // Note: Because this is combersome to edit in the code,
    // the Value object has been made public
    //
    public T get() {
        return Value;
    }

    //
    // Method get()
    // Purpose: sets the value
    // Note: Because this is combersome to edit in the code,
    // the Value object has been made public
    //
    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();
    }
}

1

তিনটি সমাধান সরকারীভাবে বর্ণিত নয়, স্পষ্টভাবে উল্লেখ করা হয়েছে:

ArrayList<String> doThings() {
  //
}

void doThings(ArrayList<String> list) {
  //
}

Pair<String, String> doThings() {
  //
}

পেয়ারের জন্য, আমি সুপারিশ করব: https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/tuple/Pair.html


-1

জাভা করার কোনও মানক উপায় নেই। ক্লাসে প্যাকেজযুক্ত তালিকায় সর্বাধিক অদলবদল করা হবে। তবে এটি করার একটি আনুষ্ঠানিক উপায় রয়েছে:

package Example;

import java.lang.reflect.Field;
import java.util.logging.Level;
import java.util.logging.Logger;



 public class Test{


private static <T> void SetValue(T obj,T value){
    try {
        Field f = obj.getClass().getDeclaredField("value");
        f.setAccessible(true);
        f.set(obj,value);
        } catch (IllegalAccessException | IllegalArgumentException | 
            NoSuchFieldException | SecurityException ex) {
            Logger.getLogger(CautrucjavaCanBan.class.getName()).log(Level.SEVERE, 
       null, ex);
        }
}
private  static  void permutation(Integer a,Integer b){
    Integer tmp = new Integer(a);
    SetValue(a, b);
    SetValue(b, tmp);
}
 private  static  void permutation(String a,String b){
    char[] tmp = a.toCharArray();
    SetValue(a, b.toCharArray());
    SetValue(b, tmp);
}
public static void main(String[] args) {
    {
        Integer d = 9;
        Integer e = 8;
        HoanVi(d, e);
        System.out.println(d+" "+ e);
    }
    {
        String d = "tai nguyen";
        String e = "Thai nguyen";
        permutation(d, e);
        System.out.println(d+" "+ e);
    }
}

}

1
এটি আপনাকে প্যারামিটারের জন্য রেফারেন্স সিমানটিকস দিচ্ছে না, যা অপরিবর্তনীয় বলে নকশাকৃত কোনও বস্তুর পরিবর্তনের জন্য প্রতিবিম্ব ব্যবহার করছে, এটি একটি ভয়ানক ধারণা, এবং এখনও প্যারামিটারের জন্য রেফারেন্স শব্দার্থবিদ্যা সরবরাহ করে না।
পরিবেশন করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.