কোটলিন ব্যাকিং ফিল্ড কীসের জন্য?


93

জাভা বিকাশকারী হিসাবে, ব্যাকিং ফিল্ডের ধারণাটি আমার কাছে কিছুটা বিদেশী। প্রদত্ত:

class Sample {
    var counter = 0 // the initializer value is written directly to the backing field
    set(value) {
        if (value >= 0) field = value
    }
}

এই ব্যাকিং ফিল্ডটি কীসের জন্য ভাল? কোটলিন ডক্স বলেছে:

কোটলিনের শ্রেণিতে ক্ষেত্র থাকতে পারে না। যাইহোক, কখনও কখনও কাস্টম অ্যাকসেসরগুলি ব্যবহার করার সময় একটি ব্যাকিং ফিল্ড থাকা প্রয়োজন

কেন? সেটার অভ্যন্তরে নিজস্ব বৈশিষ্ট্যগুলির নাম ব্যবহার করে কী পার্থক্য রয়েছে eg

class Sample {        
    var counter = 0
    set(value) {
        if (value >= 0) this.counter = value // or just counter = value?
    }
}

18
সেটে সম্পত্তিটি নিজেরাই ব্যবহার করার ফলে একটি অন্তহীন পুনরাবৃত্তি ঘটবে কারণ সম্পত্তিটির জন্য কিছু মান নির্ধারণ করা সর্বদা সেটারকে কল করবে।
ছত্রাকজনিত

4
@ স্ট্রলোক আমার খারাপ .... আমি ধরে নিচ্ছিলাম যে কোটলিনের this.counter = valueডকস পড়ার সময় জাভা সমতুল্য একই রকম ছিল ।
যুধিস্তির আর্য

4
এই নিবন্ধটি ফিল্ড বনাম সম্পত্তি জন্য।
অবিনাশ

উত্তর:


86

কারণ, আপনার fieldকীওয়ার্ড না থাকলে বলুন , আপনি আসলে মানটি সেট করতে / পেতে সক্ষম হবেন না get()বা set(value)। এটি আপনাকে কাস্টম অ্যাক্সেসরগুলিতে ব্যাকিং ফিল্ড অ্যাক্সেস করতে সক্ষম করে।

এটি আপনার নমুনার সমতুল্য জাভা কোড:

class Sample {
    private int counter = 0;
    public void setCounter(int value) {
        if (value >= 0) setCounter(value);
    }
    public int getCounter() {
        return counter;
    }
}

স্পষ্টতই এটি ভাল নয়, কারণ সেটারটি কেবল নিজের মধ্যেই একটি অনিবার্য পুনরাবৃত্তি, কোনও কিছুই পরিবর্তন করে না। কোটলিনে মনে রাখবেন যখনই আপনি লিখবেন foo.bar = valueএটির পরিবর্তে একটি সেটার কলটিতে অনুবাদ করা হবে PUTFIELD


সম্পাদনা: জাভাতে ক্ষেত্র রয়েছে এবং কোটলিনের বৈশিষ্ট্য রয়েছে যা ক্ষেত্রগুলির চেয়ে বরং উচ্চ স্তরের ধারণা।

এখানে দুটি ধরণের বৈশিষ্ট্য রয়েছে: একটি ব্যাকিং ফিল্ড সহ, একটি ছাড়া।

ব্যাকিং ফিল্ড সহ একটি সম্পত্তি ক্ষেত্রের আকারে মান সংরক্ষণ করবে। এই ক্ষেত্রটি মেমোরিতে স্টোরেজ মানকে সম্ভব করে তোলে। এই জাতীয় সম্পত্তির উদাহরণ হ'ল সম্পত্তি firstএবং এর secondবৈশিষ্ট্য Pair। সেই সম্পত্তিটি ইন-মেমরির উপস্থাপনাটির পরিবর্তন করবে Pair

ব্যাকিং ফিল্ড ব্যতীত কোনও সম্পত্তি তার মানটিকে সরাসরি স্মৃতিতে সঞ্চয় না করে অন্য উপায়ে সংরক্ষণ করতে হবে। এটি অন্য বৈশিষ্ট্য থেকে, বা, অবজেক্ট থেকে নিজেই গুণতে হবে। এই জাতীয় সম্পত্তির উদাহরণ হ'ল এর indicesএক্সটেনশন সম্পত্তি List, যা কোনও ক্ষেত্র দ্বারা সমর্থনযোগ্য নয়, তবে sizeসম্পত্তির উপর ভিত্তি করে একটি গণিত ফলাফল । সুতরাং এটি Listজাভির স্ট্যাটিকালি টাইপড হওয়ার কারণে (যা এটি মোটেই করতে পারে না) এর ইন-মেমরি উপস্থাপনাকে পরিবর্তন করবে না ।


