জাভা রেফারেন্স দ্বারা একটি স্ট্রিং পাস?


161

আমি নিম্নলিখিতগুলি করতে অভ্যস্ত C:

void main() {
    String zText = "";
    fillString(zText);
    printf(zText);
}

void fillString(String zText) {
    zText += "foo";
}

এবং আউটপুটটি হ'ল:

foo

তবে জাভাতে এটি কাজ করবে বলে মনে হয় না। আমি ধরে নিই কারণ রেফারেন্স দিয়ে পাস করার পরিবর্তে Stringঅবজেক্টটি অনুলিপি করা হয়েছে । আমি ভেবেছিলাম স্ট্রিংগুলি বস্তু ছিল, যা সর্বদা রেফারেন্স দ্বারা প্রেরণ করা হয়।

এখানে কি হচ্ছে?


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

8
এটি সি কোড নয়।
অ্যালস্টন

@ ফিল: এটি সি # তেও কাজ করবে না।
মঙ্গেশ

উত্তর:


196

আপনার কাছে তিনটি বিকল্প রয়েছে:

  1. একটি স্ট্রিংবিল্ডার ব্যবহার করুন:

    StringBuilder zText = new StringBuilder ();
    void fillString(StringBuilder zText) { zText.append ("foo"); }
  2. একটি ধারক শ্রেণী তৈরি করুন এবং আপনার পদ্ধতিতে ধারকটির একটি উদাহরণ দিন:

    public class Container { public String data; }
    void fillString(Container c) { c.data += "foo"; }
  3. একটি অ্যারে তৈরি করুন:

    new String[] zText = new String[1];
    zText[0] = "";
    
    void fillString(String[] zText) { zText[0] += "foo"; }

পারফরম্যান্সের দৃষ্টিকোণ থেকে, স্ট্রিংবিল্ডার সাধারণত সেরা বিকল্প।


11
কেবল মনে রাখবেন যে স্ট্রিংবিল্ডার থ্রেড নিরাপদ নয়। মাল্টিথ্রেডেড পরিবেশে স্ট্রিংবাফার ক্লাস ব্যবহার করুন বা ম্যানুয়ালি সিঙ্ক্রোনাইজেশনের যত্ন নিন।
বরিস পাভলোভিć

12
@ বোরিস পাভলভিক - হ্যাঁ, তবে যদি না একই স্ট্রিংবিল্ডার বিভিন্ন থ্রেড দ্বারা ব্যবহৃত না হয়, যা আইএমও কোনও প্রদত্ত দৃশ্যে অসম্ভব, এটি সমস্যা হওয়া উচিত নয়। পদ্ধতিটি বিভিন্ন থ্রেড দ্বারা ডাকা হয়েছে কিনা তা ভিন্ন নয়, ভিন্ন স্ট্রিংবিল্ডার গ্রহণ করে।
রবি ওয়ালাউ

আমি তৃতীয় বিকল্পটি (অ্যারে) সবচেয়ে বেশি পছন্দ করি কারণ এটি একমাত্র সাধারণ। এটি বুলিয়ান, ইন্ট ইত্যাদি পাস করার অনুমতি দেয় আপনি দয়া করে এই সমাধানটির কার্যকারিতা সম্পর্কে আরও কিছুটা ব্যাখ্যা করতে পারেন - আপনি দাবি করেন যে প্রথমটি পারফরম্যান্সের দিক থেকে ভাল।
মেলিক

@ মেলিকগুলি StringBuilderদ্রুততর s += "..."যেহেতু এটি প্রতিবার নতুন স্ট্রিং অবজেক্ট বরাদ্দ করে না। আসলে আপনি যখন জাভা কোডটি লিখবেন s = "Hello " + nameতখন কম্পাইলারটি বাইট কোড তৈরি করবে যা একটি তৈরি করে StringBuilderএবং append()দু'বার কল করে ।
অ্যারন দিগুল্লা

86

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


2
এটি কোনও ভ্রান্ত ধারণা নয় এটি একটি ধারণা
প্যাট্রিক কর্নেলিসসেন

41
উম্মম..না, এটি একটি ভুল ধারণা যে আপনি কোনও বিষয়টিকে রেফারেন্স দিয়ে পাস করছেন। আপনি মান অনুসারে একটি রেফারেন্স দিয়ে যাচ্ছেন।
এড এস

