কোটলিনে গেটার্স এবং সেটটার্স


89

জাভাতে, উদাহরণস্বরূপ, আমি নিজে থেকে লেখক লিখতে পারি (আইডিই দ্বারা উত্পন্ন) বা লম্বোকে @ গেটারের মতো টিকা ব্যবহার করতে পারি - যা বেশ সহজ ছিল।

কোটলিনের ডিফল্টরূপে গিটার এবং সেটটার রয়েছে । তবে সেগুলি কীভাবে ব্যবহার করবেন তা আমি বুঝতে পারি না।

আমি এটি তৈরি করতে চাই, যাক - জাভা এর মতো:

private val isEmpty: String
        get() = this.toString() //making this thing public rises an error: Getter visibility must be the same as property visibility.

সুতরাং কিভাবে getters কাজ করবেন?

উত্তর:


148

গ্রাহকরা এবং সেটটারগুলি কোটলিনে স্বয়ংক্রিয়ভাবে উত্পন্ন হয়। আপনি যদি লিখেন:

val isEmpty: Boolean

এটি নিম্নলিখিত জাভা কোডের সমান:

private final Boolean isEmpty;

public Boolean isEmpty() {
    return isEmpty;
}

আপনার ক্ষেত্রে প্রাইভেট অ্যাক্সেস মডিফায়ার রিডানড্যান্ট - ইম্পটিটি ডিফল্টরূপে ব্যক্তিগত হয় এবং কেবল কোনও গেটর দ্বারা এটি অ্যাক্সেস করতে পারে। আপনি যখন নিজের অবজেক্টের ইম্পিটি সম্পত্তি পাওয়ার চেষ্টা করবেন তখন আপনি পান পদ্ধতিটিকে আসল বলবেন। কোটলিনে গেটার / সেটটারদের আরও বোঝার জন্য: নীচের দুটি কোডের নমুনা সমান:

var someProperty: String = "defaultValue"

এবং

var someProperty: String = "defaultValue"
    get() = field
    set(value) { field = value }

এছাড়াও আমি এটি উল্লেখ করতে চাই যে thisএকজন গিটার আপনার সম্পত্তি নয় - এটি শ্রেণীর উদাহরণ। যদি আপনি কোনও গেটর বা সেটারে ক্ষেত্রের মানটিতে অ্যাক্সেস পেতে চান তবে আপনি fieldএটির জন্য সংরক্ষিত শব্দটি ব্যবহার করতে পারেন :

val isEmpty: Boolean
  get() = field

যদি আপনি কেবল জনসাধারণের অ্যাক্সেসে একটি পদ্ধতি পেতে চান - আপনি এই কোডটি লিখতে পারেন:

var isEmpty: Boolean
    private set 

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


17
In your case the private access modifier is redundantকীভাবে? কোটলিন ডকের বক্তব্য ডিফল্ট সংশোধক সর্বজনীন। কোটলিংআং.আর.ওডকস

@ কিছুই হ্যাঁ এটি পাবলিক ফিল্ডের মতো মনে হচ্ছে না, তবে হুডের অধীনে আপনি
গেটর

val isEmpty: Booleanএমপিটি এখনও আরম্ভ করা হয়নি বলে সংকলন করবে না, তাই না? সবে শুরু কোটলিন শিখতে। এছাড়াও, কি হচ্ছে get() = field?
শুভম এ।

4
@ ছায়ারার valকোনও
সেটটার

@ ক্রোডার হ্যাঁ আপনি ঠিক বলেছেন, আমি অবশ্যই ভুল পড়েছি ... মন্তব্য মুছে ফেলা হয়েছে। এটি দেখানোর জন্য ধন্যবাদ
চিয়ারা

30

