চূড়ান্ত অসুস্থ সংজ্ঞায়িত হয়?


186

প্রথমত, একটি ধাঁধা: নিম্নলিখিত কোডটি কী মুদ্রণ করে?

public class RecursiveStatic {
    public static void main(String[] args) {
        System.out.println(scale(5));
    }

    private static final long X = scale(10);

    private static long scale(long value) {
        return X * value;
    }
}

উত্তর:

0

নীচে Spoilers।


আপনি যদি Xস্কেল (দীর্ঘ) এবং নতুন সংজ্ঞাতে মুদ্রণ করেন X = scale(10) + 3তবে প্রিন্টগুলি X = 0তখনই হবে X = 3। এই যে মানেX অস্থায়ীভাবে সেট 0এবং পরে সেট করা আছে 3। এটি লঙ্ঘন final!

চূড়ান্ত সংশোধকটির সংমিশ্রণে স্থির সংশোধকও ধ্রুবককে সংজ্ঞায়িত করতে ব্যবহৃত হয়। চূড়ান্ত সংশোধকটি নির্দেশ করে যে এই ক্ষেত্রের মান পরিবর্তন করতে পারে না

উৎস: https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html [জোর যুক্ত করা হয়েছে]


আমার প্রশ্ন: এটি কি বাগ? কি finalসংজ্ঞায়িত?


আমি যে কোডটিতে আগ্রহী সেগুলি এখানে Xদুটি আলাদা মান নির্ধারিত হয়েছে: 0এবং 3। আমি এটি লঙ্ঘন বলে বিশ্বাস করি final

public class RecursiveStatic {
    public static void main(String[] args) {
        System.out.println(scale(5));
    }

    private static final long X = scale(10) + 3;

    private static long scale(long value) {
        System.out.println("X = " + X);
        return X * value;
    }
}

এই প্রশ্নটি জাভা স্ট্যাটিক চূড়ান্ত ক্ষেত্রের সূচনা আদেশের সম্ভাব্য সদৃশ হিসাবে চিহ্নিত করা হয়েছে । আমি বিশ্বাস করি যে এই প্রশ্নটি নয় অন্য প্রশ্ন ঠিকানাগুলি আরম্ভের ক্রম যেহেতু সদৃশ যখন আমার প্রশ্ন সঙ্গে মিলিত একটি আবর্তনশীল আরম্ভের ঠিকানাগুলি finalট্যাগ। অন্য প্রশ্ন থেকে একা, আমি বুঝতে সক্ষম হব না কেন আমার প্রশ্নের কোডটি ত্রুটি করে না।

আর্নেস্তো যে আউটপুটটি পায় তা দেখে এটি স্পষ্টভাবে স্পষ্ট: যখন aট্যাগ হয় finalতখন সে নিম্নলিখিত আউটপুট পায়:

a=5
a=5

যা আমার প্রশ্নের মূল অংশকে জড়িত করে না: একটি finalপরিবর্তনশীল কীভাবে তার পরিবর্তনশীল পরিবর্তন করে?


17
Xসদস্যকে রেফারেন্স দেওয়ার এই উপায়টি সুপার ক্লাস কনস্ট্রাক্টর শেষ হওয়ার আগে সাবক্লাস সদস্যকে উল্লেখ করার মতো, এটি আপনার সমস্যা এবং সংজ্ঞা নয় final
দানিু

4
জেএলএস থেকে:A blank final instance variable must be definitely assigned (§16.9) at the end of every constructor (§8.8) of the class in which it is declared; otherwise a compile-time error occurs.
ইভান

1
@ ইভান, এটি ধ্রুবক সম্পর্কে নয় তবে উদাহরণ পরিবর্তনশীল সম্পর্কে। তবে আপনি কি অধ্যায়টি যুক্ত করতে পারেন?
এক্সেলএইচ