30
হ্যাঁ, এটি একটি ভুল ধারণা। এটি একটি বিশাল, ব্যাপক ভুল ধারণা। এটি এমন একটি সাক্ষাত্কারের প্রশ্নের দিকে নিয়ে যায় যা আমি ঘৃণা করি: ("জাভা কীভাবে যুক্তিগুলি পাস করে")। আমি এটিকে ঘৃণা করি কারণ প্রায় অর্ধেক সাক্ষাত্কারকারীরই মনে হয় আসলে ভুল উত্তর ("মান অনুসারে আদিম, রেফারেন্স অনুসারে বস্তু") চান want সঠিক উত্তর দিতে আরও বেশি সময় লাগে এবং এগুলির মধ্যে কিছু বিভ্রান্ত বলে মনে হয়। এবং তারা বিশ্বাসযোগ্য হবে না: আমি শপথ করছি আমি একটি প্রযুক্তিগত পর্দা ফ্ল্যাঙ্ক করেছি কারণ সিএসএমজোর-টাইপ স্ক্রিনার কলেজটিতে ভুল ধারণাটি শুনেছিল এবং এটি সুসমাচার হিসাবে বিশ্বাস করেছিল। Feh।
সিপারকিনস

4
@ সিগার্কিনস আপনার সম্পর্কে কোনও ধারণা নেই যা আমাকে ক্রুদ্ধ করেছে। এটা আমার রক্ত ​​ফোঁড়া করে তোলে।

6
সমস্ত ভাষাতে সমস্ত ভাষায় মান দ্বারা পাস করা হয়। এই মানগুলির মধ্যে কয়েকটি ঠিকানা (তথ্যসূত্র) হতে পারে।
gerardw

52

যা ঘটছে তা হল রেফারেন্সটি মান দ্বারা পাস করা হয়, অর্থাত্, রেফারেন্সের একটি অনুলিপি পাস হয়। জাভা কিছুই কিছুই রেফারেন্স দ্বারা পাস করা হয় না, এবং যেহেতু একটি স্ট্রিং অপরিবর্তনীয়, সেই অ্যাসাইনমেন্টটি একটি নতুন স্ট্রিং অবজেক্ট তৈরি করে যা রেফারেন্সের অনুলিপিটি এখন নির্দেশ করে। মূল রেফারেন্সটি এখনও খালি স্ট্রিংকে নির্দেশ করে।

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

void foo( object o )
{
    o = new Object( );  // original reference still points to old value on the heap
}

6
দুর্দান্ত উদাহরণ!
নিকোলাস

18

java.lang.String অপরিবর্তনীয়।

আমি ইউআরএল আটকানো ঘৃণা করি তবে https://docs.oracle.com/javase/10/docs/api/java/lang/String.html আপনি জাভা-জমিতে রয়েছেন কিনা তা বুঝতে এবং বুঝতে আপনার পক্ষে প্রয়োজনীয়।


আমি মনে করি না যে সোরেন জনসন জানেন না স্ট্রিং কী, এটি প্রশ্ন ছিল না এবং জাভা 15 বছর পরে আমি এখানে কী খুঁজছিলাম not
এএইচএইচ

8

বস্তুগুলি রেফারেন্স দ্বারা পাস হয়, আদিমগুলি মান দ্বারা পাস হয়।

স্ট্রিং কোনও আদিম নয়, এটি একটি বস্তু এবং এটি কোনও বস্তুর বিশেষ ক্ষেত্র।

এটি মেমরি-সংরক্ষণের উদ্দেশ্যে। জেভিএম-এ স্ট্রিং পুল রয়েছে। তৈরি প্রতিটি স্ট্রিংয়ের জন্য, জেভিএম একই স্ট্রিং স্ট্রিং পুলটিতে উপস্থিত রয়েছে কিনা তা দেখার চেষ্টা করবে এবং ইতিমধ্যে একটি আছে কিনা তা নির্দেশ করবে।

public class TestString
{
    private static String a = "hello world";
    private static String b = "hello world";
    private static String c = "hello " + "world";
    private static String d = new String("hello world");

    private static Object o1 = new Object();
    private static Object o2 = new Object();

    public static void main(String[] args)
    {
        System.out.println("a==b:"+(a == b));
        System.out.println("a==c:"+(a == c));
        System.out.println("a==d:"+(a == d));
        System.out.println("a.equals(d):"+(a.equals(d)));
        System.out.println("o1==o2:"+(o1 == o2));

        passString(a);
        passString(d);
    }

    public static void passString(String s)
    {
        System.out.println("passString:"+(a == s));
    }
}

/ * আউটপুট * /

