কোটলিনে ধ্রুবকরা - তাদের তৈরি করার প্রস্তাবিত উপায় কী?


165

কোটলিনে কনস্ট্যান্ট তৈরির প্রস্তাব দেওয়া হয় কীভাবে? নামকরণ কনভেনশন কী? আমি নথিতে এটি খুঁজে পাইনি।

companion object {
    //1
    val MY_CONST = "something"

    //2
    const val MY_CONST = "something"

    //3
    val myConst = "something"
}

বা ...?


4
আপনি যদি public static finalজাভাতে কোনও ক্ষেত্রের সাথে সম্পর্কিত কিছু চান তবে const valআপনার সহযোগী অবজেক্টে ব্যবহার করুন । আপনি যদি কোনও private static finalক্ষেত্র এবং পাবলিক গেটর চান তবে valআপনার সহযোগী অবজেক্টে ব্যবহার করুন ।
মাইকেল

2
এখানে এমন ব্লগপোস্ট যা কোটলিনে
কোথাও-

চেকআউট এই নিবন্ধটি । এটি সম্পর্কিত বিভিন্ন পারফরম্যান্স ট্রেড-অফ সহ আপনি বিভিন্নভাবে আপনার ধ্রুবকগুলি সঞ্চয় করতে পারেন এমন একটি দুর্দান্ত ওভারভিউ দেয়।
22-29

উত্তর:


132

কোটলিনে, আপনি যদি ক্লাসে ব্যবহৃত স্থানীয় কনস্ট্যান্টগুলি তৈরি করতে চান তবে আপনি নীচের মত এটি তৈরি করতে পারেন

val MY_CONSTANT = "Constants"

এবং আপনি যদি জাভাতে পাবলিক স্ট্যাটিক ফাইনালের মতো কোটলিনে একটি সার্বজনীন ধ্রুবক তৈরি করতে চান, আপনি নিম্নলিখিত হিসাবে এটি তৈরি করতে পারেন।

companion object{

     const val MY_CONSTANT = "Constants"

}

3
আমি কীভাবে এটি একটি নতুন ফাইলের মতো আলাদা ফাইলে ব্যবহার করব Constants.ktবা কীভাবে করব?
নাভিদ আব্বাস

2
আমি ধ্রুবকগুলির জন্য একটি ফাইল ব্যবহার করি। আমার সমস্ত ধৈর্য সেখানে রাখুন।
ফিলিটি_উইজার্ড

2
আপনার দরকার নেই বলে companion objectআমি মনে করি @ পাইওটারপো উত্তরটি গ্রহণযোগ্য হওয়া উচিত
চিয়ারা

@ ছিয়ারা সহযোগী বস্তু (এবং এর ঘের বন্ধক শ্রেণি) শীর্ষ স্তরের ঘোষণার বিপরীতে একটি নাম স্থান হিসাবে কাজ করে। আমি মনে করি উভয় উত্তর পরিস্থিতির উপর নির্ভর করে বোধগম্য হতে পারে।
জিংক্স

@ জিংক্স হ্যাঁ, আপনার এটির প্রয়োজনের সাথে একটি নেমস্পেস যুক্ত করার জন্য আপনার একটি বক্তব্য রয়েছে। : +1:
চায়ারা

118

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