9
ঠিক যেমন একটি নোট: উত্পাদনের কোডে এগুলির কোনও কিছুই করবেন না। যদি কেউ জেএলএসে দুর্বলতাগুলি ব্যবহার করতে শুরু করে তবে এটি সবার জন্য বিভ্রান্তিকর।
জাবুজার্ড

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

উত্তর:


217

একটি খুব আকর্ষণীয় সন্ধান। এটি বুঝতে আমাদের জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন ( জেএলএস) খনন করতে হবে ) ।

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


ক্লাস ভেরিয়েবল এবং ডিফল্ট মান

নিম্নলিখিত উদাহরণটি একবার দেখুন:

private static Object x;

public static void main(String[] args) {
    System.out.println(x); // Prints 'null'
}

আমরা স্পষ্টভাবে কোনও মান নির্ধারণ করি নি x, যদিও এটি নির্দেশ করে null, এটির ডিফল্ট মান। এটি তুলনা করুন §4.12.5 :

ভেরিয়েবলের প্রাথমিক মান

প্রতিটি শ্রেণি ভেরিয়েবল , উদাহরণ পরিবর্তনশীল, বা অ্যারের উপাদান তৈরি করা হলে এটি একটি ডিফল্ট মান দিয়ে শুরু করা হয় ( §15.9 , §15.10.2 )

নোট করুন যে এটি কেবল আমাদের উদাহরণের মতো এই ধরণের ভেরিয়েবলগুলির জন্য ধারণ করে। এটি স্থানীয় ভেরিয়েবলের জন্য ধারণ করে না, নিম্নলিখিত উদাহরণটি দেখুন:

public static void main(String[] args) {
    Object x;
    System.out.println(x);
    // Compile-time error:
    // variable x might not have been initialized
}

একই জেএলএস অনুচ্ছেদ থেকে:

একটি স্থানীয় ভেরিয়েবল ( §14.4 , .114.14 ) ব্যবহারের আগে স্পষ্টভাবে একটি মান দিতে হবে, হয় কোনও আরম্ভের ( §14.4 ) বা অ্যাসাইনমেন্ট ( .215.26 ) দ্বারা, এমনভাবে যাতে নির্দিষ্ট কার্যনির্বাহী ( § the 16 (ডিফিনেট অ্যাসাইনমেন্ট) )।


চূড়ান্ত পরিবর্তনশীল

এখন আমরা §4.12.4final থেকে এক নজরে দেখুন :

চূড়ান্ত চলক

একটি পরিবর্তনশীল ঘোষণা করা যেতে পারে চূড়ান্ত । একটি চূড়ান্ত ভেরিয়েবল কেবল একবার নির্ধারিত হতে পারে । এটি একটি সংকলন-সময় ত্রুটি হয় যদি কোনও চূড়ান্ত ভেরিয়েবলকে অ্যাসাইনমেন্টের আগে অবিলম্বে অবিলম্বে নিযুক্ত না করা হয় ( §16 (ডিফিনেট অ্যাসাইনমেন্ট) )।


ব্যাখ্যা

এখন আপনার উদাহরণে ফিরে আসছি, সামান্য পরিবর্তিত:

public static void main(String[] args) {
    System.out.println("After: " + X);
}

private static final long X = assign();

private static long assign() {
    // Access the value before first assignment
    System.out.println("Before: " + X);

    return X + 1;
}

এটি আউটপুট

Before: 0
After: 1

আমরা যা শিখেছি তা প্রত্যাহার করুন। পদ্ধতির ভিতরে assignভেরিয়েবল বরাদ্দX করা হয়নি এখনো একটি মান। সুতরাং, এটি তার ডিফল্ট মানটির দিকে নির্দেশ করে যেহেতু এটি একটি শ্রেণি পরিবর্তনশীল এবং জেএলএস অনুসারে এই পরিবর্তনগুলি সর্বদা তাত্ক্ষণিকভাবে তাদের ডিফল্ট মানগুলিতে নির্দেশ করে (স্থানীয় ভেরিয়েবলের বিপরীতে)। assignপদ্ধতির পরে Xচলকটির মান নির্ধারিত হয় 1এবং এর কারণে finalআমরা এটিকে আর পরিবর্তন করতে পারি না। সুতরাং নিম্নলিখিত কারণে কাজ করে না final:

private static long assign() {
    // Assign X
    X = 1;

    // Second assign after method will crash
    return X + 1;
}

জেএলএসে উদাহরণ

@ অ্যান্ড্রুকে ধন্যবাদ জানিয়ে আমি একটি জেএলএস অনুচ্ছেদ পেয়েছি যা ঠিক এই দৃশ্যের অন্তর্ভুক্ত করে, এটি এটি প্রদর্শিতও করে।

তবে প্রথমে একবার দেখে নেওয়া যাক

private static final long X = X + 1;
// Compile-time error:
// self-reference in initializer

কেন এই অনুমতি দেওয়া হচ্ছে না, যেখানে পদ্ধতি থেকে অ্যাক্সেস রয়েছে? Look8.3.3একবার দেখুন যা ক্ষেত্রটিতে অ্যাক্সেস সীমাবদ্ধ থাকলে যদি ক্ষেত্রটি এখনও আরম্ভ না করা হয় talks

এটি শ্রেণি ভেরিয়েবলের জন্য প্রাসঙ্গিক কিছু বিধি তালিকাবদ্ধ করে:

fশ্রেণি বা ইন্টারফেসে ঘোষিত শ্রেণীর ভেরিয়েবলের সাধারণ নাম দ্বারা একটি রেফারেন্সের জন্য C, এটি a সংকলন-সময় ত্রুটি যদি :

  • রেফারেন্সটি একটি বর্গ পরিবর্তনীয় প্রারম্ভিক Cবা এর একটি স্ট্যাটিক আরম্ভকারীতে উপস্থিত হয়C ( §8.7 ) ; এবং

  • প্রারম্ভিক হয় আরম্ভকারীর মধ্যে প্রদর্শিত হয় f নিজস্ব ডিক্লেয়ারের আরম্ভকারীতে বা ডিক্লেকারের বাম দিকে একটি বিন্দুতে উপস্থিত হয় f; এবং

  • রেফারেন্স কোনও অ্যাসাইনমেন্ট এক্সপ্রেশনটির বাম দিকে নেই ( .215.26 ) ; এবং

  • অভ্যন্তরীণতম শ্রেণি বা ইন্টারফেসটি রেফারেন্সটি ঘিরে রয়েছে C

এটা সহজ, X = X + 1 নিয়মের দ্বারা ধরা পড়ে, পদ্ধতিটি অ্যাক্সেস পায় না। এমনকি তারা এই দৃশ্যের তালিকা তৈরি করে একটি উদাহরণ দেয়:

পদ্ধতি দ্বারা অ্যাক্সেসগুলি এইভাবে চেক করা হয় না, তাই:

class Z {
    static int peek() { return j; }
    static int i = peek();
    static int j = 1;
}
class Test {
    public static void main(String[] args) {
        System.out.println(Z.i);
    }
}

আউটপুট উত্পাদন করে:

0

কারণ জন্য সূচনাকারী পরিবর্তনশীল iব্যবহার অ্যাক্সেস করতে বর্গ পদ্ধতি উঁকি ভেরিয়েবলের মান jসামনে jতার পরিবর্তনশীল সূচনাকারী দ্বারা সক্রিয়া করা হয়েছে, যে সময়ে আপনার এটা এখনও তার ডিফল্ট মান আছে ( §4.12.5 )।