a==b:true
a==c:true
a==d:false
a.equals(d):true
o1==o2:false
passString:true
passString:false

== মেমরি ঠিকানা (রেফারেন্স) জন্য পরীক্ষা করছে, এবং .equals বিষয়বস্তু (মান) জন্য পরীক্ষা করছে


3
সম্পূর্ণ সত্য নয়। জাভা সর্বদা VALUE দ্বারা পাস হয়; কৌশলটি হ'ল অবজেক্টগুলি রেফারেন্স দ্বারা পাস হয় যা মান দ্বারা পাস হয়। (ছদ্মবেশী, আমি জানি) এটি দেখুন: javadude.com/articles/passbyvalue.htm
adhg

1
@ অ্যাডজি আপনি লিখেছেন "অবজেক্টগুলি রেফারেন্স দ্বারা পাস হয় যা মান দ্বারা পাস হয়।" <--- এটি জিবরাশি। আপনার অর্থ অবজেক্টগুলির রেফারেন্স রয়েছে যা মান দ্বারা পাস করা হয়
বার্লোপ

2
-1 আপনি লিখেছেন "বিষয়গুলি রেফারেন্স দ্বারা পাস হয়," <- মিথ্যা। যদি এটি সত্য হয় তবে কোনও পদ্ধতিটি কল করার সময় এবং একটি ভেরিয়েবল পাস করার সময়, পদ্ধতিটি ভেরিয়েবল পয়েন্ট তৈরি করতে পারে / কোনও ভিন্ন অবজেক্টের উল্লেখ করতে পারে, তবে তা পারে না। সব কিছু জাভাতে মূল্য দিয়ে যায়। এবং আপনি এখনও পদ্ধতির বাইরে কোনও অবজেক্টের বৈশিষ্ট্যগুলি পরিবর্তন করার প্রভাব দেখতে পান।
বার্লোপ

দেখতে উত্তর এখানে stackoverflow.com/questions/40480/...
barlop

7

জাভাতে সমস্ত যুক্তি মান দ্বারা পাস করা হয়। যখন আপনি Stringকোনও ফাংশনে একটি পাস করেন , তখন যে মানটি পাস হয় is তা স্ট্রিং অবজেক্টের একটি রেফারেন্স, তবে আপনি সেই রেফারেন্সটি সংশোধন করতে পারবেন না এবং অন্তর্নিহিত স্ট্রিং অবজেক্টটি অপরিবর্তনীয়।

নিয়োগ

zText += foo;

সমান:

zText = new String(zText + "foo");

এটি হল (এটি স্থানীয়ভাবে) প্যারামিটারটিকে zTextএকটি নতুন রেফারেন্স হিসাবে পুনরায় সাইন করে , যা একটি নতুন মেমরি অবস্থানকে নির্দেশ করে, Stringএতে একটি নতুন থাকে যা সংযোজন zTextসহ মূল বিষয়বস্তু ধারণ করে "foo"

আসল অবজেক্টটি সংশোধিত হয় না এবং main()পদ্ধতিটির স্থানীয় ভেরিয়েবলটি zTextএখনও মূল (খালি) স্ট্রিংকে নির্দেশ করে।

class StringFiller {
  static void fillString(String zText) {
    zText += "foo";
    System.out.println("Local value: " + zText);
  }

  public static void main(String[] args) {
    String zText = "";
    System.out.println("Original value: " + zText);
    fillString(zText);
    System.out.println("Final value: " + zText);
  }
}

কপি করে প্রিন্ট:

Original value:
Local value: foo
Final value:

আপনি যদি স্ট্রিংটি সংশোধন করতে চান তবে আপনি হিসাবে উল্লেখযোগ্য ব্যবহার হিসাবে StringBuilderবা অন্য কোনও ধারক (একটি অ্যারে বা একটি AtomicReferenceবা কাস্টম ধারক শ্রেণি) যা আপনাকে পয়েন্টার ইন্ডিরেশনের একটি অতিরিক্ত স্তর দেয় can বিকল্পভাবে, কেবল নতুন মানটি ফিরিয়ে দিন এবং এটি নির্ধারণ করুন:

class StringFiller2 {
  static String fillString(String zText) {
    zText += "foo";
    System.out.println("Local value: " + zText);
    return zText;
  }

  public static void main(String[] args) {
    String zText = "";
    System.out.println("Original value: " + zText);
    zText = fillString(zText);
    System.out.println("Final value: " + zText);
  }
}

কপি করে প্রিন্ট:

Original value:
Local value: foo
Final value: foo

এটি সম্ভবত সাধারণ ক্ষেত্রে সর্বাধিক জাভা-জাতীয় সমাধান - কার্যকর জাভা আইটেমটি "প্রিয় অপরিবর্তনীয়তা" দেখুন।

হিসাবে সুপরিচিত, যদিও, StringBuilderপ্রায়ই আপনি ভাল পারফরম্যান্স দিতে হবে - আপনি, কি বিশেষ করে একটি লুপ ভিতরে, ব্যবহার সংযোজন অনেক আছে StringBuilder

তবে আপনি পারলে Stringsপরিবর্তযোগ্য পরিবর্তে অপরিবর্তনীয় হয়ে ওঠার চেষ্টা করুন StringBuilders- আপনার কোডটি পড়া সহজ এবং আরও রক্ষণাবেক্ষণযোগ্য হবে। আপনার প্যারামিটারগুলি তৈরি করা finalএবং আপনার আইডিই কনফিগার করার বিষয়ে আপনাকে সতর্ক করার জন্য যখন আপনি কোনও পদ্ধতির প্যারামিটারটিকে কোনও নতুন মানকে পুনরায় নিযুক্ত করেন Consider


6
আপনি "কঠোরভাবে বলতে" বলছেন যেন এটি প্রায় অপ্রাসঙ্গিক - যেখানে এটি সমস্যার কেন্দ্রস্থলে থাকে। জাভা যদি সত্যিই রেফারেন্স দিয়ে চলে যায় তবে সমস্যা হবে না। "জাভা রেফারেন্স দ্বারা বস্তুগুলি পাস করে" এর রূপকথার প্রচার এড়াতে দয়া করে চেষ্টা করুন - (সঠিক) "রেফারেন্সটি মান দ্বারা পাস হয়" মডেলটি আরও অনেক সহায়ক, আইএমও।
জন স্কিটি

আরে, আমার আগের মন্তব্যটি কোথায় গেল? :-) আমি আগে যেমন বলেছিলাম, এবং জন এখন যোগ করেছে, এখানে আসল বিষয়টি হ'ল রেফারেন্সটি মান দ্বারা পাস হয়েছে। এটি খুব গুরুত্বপূর্ণ এবং অনেক লোক শব্দার্থক পার্থক্য বুঝতে পারে না।
এড এস

1
যথেষ্ট ফর্সা। জাভা প্রোগ্রামার হিসাবে আমি বাস্তবে কোনও দশকের চেয়ে ভাল সময়ে রেফারেন্স দিয়ে পাস করতে দেখিনি , তাই আমার ভাষাটি opিলে .ালা হয়ে গেছে। তবে আপনি ঠিক বলেছেন, আমার আরও যত্ন নেওয়া উচিত ছিল, বিশেষত সি-প্রোগ্রামিং দর্শকদের জন্য।
ডেভিড মোলস

5

স্ট্রিং জাভাতে একটি অপরিবর্তনীয় বস্তু। আপনি যে কাজটি সম্পাদন করার চেষ্টা করছেন তা করতে আপনি স্ট্রিংবিল্ডার ক্লাসটি ব্যবহার করতে পারেন, নীচে:

public static void main(String[] args)
{
    StringBuilder sb = new StringBuilder("hello, world!");
    System.out.println(sb);
    foo(sb);
    System.out.println(sb);

}

public static void foo(StringBuilder str)
{
    str.delete(0, str.length());
    str.append("String has been modified");
}

আরেকটি বিকল্প হ'ল স্ট্রিং সহ একটি স্কোপ ভেরিয়েবল (অত্যন্ত নিরুৎসাহিত) হিসাবে নিম্নরূপে একটি ক্লাস তৈরি করা:

class MyString
{
    public String value;
}

public static void main(String[] args)
{
    MyString ms = new MyString();
    ms.value = "Hello, World!";

}

public static void foo(MyString str)
{
    str.value = "String has been modified";
}

1
স্ট্রিং জাভাতে আদিম ধরণের নয়।
ভিউবার

সত্য, তবে আপনি আমার দৃষ্টি আকর্ষণ করতে ঠিক কী চেষ্টা করছেন?
ফাদি হান্না AL-Kass

জাভা স্ট্রিং কখন থেকে আদিম ?! তাই! স্ট্রিং রেফারেন্স দ্বারা পাস।
thedp