public class DbConstants {
    companion object {
        val TABLE_USER_ATTRIBUTE_EMPID = "_id"
        val TABLE_USER_ATTRIBUTE_DATA = "data"
    }

পরিবর্তে স্থির সংজ্ঞা দিন object

প্রস্তাবিত অনুশীলন :

object DbConstants {
        const val TABLE_USER_ATTRIBUTE_EMPID = "_id"
        const val TABLE_USER_ATTRIBUTE_DATA = "data"
}

এবং এগুলি বিশ্বব্যাপী অ্যাক্সেস করুন: DbConstants.TABLE_USER_ATTRIBUTE_EMPID


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

1
@ এরউইন বলিউড আমার মনে হয় @ সুदेशের বক্তব্যটি হল যখন কাঠামোর একমাত্র উদ্দেশ্য কিছু ধ্রুবক মানের জন্য একটি নাম স্থান সরবরাহ করা হয় তখন শ্রেণি-মোড়ক-সঙ্গী-অবজেক্ট নকশাটি ব্যবহার করা উচিত নয়। তবে যদি আপনার কাঠামোটি তাত্ক্ষণিকভাবে প্রয়োজন হয় এবং কয়েকটি সংযুক্ত করেও থাকে তবে এটি const valএকটি companion objectসঠিক বলে ঘোষণা করে ।
এরি লেসেনস্কি

7
@ ইরভিনবোল্ট: সুদেশ ঠিক আছে, সহকর্মী অবজেক্টগুলির জন্য বাইটকোড উত্পন্ন হুডের নীচে গেটারদের সাথে অতিরিক্ত অবজেক্ট তৈরি করা জড়িত। Decompiled kotlin উদাহরণ সঙ্গে একটি ভাল ব্যাখ্যার জন্য দেখুন blog.egorand.me/where-do-i-put-my-constants-in-kotlin
ডমিনিক

2
ধন্যবাদ @ ডমিনিক, এটি একটি বিস্তৃত নিবন্ধ, আমি প্রত্যেককেই যারা এটি গভীরতার সাথে বুঝতে চায় তাদের কাছে এটির পরামর্শ দিই, এমন অনেকগুলি ক্ষেত্রে রয়েছে যেখানে কোটলিন সাবপটিমাল বাইটকোড তৈরি করে, জেটব্রেইনগুলি এ জাতীয় অনেকগুলি কার্য সম্পাদন সংক্রান্ত বাগ সমাধান করেছে ... আলোচনায় নজর রাখবে .কোটলিংলং.অর্গ.এইরকম অনেকগুলি অন্তর্নিহিত দিক সম্পর্কে আপনাকে অবহিত করা হবে।
সুदेश

1
আমি আজ আপনার উত্তর থেকে অনেক কিছু শিখেছি @ সুদেশ ধন্যবাদ!
রাখি ধাওয়ালে

34

প্রথমত, কোটলিনে নামকরণ কনভেনশন জাভা (যেমন: MY_CONST_IN_UPPERCASE) এর তুলনায় একই।

আমি এটি কীভাবে তৈরি করব?

1. শীর্ষ স্তরের মান হিসাবে (প্রস্তাবিত)

আপনাকে কেবল আপনার বর্গের ঘোষণার বাইরে আপনার কনস্টিকেট রাখতে হবে ।

দুটি সম্ভাবনা : আপনার শ্রেণীর ফাইলে আপনার কনস্টের কথা ঘোষণা করুন (আপনার কনস্টের সাথে আপনার শ্রেণীর সাথে সুস্পষ্ট সম্পর্ক রয়েছে)

private const val CONST_USED_BY_MY_CLASS = 1

class MyClass { 
    // I can use my const in my class body 
}

এই বিশ্বব্যাপী কনস্ট্যান্টগুলি কোথায় সংরক্ষণ করতে হবে এমন একটি ডেডিকেটেড কনস্ট্যান্টস.কেটি ফাইল তৈরি করুন (এখানে আপনি আপনার প্রকল্পটি জুড়ে আপনার কনস্টটি ব্যাপকভাবে ব্যবহার করতে চান):

package com.project.constants
const val URL_PATH = "https:/"

তারপরে আপনাকে যেখানে এটি প্রয়োজন সেখানে এটি আমদানি করতে হবে:

import com.project.constants

MyClass {
    private fun foo() {
        val url = URL_PATH
        System.out.print(url) // https://
    }
}

২. এটি কোনও সহকারী বস্তুতে ঘোষণা করুন (বা কোনও বস্তুর ঘোষণা)

এটি অনেক কম ক্লিনার কারণ হুডের নীচে, যখন বাইটোকড তৈরি করা হয় তখন একটি অকেজো বস্তু তৈরি হয়:

MyClass {
    companion object {
        private const val URL_PATH = "https://"
        const val PUBLIC_URL_PATH = "https://public" // Accessible in other project files via MyClass.PUBLIC_URL_PATH
    }
}

আরও খারাপ যদি আপনি এটিকে কনস্টের পরিবর্তে ভাল হিসাবে ঘোষণা করেন (সংকলক একটি অকেজো বস্তু + একটি অকেজো ফাংশন উত্পন্ন করবে):

MyClass {
    companion object {
        val URL_PATH = "https://"
    }
}

বিঃদ্রঃ :

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

@JvmField val foo = Foo()

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। যাইহোক কোনও ক্ষেত্রে যেমন: সর্বজনীন স্ট্যাটিক চূড়ান্ত প্যাটার্ন REGEX_NOTEMPTY = প্যাটার্ন ডটকমপিলে ("। +") ????
Xan

23

সংকলনের সময় পরিচিত মানগুলি (এবং আমার মতে উচিত) ধ্রুবক হিসাবে চিহ্নিত করা যেতে পারে।

নামকরণের কনভেনশনগুলিতে জাভা কোডগুলি অনুসরণ করা উচিত এবং জাভা কোড থেকে ব্যবহার করার সময় যথাযথভাবে দৃশ্যমান হওয়া উচিত (এটি কোনওভাবে সঙ্গী অবজেক্টগুলির সাথে অর্জন করা শক্ত, তবে যাইহোক)।

সঠিক ধ্রুবক ঘোষণাগুলি হ'ল:

const val MY_CONST = "something"
const val MY_INT = 1

3
Naming conventions should follow Java ones- কেন?
জোডিমোরো

3
আন্তঃলিঙ্গটি মসৃণ করার জন্য কোটলিন সাধারণত জাভা কনভেনশনগুলি ডিফল্ট অনুসারে অনুসরণ করে।
zsmb13

4
ডকুমেন্টেশনে এর মতো নির্দিষ্ট করা হয়েছে @ জোডিমোরো
নিল

2
@ নিল, তা নয়।
জোডিমোরো

13
সেই লিঙ্কে আমি পোস্ট করেছি তারা বলেছেIf in doubt, default to the Java Coding Conventions
নীল

16

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

সুতরাং, এই ক্ষেত্রে, এটি হওয়া উচিত:

const val MY_CONST = "something"

এবং তারপরে আপনি ধ্রুবকটি ব্যবহার করে আমদানি করতে পারেন:

import package_name.MY_CONST

আপনি এই লিঙ্কটি উল্লেখ করতে পারেন


13
ধ্রুবক অবশ্যই তাদের সাথে সম্পর্কিত ক্লাসে থাকতে হবে। যদি আপনি একটি 'কনস্ট্যান্টস' শ্রেণি তৈরি করেন তবে শেষ পর্যন্ত এটির অভ্যন্তরে শত শত স্থির হয়ে যাবে। পে: MAX_WIDTH, MAX_HEIGHT অবশ্যই স্ক্রিন শ্রেণিতে থাকতে হবে যাতে আপনি এটিকে যুক্তিযুক্তভাবে অ্যাক্সেস করতে পারেন: স্ক্রিন.ম্যাক্স_উইথ এবং আপনার কনস্ট্যান্টস.এসসিআরএন_ম্যাক্স_উইডিএইচটি লাগাতে হবে না যা কনস্ট্যান্টস.এসসিআর_ম্যাক্স_ডাব্লু এবং কনস্ট্যান্টস সহ নকল করা হবে। তারা সিটিআরএল + স্থান স্বয়ংক্রিয়রূপে ধাক্কা দিলে কয়েকশ / থোজান লাইনের নিচে স্ক্রল করে। গম্ভীরভাবে: এটি করবেন না।
অনিচ্ছাকরণে

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

1
@ হারবার্ট 7474 আমি দুঃখিত তবে আমার সাথে আপনার একমত হতে হবে না। আমি একমত যে কখনও কখনও এটি খুঁজে পাওয়া কঠিন হতে পারে কোনটি, তবে একটি ধ্রুবক স্থানে সর্বদা এটির সাথে সম্পর্কিত যা শ্রেণি হওয়া উচিত। এবং এগুলি এলোমেলোভাবে সংখ্যায় ফাইলগুলিতে সেভ করা সর্বোত্তম উপায় নয় যদি আপনি পরে এগুলি পুনরুদ্ধার করতে চান ... আপনি যুক্তি দিবেন যে এগুলি এলোমেলোভাবে সংরক্ষণ করা হবে না তবে প্যাকেজগুলির মধ্যে ধ্রুবকগুলি সম্পর্কিত, তবে এটি কেবল অজুহাত তাদের ক্লাসে না রাখুন যার সাথে তারা সম্পর্কিত, শেষদিকে, তাদের জায়গা ...
inigoD

4
যদি একটি ধ্রুবক সত্যই বিশ্বব্যাপী হয় বা এর বিশাল ব্যাপ্তি থাকে ... যেমন সমস্ত প্যাকেজ জুড়ে একটি টীকা ব্যবহারের মান, বা একাধিক কন্ট্রোলার, ইত্যাদি দ্বারা প্রাপ্ত শিরোনামের নাম, তবে এটি একটি "ধ্রুবক তৈরি করা সম্পূর্ণরূপে গ্রহণযোগ্য বর্গ "যে সঠিকভাবে স্কোপ করা হয়। যাইহোক, ধ্রুবকগুলি কেবলমাত্র নির্দিষ্ট প্রসঙ্গে ব্যবহৃত হয়, সেই প্রসঙ্গে পড়তে হবে এবং প্রাসঙ্গিক শ্রেণিতে ঘোষণা করা উচিত।
নেফথিস 76

@ নেফথিস 7676 ঠিক যেমনটি একটি নোট হিসাবে, " যেমন সমস্ত প্যাকেজ জুড়ে ব্যবহৃত টীকাগুলির জন্য মূল্য হিসাবে ", আমি বলব ধ্রুবকগুলির জন্য সেরা স্থানটি টীকাগুলির শ্রেণিতে।
স্লাও

8

আপনি যদি const val valName = valValueশ্রেণীর নামটির আগে রাখেন তবে এটি একটি তৈরি করে

public static final YourClass.Ktযে public static finalমান আছে।

কোটলিন :

const val MY_CONST0 = 0
const val MY_CONST1 = 1
data class MyClass(var some: String)

জাভা পচে যায়:

public final class MyClassKt {
    public static final int MY_CONST0 = 0;
    public static final int MY_CONST1 = 1;
}
// rest of MyClass.java

এটা কি সত্য? এই পদ্ধতির সাথে কারও অভিজ্ঞতা আছে?
স্কট বিগস

5
class Myclass {