সম্পত্তি অ্যাক্সেসর ভিজিবিলিটি সংশোধক সম্পর্কে নিয়মগুলি নিম্নলিখিত:

  • গেটারের দৃশ্যমানতা varএবং valসম্পত্তি হ'ল সম্পত্তির দৃশ্যমানতার সাথে সমান হওয়া উচিত , সুতরাং আপনি কেবল স্পষ্টভাবে সম্পত্তি সংশোধককে নকল করতে পারেন, তবে এটি অতিরিক্ত কাজ নয়:

    protected val x: Int
        protected get() = 0 // No need in `protected` here.
    
  • এর সেটার দৃশ্যমানতা varসম্পত্তি হওয়া উচিত একই বা কম প্রশ্রয়ের সম্পত্তি দৃশ্যমানতা চেয়ে:

    protected var x: Int
        get() = 0
        private set(x: Int) { } // Only `private` and `protected` are allowed.
    

কোটলিনে সর্বদা গেটার এবং সেটারের মাধ্যমে সম্পত্তিগুলি অ্যাক্সেস করা হয়, সুতরাং জাভা-র মতো অ্যাক্সেসরদের privateসাথে সম্পত্তি তৈরি করার কোনও প্রয়োজন নেই public- এর ব্যাকিং ফিল্ড (যদি উপস্থিত থাকে) ইতিমধ্যে ব্যক্তিগত। সুতরাং, সম্পত্তি অ্যাক্সেসরগুলিতে দৃশ্যমানতার সংশোধনকারীগুলিকে কেবল সেটারের দৃশ্যমানতা কম অনুমতি দেওয়ার জন্য ব্যবহৃত হয়:

  • ব্যাকিং ফিল্ড এবং ডিফল্ট অ্যাক্সেসর সহ একটি সম্পত্তি জন্য:

    var x = 0 // `public` by default
        private set
    
  • ব্যাকিং ফিল্ড ছাড়াই কোনও সম্পত্তির জন্য:

    var x: Int // `public` by default
        get() = 0
        protected set(value: Int) { }
    

একটি সেট এবং বিভিন্ন ধরণের পেতে পারেন? x কিছু সমান সেট "Some String"এবং ফিরে বলুন 11, স্ট্রিং এর দৈর্ঘ্য ,?
ক্যারেল

@ কারেল, না, এখন পর্যন্ত, এই ব্যবহারের ক্ষেত্রে সমর্থন করা যায় না: কোনও সম্পত্তির অ্যাক্সেসরদের সম্পত্তির হুবহু ধরণের কাজ করা উচিত। একটি পৃথক ব্যাকিং সম্পত্তি
হটকি

ডার্ন, কোটলিন পাইথনের খুব কাছাকাছি যে আপনি মনে করেন এটি টাইপ করা স্মরণ করিয়ে দিলে এটি ঠিক কাজ করবে ... এবং নিজের গলা কেটে ফেলবে।
ক্যারেল

অ্যাক্সেস পরিবর্তনকারীদের জন্য ধন্যবাদ। আমি privateএকটি পরিবর্তনশীল থেকে অপসারণ করেছি , এবং এটি গেটর সহ অন্য শ্রেণীর থেকে অ্যাক্সেসযোগ্য হয়ে উঠেছে।
কুলমাইন্ড

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

15

1) উদাহরণ ডিফল্ট setterএবং getterজন্য সম্পত্তি firstName Kotlin মধ্যে

class Person {
    var firstName: String = ""
            get() = field       // field here ~ `this.firstName` in Java or normally `_firstName` is C#
            set(value) {
                field = value
            }

}

ব্যবহার

val p = Person()
p.firstName = "A"  // access setter
println(p.firstName) // access getter (output:A)

যদি আপনার setterবা getterহয় ঠিক একই উপরে, আপনি এটি কারণ এটি অপসারণ করতে পারেন অপ্রয়োজনীয়

2) কাস্টম সেটটার এবং গেটরের উদাহরণ।

const val PREFIX = "[ABC]"

class Person {