1
@ অ্যান্ড্রু হ্যাঁ, শ্রেণি পরিবর্তনশীল, ধন্যবাদ। হ্যাঁ, এটি কার্যকর হবে যদি এমন কোনও অতিরিক্ত নিয়ম না থাকে যা এই ধরণের অ্যাক্সেসকে সীমাবদ্ধ করে: .38.3.3ক্লাস ভেরিয়েবলের জন্য নির্দিষ্ট চারটি পয়েন্ট (প্রথম প্রবেশ) একবার দেখুন) ওপিএস উদাহরণের পদ্ধতি পদ্ধতির সেই নিয়মগুলি ধরা পড়ে না, সুতরাং আমরা Xপদ্ধতিটি থেকে অ্যাক্সেস করতে পারি । আমি কিছু মনে করবে না। এটি কেবল নির্ভর করে যে কীভাবে জেএলএস জিনিসগুলি বিশদে কাজ করতে সংজ্ঞায়িত করে। আমি এর মতো কোডটি কখনই ব্যবহার করব না, এটি কেবল জেএলএসে কিছু নিয়ম ব্যবহার করছে।
জাবুজার্ড

4
সমস্যাটি হল আপনি কনস্ট্রাক্টরের কাছ থেকে উদাহরণগুলি কল করতে পারেন, এমন কিছু যা সম্ভবত অনুমতি দেওয়া উচিত ছিল না। অন্যদিকে, সুপার কল করার আগে স্থানীয়দের অর্পণ করা, যা দরকারী এবং নিরাপদ হবে তা অনুমোদিত নয়। চিত্রে যান.
মনিকা

1
@ অ্যান্ড্রু আপনি সম্ভবত এখানেই একমাত্র প্রকৃতপক্ষে উল্লেখ করেছেন forwards references( এটিও জেএলএসের অংশ)। এই দীর্ঘ উত্তর ছাড়াই এটি এত সহজ স্ট্যাকওভারফ্লো. com
ইউজিন

1
"প্রথম অ্যাসাইনমেন্ট তারপরে রেফারেন্স পরিবর্তন করে।" এক্ষেত্রে এটি কোনও রেফারেন্স টাইপ নয়, তবে একটি আদিম প্রকার।
ফ্যাবিয়ান

1
এই উত্তরটি সঠিক, যদি কিছুটা দীর্ঘ হয়। :-) আমি মনে করি tl; dr হ'ল ওপি এমন একটি টিউটোরিয়াল উদ্ধৃত করেছিল যা বলেছিল যে "[চূড়ান্ত] ক্ষেত্রটি পরিবর্তন করতে পারে না," জেএলএস নয়। যদিও ওরাকলের টিউটোরিয়ালগুলি বেশ ভাল, তারা সমস্ত প্রান্তের কেসগুলি কভার করে না। ওপি-র প্রশ্নের জন্য, আমাদের চূড়ান্ত সম্পর্কিত জেএলএস সংজ্ঞা যেতে হবে - এবং সেই সংজ্ঞা দাবী করে না (যে ওপি যথাযথভাবে চ্যালেঞ্জ করে) যে কোনও চূড়ান্ত ক্ষেত্রের মান কখনই পরিবর্তন করতে পারে না।
ysavit

22

ফাইনালের সাথে এখানে কিছুই করার নেই।

যেহেতু এটি উদাহরণস্বরূপ বা শ্রেণি স্তরের, তাই কোনও কিছু এখনও নিয়োগ না করা থাকলে এটি ডিফল্ট মান ধারণ করে। এই কারণেই আপনি দেখছেন0 ছাড়াই আপনি অ্যাক্সেস করার সময় আপনি ।

যদি আপনি Xসম্পূর্ণ বরাদ্দ না করে অ্যাক্সেস করেন তবে এটি দীর্ঘস্থায়ী মান নির্ধারণ করে যা 0ফলস্বরূপ।


3
এর মধ্যে
মুশকিলটি হ'ল

2
@ অ্যাক্সেলএইচ আমি দেখতে পাচ্ছি এর দ্বারা আপনি কী বোঝাতে চেয়েছেন। তবে সেভাবেই এটির কাজ করা উচিত অন্যথায় বিশ্বের পতন;)।
সুরেশ আত্তা

20

একটি বাগ না।

যখন প্রথম কলটি কল করা scaleহবে

private static final long X = scale(10);

এটি মূল্যায়নের চেষ্টা করে return X * valueXএখনও একটি মান নির্ধারণ করা হয়নি এবং সুতরাং একটি এর জন্য ডিফল্ট মান longব্যবহৃত হয় (যা 0)।