 companion object {
        const val MYCONSTANT = 479
}

আপনার কাছে দুটি পছন্দ আছে আপনি constকীওয়ার্ডটি ব্যবহার করতে পারেন বা ব্যবহার করতে পারেন @JvmFieldযা এটি জাভাটির স্থির চূড়ান্ত ধ্রুবক তৈরি করে।

class Myclass {

     companion object {
           @JvmField val MYCONSTANT = 479
    }

আপনি যদি @JvmFieldটীকাটি ব্যবহার করেন তবে এটি সংকলন করার পরে ধ্রুবকটি আপনার জন্য যেভাবে জাভাতে ডাকবেন তা আপনার জন্য স্থাপন করা হবে।
আপনি যখন জাভাতে এটি ডাকতেন ঠিক তেমনই সংকলক আপনার জন্য প্রতিস্থাপন করবে যখন আপনি সঙ্গীকে কোডে ধ্রুবক হিসাবে কল করবেন।

যাইহোক, আপনি যদি কনস্ট কীওয়ার্ডটি ব্যবহার করেন তবে ধ্রুবকের মানটি ইনলাইন হয়। ইনলাইন দ্বারা আমার অর্থ এটি সংকলনের পরে আসল মানটি ব্যবহৃত হয়।

তাই সংক্ষেপে এখানে সংকলকটি আপনার জন্য কি করবে:

//so for @JvmField:

Foo var1 = Constants.FOO;

//and for const:

Foo var1 = 479

5

কোটলিন স্থিতিশীল এবং ধ্রুবক মান এবং পদ্ধতি ঘোষণা করে

object MyConstant {

@JvmField   // for access in java code 
val PI: Double = 3.14

@JvmStatic // JvmStatic annotation for access in java code
fun sumValue(v1: Int, v2: Int): Int {
    return v1 + v2
}

}

অ্যাক্সেস মান কোথাও

val value = MyConstant.PI
val value = MyConstant.sumValue(10,5)

1
কীভাবে বিশ্বব্যাপী বা স্থির পদ্ধতির সংজ্ঞা দেওয়া যায়?
সামাদ তালুকদার

@ সামাদতালুকদার কোটলিনে এটি মজাদার যোগফল হবে (ভি 1: ইন্ট, ভি 2: ইনট): ইনট {রিটার্ন ভি 1 + ভি 2}
শমু

5

মত val, constকীওয়ার্ডের সাথে সংজ্ঞায়িত পরিবর্তনগুলি অপরিবর্তনীয়। এখানে পার্থক্যটি হ'ল constসংকলন-সময়ে পরিচিত ভেরিয়েবলগুলির জন্য ব্যবহৃত হয়।

একটি ভেরিয়েবল ঘোষণা constকরা অনেকটা staticজাভাতে কীওয়ার্ড ব্যবহার করার মতো ।

আসুন দেখুন কীভাবে কোটলিনে কনস্টের ভেরিয়েবল ঘোষণা করবেন:

const val COMMUNITY_NAME = "wiki"

এবং জাভাতে লিখিত অ্যানালগাস কোডটি হ'ল:

final static String COMMUNITY_NAME = "wiki";

উপরের উত্তরগুলিতে যুক্ত করা -

@JvmField কোটলিন সংকলককে এই সম্পত্তির জন্য গিটার / সেটটার উত্পন্ন না করার জন্য এবং ক্ষেত্র হিসাবে প্রকাশ করতে নির্দেশ দেওয়ার জন্য ব্যবহার করা হবে।