উত্তর করার জন্য ধন্যবাদ! আমার খারাপ ... আমি ধরে নিচ্ছিলাম যে this.counter = valueএটি জাভা সমতুল্য with
যুধিস্তির আর্য

কোথাও নথিভুক্ত? ধন্যবাদ :)
অ্যালস্টন

: @Alston, এখানে ডকুমেন্টেশন kotlinlang.org/docs/reference/properties.html#backing-fields
Yamashiro মধ্যে Rion

4
প্রচুর ধোঁয়াটে ব্যাখ্যা। কেন আমরা কেবল স্পষ্টভাবে বলতে পারি না যে fieldএটি একটি পয়েন্টার বা বিদ্যমান সদস্যের ভেরিয়েবলের রেফারেন্সের মতো। যেহেতু get/setঅবিলম্বে অনুসরণ করে counter, মূলশব্দটি fieldএকটি উল্লেখ counter। ঠিক?
ইগেনফিল্ড

@typelogic এই উত্তরটি সবচেয়ে বেশি জাভা / জেএস ব্যাকগ্রাউন্ড সহ প্রোগ্রামারদের জন্য উপযুক্ত (পিছনে কোনও কোটলিন / নেটিভ নেই), সি / সি ++ নয়। আপনি যেটিকে अस्पष्ट মনে করছেন তা হ'ল কিছু লোকের জন্য রুটি এবং মাখন।
Glee8e

32

প্রাথমিকভাবে, আমারও এই ধারণাটি বুঝতে খুব কঠিন সময় হয়েছিল। সুতরাং আমি এটি একটি উদাহরণের সাহায্যে আপনাকে ব্যাখ্যা করি।

এই কোটলিন বর্গ বিবেচনা করুন

class DummyClass {
    var size = 0;
    var isEmpty
        get() = size == 0
        set(value) {
            size = size * 2
        }
}

এখন আমরা কোডটির দিকে নজর দিই, আমরা দেখতে পাচ্ছি যে এর 2 টি বৈশিষ্ট্য রয়েছে - size( - ডিফল্ট অ্যাক্সেসর সহ) এবং isEmpty(কাস্টম অ্যাকসেসর সহ)। তবে এটির কেবল 1 ক্ষেত্র রয়েছে size। এটির জন্য কেবল 1 টি ক্ষেত্র রয়েছে তা বুঝতে, আসুন এই শ্রেণীর জাভা সমতুল্য দেখি।

সরঞ্জামগুলিতে যান -> কোটলিন -> অ্যান্ড্রয়েড স্টুডিওতে কোটলিন বাইটকোড দেখান। ডিকম্পাইল ক্লিক করুন।

   public final class DummyClass {
   private int size;

   public final int getSize() {
      return this.size;
   }

   public final void setSize(int var1) {
      this.size = var1;
   }

   public final boolean isEmpty() {
      return this.size == 0;
   }

   public final void setEmpty(boolean value) {
      this.size *= 2;
   }
}

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


এখন আসুন কাস্টম গেটর এবং isEmptyপ্রোপার্টিটির সেটটারটি সরান ।

class DummyClass {
    var size = 0;
    var isEmpty = false
}

এবং উপরের শ্রেণীর জাভা সমতুল্য

public final class DummyClass {
   private int size;
   private boolean isEmpty;

   public final int getSize() {
      return this.size;
   }

   public final void setSize(int var1) {
      this.size = var1;
   }

   public final boolean isEmpty() {
      return this.isEmpty;
   }

   public final void setEmpty(boolean var1) {
      this.isEmpty = var1;
   }
}

এখানে আমরা উভয় ক্ষেত্র sizeএবং isEmptyisEmptyএকটি ব্যাকিং ফিল্ড কারণ isEmptyসম্পত্তির জন্য প্রাপ্তি এবং সেটটার এর উপর নির্ভর করে।


4
ভাল ব্যাখ্যা। আপনাকে ধন্যবাদ
সোনু সঞ্জীব