কোড মূল্যায়ণ যে লাইন সুতরাং X * 10অর্থাত 0 * 10যা 0


8
আমি মনে করি না এটি ওপি বিভ্রান্ত করে। কি বিভ্রান্তি হয় X = scale(10) + 3। যেহেতু X, যখন পদ্ধতি থেকে রেফারেন্স করা হয় 0। কিন্তু পরে এটি হয় 3। সুতরাং ওপি মনে করে Xযে দুটি পৃথক মান নির্ধারিত হয়েছে, যার সাথে বিরোধ হবে final
জাবুজার্ড

4
@Zabuza এই সঙ্গে "ব্যাখ্যা করা হয় না এটা নির্ণয় করা চেষ্টা করে return X * valueXনা একটি মান অ্যাসাইন করা হয়েছে এখনো এবং সেই কারণে একটি জন্য ডিফল্ট মান লাগে longযা 0 "? এটি Xডিফল্ট মান সহ নির্ধারিত হয় না বলা হয় তবে এটি X"প্রতিস্থাপন" হয় (দয়া করে সেই শব্দটি উদ্ধৃত করবেন না)) ডিফল্ট মান দ্বারা।
এক্সেলএইচ

14

এটি মোটেও কোনও ত্রুটি নয়, কেবল এটিকে ফরোয়ার্ড রেফারেন্সগুলির অবৈধ রূপ নয়, আরও কিছু নয়।

String x = y;
String y = "a"; // this will not compile 


String x = getIt(); // this will compile, but will be null
String y = "a";

public String getIt(){
    return y;
}

এটি কেবল স্পেসিফিকেশন দ্বারা অনুমোদিত।

আপনার উদাহরণটি ধরতে, এটি ঠিক এটি যেখানে এটি মেলে:

private static final long X = scale(10) + 3;

আপনি একটি করছ এগিয়ে রেফারেন্স থেকে scaleআগের মত বলেন, কোন ভাবেই বেআইনী নয়, কিন্তু আপনি ডিফল্ট মান পেতে পারবেন X। আবার, এটি স্পেক দ্বারা অনুমোদিত (আরও নিখুঁতভাবে এটি নিষিদ্ধ নয়), সুতরাং এটি ঠিক কাজ করে


ভাল উত্তর! আমি কেন উত্সাহী দ্বিতীয়টি কেস সংকলনের অনুমতি দেয় না তা সম্পর্কে আগ্রহী । চূড়ান্ত ক্ষেত্রের "অসঙ্গতিপূর্ণ" অবস্থা দেখার একমাত্র উপায় কি?
অ্যান্ড্রু টবিলকো

@ অ্যান্ড্রু এটি আমাকে অনেক সময় বিরক্ত করেছে, আমি ভাবতে আগ্রহী যে এটি এর সি ++ বা সি এটি করেছে (ধারণা না করে এটি সত্য)
ইউজিন

@ অ্যান্ড্রু: কারণ অন্যথায় করণীয় হ'ল টুরিংয়ের অসম্পূর্ণতা উপপাদ্যটি সমাধান করা।
জোশুয়া

9
@ জোশুয়া: আমি মনে করি আপনি এখানে বিভিন্ন ধারণার মিশ্রণ করছেন: (১) থামার সমস্যা, (২) সিদ্ধান্তের সমস্যা, (৩) গোডেলের অসম্পূর্ণতা উপপাদ্য এবং (৪) টুরিং-সম্পূর্ণ প্রোগ্রামিং ভাষা। সংকলক লেখকগণ সমস্যাটি সমাধান করার চেষ্টা করেন না "এটি ব্যবহারের আগে এই পরিবর্তনটি অবশ্যই নির্ধারিত হয়?" নিখুঁত কারণ যে সমস্যাটি হলটিং সমস্যা সমাধানের সমতুল্য, এবং আমরা জানি আমরা এটি করতে পারি না।
এরিক লিপার্ট