 @JvmField
 val COMMUNITY_NAME: "Wiki"

স্থির ক্ষেত্র

কোনও নামকৃত বস্তুতে বা কোনও সহযোগী অবজেক্টে ঘোষিত কোটলিন বৈশিষ্ট্যগুলির স্থায়ী ব্যাকিং ক্ষেত্রগুলি হয় সেই নামকৃত বস্তুতে বা ক্লাসে সহকর্মী অবজেক্টযুক্ত ক্লাসে থাকবে।

সাধারণত এই ক্ষেত্রগুলি ব্যক্তিগত হয় তবে সেগুলি নিম্নলিখিতগুলির একটির মধ্যে প্রকাশ করা যেতে পারে:

  • @JvmField টীকা;
  • lateinit পরিবর্তক;
  • const পরিবর্তক।

আরও বিশদ এখানে - https://kotlinlang.org/docs/references/java-to-kotlin-interop.html#instance-fields


4

উত্তরের কোনওটিতে উল্লেখ করা হয়নি এমন কিছু হ'ল ব্যবহারের ওভারহেড companion objects। আপনি এখানে যেমন পড়তে পারেন , সহযোজনাগুলি আসলে বস্তুগুলি এবং সেগুলি তৈরি করে সংস্থান গ্রহণ করে। তদাতিরিক্ত, প্রতিবার আপনার ধ্রুবকটি ব্যবহার করার সময় আপনাকে একাধিক গিটার ফাংশনের মধ্য দিয়ে যেতে হবে। আপনার যা যা দরকার তা সমস্ত কয়েকটি প্রাথমিক ধ্রুবক হলে আপনি সম্ভবত আরও ভাল পারফরম্যান্সval পেতে এবং এড়ানোর জন্য ব্যবহার করা ভালcompanion object

টি এল; ডিআর; নিবন্ধটি:

সহচর অবজেক্ট ব্যবহার করা আসলে এই কোডটি ঘুরিয়ে দেয়

class MyClass {