2
'অপরিবর্তনীয় বস্তু' হ'ল আমি যা বলতে চাইছিলাম। @ ভিউবার একটি মন্তব্য করার পরে আমি কোনও কারণে আমার উত্তরটি পুনরায় পড়িনি, তবে এখন আমি কী বলতে চাইছি তা দেখছি। আমার খারাপ উত্তর পরিবর্তিত হয়েছে
ফাদি হান্না AL-Kass

2

উত্তরটি সহজ। জাভা স্ট্রিং অপরিবর্তনীয়। সুতরাং এটি 'চূড়ান্ত' পরিবর্তনকারী (বা সি / সি ++ এ 'কনস্ট') ব্যবহারের মতো। সুতরাং, একবার নির্ধারিত হয়ে গেলে, আপনি নিজের মতো করে পরিবর্তন করতে পারবেন না।

আপনি পরিবর্তন করতে পারেন যা মান যা একটি স্ট্রিং পয়েন্ট, কিন্তু আপনি প্রকৃত মূল্য যা এই স্ট্রিং বর্তমানে নির্দেশ করা হয় না পরিবর্তন করতে পারেন।

অর্থাৎ। String s1 = "hey"। আপনি এটি তৈরি করতে পারেন s1 = "woah"এবং এটি পুরোপুরি ঠিক আছে, তবে আপনি আসলে স্ট্রিংয়ের অন্তর্নিহিত মানটি পরিবর্তন করতে পারবেন না (এই ক্ষেত্রে: "আরে") একবার তার আরও একবারে আরও কিছু হিসাবে নির্ধারিত হয়েছে প্লাসএকুয়ালস ইত্যাদি (যেমন। s1 += " whatup != "hey whatup")।

এটি করার জন্য, স্ট্রিংবিল্ডার বা স্ট্রিংবফার ক্লাস বা অন্যান্য পরিবর্তনীয় পাত্রে ব্যবহার করুন, তারপরে অবজেক্টটিকে স্ট্রিংয়ে রূপান্তর করতে কেবল .toString () কল করুন।

দ্রষ্টব্য: স্ট্রিংগুলি প্রায়শই হ্যাশ কী হিসাবে ব্যবহৃত হয় তাই এটি অপরিবর্তনীয় হওয়ার কারণ that's


এটি পরিবর্তনীয় বা অপরিবর্তনীয় কিনা তা প্রাসঙ্গিক নয়। =কোনও রেফারেন্সে কখনই শ্রেণি নির্বিশেষে এটি যে বিষয়টিকে নির্দেশ করতে ব্যবহৃত তা প্রভাবিত করে না।
newacct

2

স্ট্রিং জাভাতে একটি বিশেষ শ্রেণি। এটি থ্রেড সেফ যার অর্থ "একবার স্ট্রিং ইনস্ট্যান্স তৈরি হয়ে গেলে স্ট্রিং ইনস্ট্যান্সের সামগ্রীটি কখনই পরিবর্তিত হবে না"।

এখানে যা চলছে তা এখানে

 zText += "foo";

প্রথমে, জাভা সংকলক zText স্ট্রিং উদাহরণটির মান পাবে, তারপরে একটি নতুন স্ট্রিং উদাহরণ তৈরি করবে যার মান zText "foo" সংযোজন। সুতরাং আপনি জানেন যে zText পয়েন্টে যে উদাহরণটি পরিবর্তন হয় না। এটি সম্পূর্ণ নতুন ঘটনা। আসলে, এমনকি স্ট্রিং "ফু" একটি নতুন স্ট্রিং উদাহরণ। সুতরাং, এই বিবৃতিটির জন্য, জাভা দুটি স্ট্রিং উদাহরণ তৈরি করবে, একটি হ'ল "foo", অন্যটি zText অ্যাপেন্ড "foo" এর মান। নিয়মটি সহজ: স্ট্রিং উদাহরণের মান কখনই পরিবর্তন করা হবে না।

পদ্ধতি ফিল স্ট্রিংয়ের জন্য, আপনি প্যারামিটার হিসাবে একটি স্ট্রিংবাফার ব্যবহার করতে পারেন, বা আপনি এটির মতো এটি পরিবর্তন করতে পারেন:

String fillString(String zText) {
    return zText += "foo";
}

... যদিও আপনি এই কোড অনুসারে 'ফিল স্ট্রিং' সংজ্ঞায়িত করতে চাইলে আপনার সত্যিকার অর্থে এটি আরও উপযুক্ত নাম দেওয়া উচিত!
স্টিফেন সি

হ্যাঁ. এই পদ্ধতির নাম "অ্যাপেন্ডস্ট্রিং" বা আরও কিছু করা উচিত।
ডিপ নাইটটাইউ


1

এটি স্ট্রিংবফার ব্যবহার করে

public class test {
 public static void main(String[] args) {
 StringBuffer zText = new StringBuffer("");
    fillString(zText);
    System.out.println(zText.toString());
 }
  static void fillString(StringBuffer zText) {
    zText .append("foo");
}
}

আরও ভাল স্ট্রিংবিল্ডার ব্যবহার করুন

public class test {
 public static void main(String[] args) {
 StringBuilder zText = new StringBuilder("");
    fillString(zText);
    System.out.println(zText.toString());
 }
  static void fillString(StringBuilder zText) {
    zText .append("foo");
}
}

1

স্ট্রিং জাভাতে অপরিবর্তনীয়। আপনি বিদ্যমান স্ট্রিং আক্ষরিক / অবজেক্টটি পরিবর্তন / পরিবর্তন করতে পারবেন না।

স্ট্রিং s = "হ্যালো"; গুলি = S + "হাই";

এখানে পূর্ববর্তী রেফারেন্সগুলি নতুন উল্লেখের দ্বারা প্রতিস্থাপন করা হবে "হ্যালোইউ" এর মান নির্দেশ করে।

যাইহোক, পরিবর্তন আনার জন্য আমাদের কাছে স্ট্রিংবিল্ডার এবং স্ট্রিংবফার রয়েছে।

স্ট্রিংবিল্ডার s = নতুন স্ট্রিংবিল্ডার (); s.append ( "হাই");

এটি একই রেফারেন্সে নতুন মান "হাই" যুক্ত করে। //


0

অ্যারন দিগুলার এখন পর্যন্ত সেরা উত্তর রয়েছে। তার দ্বিতীয় বিকল্পের একটি প্রকরণটি হল কমার ল্যাং লাইব্রেরি সংস্করণ 3+ এর মোড়ক বা ধারক শ্রেণীর মিউটেবলঅবজেক্টটি ব্যবহার করা:

void fillString(MutableObject<String> c) { c.setValue(c.getValue() + "foo"); }

আপনি ধারক শ্রেণীর ঘোষণাটি সংরক্ষণ করুন। অপূর্ণতা কমন্স ল্যাং লিবের একটি নির্ভরতা। তবে এই লিবিতে বেশ কার্যকর কার্যকারিতা রয়েছে এবং প্রায় কোনও বড় প্রকল্প আমি এটি ব্যবহার করে কাজ করেছি।


0

জাভাতে রেফারেন্স দিয়ে কোনও বস্তু (স্ট্রিং সহ) পাস করার জন্য, আপনি এটি পার্শ্ববর্তী অ্যাডাপ্টারের সদস্য হিসাবে পাস করতে পারেন। জেনেরিক সহ একটি সমাধান এখানে রয়েছে:

import java.io.Serializable;

public class ByRef<T extends Object> implements Serializable
{
    private static final long serialVersionUID = 6310102145974374589L;

    T v;

    public ByRef(T v)
    {
        this.v = v;
    }

    public ByRef()
    {
        v = null;
    }

    public void set(T nv)
    {
        v = nv;
    }

    public T get()
    {
        return v;
    }

// ------------------------------------------------------------------

    static void fillString(ByRef<String> zText)
    {
        zText.set(zText.get() + "foo");
    }

    public static void main(String args[])
    {
        final ByRef<String> zText = new ByRef<String>(new String(""));
        fillString(zText);
        System.out.println(zText.get());
    }
}

0

আরও কৌতূহল কারও জন্য

class Testt {
    static void Display(String s , String varname){
        System.out.println(varname + " variable data = "+ s + " :: address hashmap =  " + s.hashCode());
    }

    static void changeto(String s , String t){
        System.out.println("entered function");
        Display(s , "s");
        s = t ;
        Display(s,"s");
        System.out.println("exiting function");
    }

    public static void main(String args[]){
        String s =  "hi" ;
        Display(s,"s");
        changeto(s,"bye");
        Display(s,"s");
    }
}

এখন এই উপরের কোডটি চালিয়ে আপনি দেখতে পাচ্ছেন hashcodesস্ট্রিং ভেরিয়েবলের সাথে কীভাবে ঠিকানা পরিবর্তন হয়। changetos পরিবর্তন করা হলে একটি নতুন অবজেক্টটি ভেরিয়েবলের জন্য বরাদ্দ করা হয়

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