    // set: if value set to first name have length < 1 => throw error else add prefix "ABC" to the name
    // get: if name is not empty -> trim for remove whitespace and add '.' else return default name
    var lastName: String = ""
        get() {
            if (!field.isEmpty()) {
                return field.trim() + "."
            }
            return field
        }
        set(value) {
            if (value.length > 1) {
                field = PREFIX + value
            } else {
                throw IllegalArgumentException("Last name too short")
            }
        }
}

ব্যবহার

val p = Person()
p.lastName = "DE         " // input with many white space
println(p.lastName)  // output:[ABC]DE.
p.lastName = "D" // IllegalArgumentException since name length < 1

আরও
আমি জাভা থেকে কোটলিন শিখতে শুরু করি তাই আমি বিভ্রান্তি বোধ করছি fieldএবং propertyকারণ জাভাতে নেই property
কিছু অনুসন্ধানের পরে, আমি দেখতে পাচ্ছি fieldএবং propertyকোটলিনে সি # এর মতো দেখাচ্ছে ( একটি ক্ষেত্র এবং কোনও সম্পত্তির মধ্যে পার্থক্য কী? )

এখানে কিছু প্রাসঙ্গিক পোস্ট যা জাভা এবং কোটলিন সম্পর্কে fieldএবং propertyএর বিষয়ে আলোচনা করে ।
জাভাতে কি সি # টির মতো কিছু রয়েছে?
https://blog.kotlin-academy.com/kotlin-programmer-d অভিধান-field-vs-property-30ab7ef70531

আমি ভুল হলে আমাকে সংশোধন করুন। আশা করি এটি সাহায্য করবে


আপনাকে ধন্যবাদ, এটি সত্যই আমাকে সাহায্য করে!
marcode_ely

8

কোটলিনে প্রাপ্তিটি ডিফল্টরূপে সর্বজনীন, তবে আপনি সেটারটিকে বেসরকারীতে সেট করতে পারেন এবং শ্রেণীর ভিতরে একটি পদ্ধতি ব্যবহার করে মান সেট করতে পারেন। এটার মত.

/**
* Created by leo on 17/06/17.*/

package foo
class Person() {
var name: String = "defaultValue"
               private set

fun foo(bar: String) {
    name = bar // name can be set here
       }
}

fun main(args: Array<String>) {
  var p = Person()
  println("Name of the person is ${p.name}")
  p.foo("Jhon Doe")
  println("Name of the person is ${p.name}")
}

5

আপনি আরও তথ্যের জন্য এই টিউটোরিয়ালটি দেখতে পারেন:

তবুও অ্যান্ড্রয়েড বিকাশকারীদের জন্য আরেকটি কোটলিন টিউটোরিয়াল

সম্পত্তি

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

class Contact(var number: String) {

   var firstName: String? = null
   var lastName: String? = null
   private val hasPrefix : Boolean
       get() = number.startsWith("+")

}

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

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


0

এখানে কোটলিন প্রাপ্ত এবং সেটারের একটি বাস্তব, বাস্তব বিশ্বের উদাহরণ (আরও বিশদ এখানে দেখুন ):

// Custom Getter
val friendlyDescription get(): String {
    val isNeighborhood = district != null
    var description = if (isNeighborhood) "Neighborhood" else "City"
    description += " in"
    if (isNeighborhood) {
        description += " $city,"
    }
    province?.let {
        if (it.isNotEmpty()) {
            description += " $it,"
        }
    }
    description += " $country"
    return description
}

print(myLocation.friendlyDescription) // "Neighborhood in Denver, Colorado, United States"


// Custom Setter
enum class SearchResultType {
    HISTORY, SAVED, BASIC
}

private lateinit var resultTypeString: String

var resultType: SearchResultType
    get() {
        return enumValueOf(resultTypeString)
    }
    set(value) {
        resultTypeString = value.toString()
    }

result.resultType = SearchResultType.HISTORY
print(result.resultTypeString) // "HISTORY"

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