    companion object {
        private val TAG = "TAG"
    }

    fun helloWorld() {
        println(TAG)
    }
}

এই কোডের মধ্যে:

public final class MyClass {
    private static final String TAG = "TAG";
    public static final Companion companion = new Companion();

    // synthetic
    public static final String access$getTAG$cp() {
        return TAG;
    }

    public static final class Companion {
        private final String getTAG() {
            return MyClass.access$getTAG$cp();
        }

        // synthetic
        public static final String access$getTAG$p(Companion c) {
            return c.getTAG();
        }
    }

    public final void helloWorld() {
        System.out.println(Companion.access$getTAG$p(companion));
    }
}

তাই এগুলি এড়াতে চেষ্টা করুন।


3

স্থানীয় ধ্রুবক:

const val NAME = "name"

গ্লোবাল ধ্রুবক:

object MyConstants{
    val NAME = "name"
    val ID = "_id"
    var EMAIL = "email"
}

MyConstants.NAME অ্যাক্সেস করুন


1

কোটলিনে ধ্রুবকগুলি সংজ্ঞায়িত করার কয়েকটি উপায় রয়েছে,

সহযোগী অবজেক্ট ব্যবহার করা

    companion object {
        const val ITEM1 = "item1"
        const val ITEM2 = "item2"
    }

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

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

আপনি যখন সঙ্গী অবজেক্টটি ব্যবহার করে আপনার ধ্রুবকগুলি তৈরি করেন এবং পচে যাওয়া বাইকোডটি দেখেন , আপনি নীচের মতো কিছু পাবেন,

  ClassName.Companion Companion = ClassName.Companion.$$INSTANCE;
  @NotNull
  String ITEM1 = "item1";
  @NotNull
  String ITEM2 = "item2";

  public static final class Companion {
     @NotNull
     private static final String ITEM1 = "item1";
     @NotNull
     public static final String ITEM2 = "item2";

     // $FF: synthetic field
     static final ClassName.Companion $$INSTANCE;

     private Companion() {
     }