4
@ এরিকলিপার্ট: হাহা উফ! অসম্পূর্ণতা এবং থামানো সমস্যাটি আমার মনে একই জায়গা দখল করে।
জোশুয়া

4

ক্লাস স্তরের সদস্যদের ক্লাস সংজ্ঞার মধ্যে কোডে প্রাথমিক করা যেতে পারে। সংকলিত বাইটকোড শ্রেণীর সদস্যদের ইনলাইনটি আরম্ভ করতে পারে না। (তাত্ক্ষণিক সদস্যদের একইভাবে পরিচালনা করা হয় তবে এটি প্রদত্ত প্রশ্নের জন্য প্রাসঙ্গিক নয়))

যখন কেউ নীচের মতো কিছু লিখেন:

public class Demo1 {
    private static final long DemoLong1 = 1000;
}

উত্পন্ন বাইকোড নিম্নলিখিতগুলির মতো হবে:

public class Demo2 {
    private static final long DemoLong2;

    static {
        DemoLong2 = 1000;
    }
}

প্রারম্ভিককরণের কোডটি একটি স্ট্যাটিক ইনিশিয়ালাইজারের মধ্যে স্থাপন করা হয় যা শ্রেণি লোডার যখন প্রথম শ্রেণীর লোড হয় তখন চালিত হয়। এই জ্ঞানের সাথে, আপনার মূল নমুনা নিম্নলিখিতগুলির মতো হবে:

public class RecursiveStatic {
    private static final long X;

    private static long scale(long value) {
        return X * value;
    }

    static {
        X = scale(10);
    }

    public static void main(String[] args) {
        System.out.println(scale(5));
    }
}
  1. জেভিএম জার এর এন্ট্রি পয়েন্ট হিসাবে পুনরাবৃত্ত স্ট্যাটিক লোড করে।
  2. শ্রেণীর সংজ্ঞা লোড করা হলে শ্রেণি লোডার স্থিতিশীল আরম্ভকারী চালায়।
  3. ইনিশিয়ালাইজারটি ক্ষেত্রটি scale(10)বরাদ্দ করতে ফাংশনটি কল করেstatic finalX
  4. scale(long)যখন বর্গ আংশিকভাবে এর uninitialized মান পড়া সক্রিয়া করা হয় ফাংশন সঞ্চালিত হয়X লম্বা অথবা 0 ডিফল্ট যা।
  5. এর মান 0 * 10নির্ধারিত হয়X এবং শ্রেণি লোডার সম্পূর্ণ হয়।
  6. জেভিএম পাবলিক স্ট্যাটিক অকার্যকর মেইন মেথড কলিং পরিচালনা করে scale(5)যা বর্তমানে X0 টির 0 পুনরুদ্ধার মান দ্বারা 5 কে গুন করে ।

স্থিতিশীল চূড়ান্ত ক্ষেত্রটি কীওয়ার্ডের Xদ্বারা রাখা গ্যারান্টি সংরক্ষণ করে কেবল একবার নির্ধারিত হয় final। অ্যাসাইনমেন্টে 3 যোগ করার পরবর্তী প্রশ্নের জন্য, উপরের 5 ধাপে মূল্যায়ন হয়ে যায় 0 * 10 + 3যার মূল্য 3এবং মূল পদ্ধতিটি 3 * 5যার ফলস্বরূপ মুদ্রণ করবে 15


3

কোনও বস্তুর অবিশ্বাস্য ক্ষেত্র পড়ার ফলে সংকলনের ত্রুটি হওয়া উচিত। দুর্ভাগ্যক্রমে জাভা, এটি না।

আমি মনে করি কেন এটি মামলার মূল কারণটি কীভাবে বস্তুগুলি তাত্ক্ষণিকভাবে এবং নির্মাণ করা হয় তার সংজ্ঞায়নের গভীরে "লুকানো" যদিও আমি স্ট্যান্ডার্ডের বিশদ জানি না।

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

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