4
সত্যই, ব্যাখ্যার জন্য ধন্যবাদ। আমিও জাভা থেকে কোটলিন এসেছি, এবং সম্পত্তিগুলির ধারণাটি আমার কাছে নতুন। তবে আমি এটি বুঝতে পেরেছি, আপনাকে এবং গাইডকে ধন্যবাদ। :)
ইয়ামাসিরো

আল্লাহ আপনাকে মঙ্গল করুন।
Andrea Cioccarelli

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

9

ব্যাকিং ফিল্ডগুলি বৈধতা চালানোর জন্য বা রাজ্যের পরিবর্তনে ইভেন্টগুলি ট্রিগার করার জন্য ভাল। আপনি কোন জাভা সেটার / গেটারে কোড যুক্ত করেছেন তার কথা ভেবে দেখুন। ব্যাকিং ফিল্ডগুলি অনুরূপ পরিস্থিতিতে কার্যকর হবে। আপনি যখন সেটার / গেটরগুলির উপর নিয়ন্ত্রণ বা দৃশ্যমানতার প্রয়োজন হবে তখন আপনি ব্যাকিং ফিল্ডগুলি ব্যবহার করবেন।

ক্ষেত্রের নাম নিজেই ক্ষেত্রটি বরাদ্দ করার সময়, আপনি প্রকৃতপক্ষে সেটারটি (অর্থাত্ set(value)) আহ্বান করছেন । আপনার যে উদাহরণটি আছে, this.counter = valueসেট না করা (মান) মধ্যে পুনরাবৃত্তি হবে যতক্ষণ না আমরা আমাদের স্ট্যাককে উপচে ফেলেছি। fieldসেটার (বা গেটর) কোডটি বাইপাস করে ব্যবহার করা হচ্ছে ।


দুঃখিত, তবে আপনার ব্যাখ্যাটিতে এমন পদ রয়েছে যা ব্যাখ্যা করা দরকার। এবং তারপরে, আপনি প্রথমে একটি জাভা দৃশ্যের উদ্ধৃতি দিয়েছিলেন এবং তারপরে হঠাৎ সতর্কতা ছাড়াই আপনি একটি প্রকৃত কোটলিন বিবৃতিতে লাইন স্যুইচ করেন। শব্দ Kotlin প্রয়োজন fieldনেই C # এর তাই আমরা একটি আপনি এখানে উদাহৃত চেয়ে ভাল ব্যাখ্যা প্রয়োজন।
ইগেনফিল্ড

2

আমার বোঝার ব্যবহার করছে ক্ষেত্র সম্পত্তি এর মান একটি রেফারেন্স হিসাবে আইডেন্টিফায়ার পেতে বা সেট , যখন আপনি পরিবর্তন করতে বা সম্পত্তি মান ব্যবহার করতে চান পেতে বা সেট

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

class A{
    var a:Int=1
        get(){return field * 2}    // Similiar to Java: public int geta(){return this.a * 2}
        set(value) {field = value + 1}
}

তারপরে:

var t = A()
println(t.a)    // OUTPUT: 2, equal to Java code: println(t.a * 2)
t.a = 2         // The real action is similar to Java code: t.a = t.a +1
println(t.a)    // OUTPUT: 6, equal to Java code: println(t.a * 2)

0

পরিভাষা backing fieldরহস্যে ভরা। ব্যবহৃত কীওয়ার্ডটি হ'ল fieldget/setপদ্ধতি, অবিলম্বে সদস্য পরিবর্তনশীল যে সম্পর্কে পাশে অনুসরণ করা পেতে বা সেট এই দরজা প্রতিরক্ষামূলক পদ্ধতি প্রক্রিয়া মাধ্যমে। fieldশব্দ মাত্র সদস্য পরিবর্তনশীল করা হয় যে বোঝায় সেট বা পেতে । বর্তমান Kotlin সময়ে, আপনি ভিতরে সরাসরি সদস্য পরিবর্তনশীল পাঠাতে পারেন না পেতে বা সেট প্রতিরক্ষামূলক দরজা পদ্ধতি, কারণ এটি দুর্ভাগ্যবশত অসীম recursion করতে হবে কারণ এটি পুনরায় ডাকা হবে পেতে বা সেট এবং এইভাবে গভীর নরক মধ্যে নিচে রানটাইম LEDs।

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

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