     static {
        ClassName.Companion var0 = new ClassName.Companion();
        $$INSTANCE = var0;
     }
  }

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

এখন আর একটি উপায় এসেছে, যেখানে আমাদের নীচের মতো সহকর্মী অবজেক্ট ব্যবহার করার দরকার নেই,

object ApiConstants {
      val ITEM1: String = "item1"
 }

আবার যদি আপনি উপরের স্নিপেটের বাইট কোডটির ক্ষয়প্রাপ্ত সংস্করণটি দেখতে পান তবে আপনি এর মতো কিছু খুঁজে পাবেন,

public final class ApiConstants {
     private static final String ITEM1 = "item1";

     public static final ApiConstants INSTANCE;

     public final String getITEM1() {
           return ITEM1;
      }

     private ApiConstants() {
      }

     static {
         ApiConstants var0 = new ApiConstants();
         INSTANCE = var0;
         CONNECT_TIMEOUT = "item1";
      }
    }

এখন আপনি যদি উপরের ডিসকোপিলড কোডটি দেখেন তবে এটি প্রতিটি ভেরিয়েবলের জন্য গেট পদ্ধতি তৈরি করে creating এই গেট পদ্ধতিটি মোটেই প্রয়োজন হয় না।

এই পেতে পদ্ধতি পরিত্রাণ পেতে , আপনি ব্যবহার করা উচিত const আগে Val নিচে মত,

object ApiConstants {
     const val ITEM1: String = "item1"
 }

এখন আপনি যদি উপরের স্নিপেটের পচনশীল কোডটি দেখতে পান তবে এটি আপনার কোডের জন্য সর্বনিম্ন ব্যাকগ্রাউন্ড রূপান্তর হিসাবে পড়তে সহজ হবে easier

public final class ApiConstants {
    public static final String ITEM1 = "item1";
    public static final ApiConstants INSTANCE;

    private ApiConstants() {
     }

    static {
        ApiConstants var0 = new ApiConstants();
        INSTANCE = var0;
      }
    }

তাই এটি ধ্রুবক তৈরির সেরা উপায়।


0

আদিম এবং স্ট্রিংয়ের জন্য:

/** The empty String. */
const val EMPTY_STRING = ""

অন্যান্য ক্ষেত্রে:

/** The empty array of Strings. */
@JvmField val EMPTY_STRING_ARRAY = arrayOfNulls<String>(0)

উদাহরণ:

/*
 * Copyright 2018 Vorlonsoft LLC
 *
 * Licensed under The MIT License (MIT)
 */

package com.vorlonsoft.android.rate

import com.vorlonsoft.android.rate.Constants.Utils.Companion.UTILITY_CLASS_MESSAGE

/**
 * Constants Class - the constants class of the AndroidRate library.
 *
 * @constructor Constants is a utility class and it can't be instantiated.
 * @since       1.1.8
 * @version     1.2.1
 * @author      Alexander Savin
 */
internal class Constants private constructor() {
    /** Constants Class initializer block. */
    init {
        throw UnsupportedOperationException("Constants$UTILITY_CLASS_MESSAGE")
    }

    /**
     * Constants.Date Class - the date constants class of the AndroidRate library.
     *
     * @constructor Constants.Date is a utility class and it can't be instantiated.
     * @since       1.1.8
     * @version     1.2.1
     * @author      Alexander Savin
     */
    internal class Date private constructor() {
        /** Constants.Date Class initializer block. */
        init {
            throw UnsupportedOperationException("Constants.Date$UTILITY_CLASS_MESSAGE")
        }

        /** The singleton contains date constants. */
        companion object {
            /** The time unit representing one year in days. */
            const val YEAR_IN_DAYS = 365.toShort()
        }
    }

    /**
     * Constants.Utils Class - the utils constants class of the AndroidRate library.
     *
     * @constructor Constants.Utils is a utility class and it can't be instantiated.
     * @since       1.1.8
     * @version     1.2.1
     * @author      Alexander Savin
     */
    internal class Utils private constructor() {
        /** Constants.Utils Class initializer block. */
        init {
            throw UnsupportedOperationException("Constants.Utils$UTILITY_CLASS_MESSAGE")
        }

        /** The singleton contains utils constants. */
        companion object {
            /** The empty String. */
            const val EMPTY_STRING = ""
            /** The empty array of Strings. */
            @JvmField val EMPTY_STRING_ARRAY = arrayOfNulls<String>(0)
            /** The part 2 of a utility class unsupported operation exception message. */
            const val UTILITY_CLASS_MESSAGE = " is a utility class and it can't be instantiated!"
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.