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


108

আমি কোটলিনে নতুন এবং সম্প্রতি জাভা থেকে কোটলিনে একটি সাধারণ ফাইল রূপান্তর করেছি। আমি ভাবছি কেন অ্যান্ড্রয়েড রূপান্তরকারী আমার জাভা ক্লাসটি কোটলিন অবজেক্টে বদলেছে?

জাভা:

public class MyClass {
    static public int GenerateChecksumCrc16(byte bytes[]) {

        int crc = 0xFFFF;
        int temp;
        int crc_byte;

        for (byte aByte : bytes) {

            crc_byte = aByte;

            for (int bit_index = 0; bit_index < 8; bit_index++) {

                temp = ((crc >> 15)) ^ ((crc_byte >> 7));

                crc <<= 1;
                crc &= 0xFFFF;

                if (temp > 0) {
                    crc ^= 0x1021;
                    crc &= 0xFFFF;
                }

                crc_byte <<= 1;
                crc_byte &= 0xFF;

            }
        }

        return crc;
    }
}

রূপান্তরিত কোটলিন:

object MyClass {
    fun GenerateChecksumCrc16(bytes: ByteArray): Int {

        var crc = 0xFFFF
        var temp: Int
        var crc_byte: Int

        for (aByte in bytes) {

            crc_byte = aByte.toInt()

            for (bit_index in 0..7) {

                temp = crc shr 15 xor (crc_byte shr 7)

                crc = crc shl 1
                crc = crc and 0xFFFF

                if (temp > 0) {
                    crc = crc xor 0x1021
                    crc = crc and 0xFFFF
                }

                crc_byte = crc_byte shl 1
                crc_byte = crc_byte and 0xFF

            }
        }

        return crc
    }
}

কেন তা হয়নি:

class MyClass {
    ... etc ...
}

যে কোনও সাহায্যের প্রশংসা করা হবে ধন্যবাদ।

উত্তর:


104

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

অ্যান্ড্রয়েড রূপান্তরকারী দেখেছিল যে আপনার ক্লাসে কেবল একটি স্থির পদ্ধতি রয়েছে তাই এটি এটিকে কোনও কোটলিন অবজেক্টে রূপান্তরিত করে।

এটি সম্পর্কে এখানে আরও পড়ুন: http://petersommerhoff.com/dev/kotlin/kotlin-for-java-devs/#objects


173

এ বিষয়ে কোটলিনের ডকুমেন্টেশন বেশ ভাল, তাই এটি পড়তে নির্দ্বিধায়।

এই প্রশ্নের জন্য নির্বাচিত উত্তরের ব্যাখ্যাতে কিছু দুর্বল বাক্যাংশ রয়েছে, এবং সহজেই লোককে বিভ্রান্ত করতে পারে। উদাহরণস্বরূপ, কোনও বস্তু "প্রতি সেচ স্ট্যাটিক ক্লাস" নয়, বরং এটি a static instance of a class that there is only one ofঅন্যথায় সিঙ্গলটন হিসাবে পরিচিত।

সম্ভবত পার্থক্যটি দেখানোর সর্বোত্তম উপায় হ'ল জাভা আকারে পচনশীল কোটলিন কোডটি দেখানো।

কোটলিন বস্তু এবং শ্রেণি:

object ExampleObject {
  fun example() {
  }
}

class ExampleClass {
  fun example() {
  }
}

ব্যবহার করার জন্য ExampleClass, আপনাকে এটির একটি উদাহরণ তৈরি করতে হবে: ExampleClass().example()তবে কোনও বস্তুর সাহায্যে কোটলিন আপনার জন্য এটির একটি একক উদাহরণ তৈরি করে এবং আপনি কখনও এটির নির্মাণকারী হিসাবে অভিহিত করেন না, পরিবর্তে আপনি কেবল এটি ব্যবহার করে স্থির উদাহরণটি অ্যাক্সেস করতে পারেন নাম: ExampleObject.example()

সমতুল্য জাভা কোড কোটলিন উৎপন্ন করবে:

কোটলিন জাভা বাইট কোডে সংকলন করে, তবে আমরা যদি জাভা কোডের উপরের সংকলিত কোটলিন কোডটি বিপরীত করি তবে এটি আমরা পাই:

public final class ExampleObject {
   public static final ExampleObject INSTANCE = new ExampleObject();

   private ExampleObject() { }

   public final void example() {
   }
}

public final class ExampleClass {
   public final void example() {
   }
}

আপনি নিম্নলিখিত উপায়ে কোটলিনে ব্যবহার করবেন:

ExampleObject.example()

যা এর জন্য জাভা বাইট কোডের সমতুল্য সংকলন করবে:

ExampleObject.INSTANCE.example()

কোটলিন objectএস এর সাথে পরিচয় করিয়ে দেয় কেন ?

objectকোটলিনের প্রাথমিক ব্যবহারের ক্ষেত্রটি হ'ল কোটলিন স্থিতিশীল এবং আদিমদের দূরে সরিয়ে দেওয়ার চেষ্টা করে, আমাদেরকে খাঁটি অবজেক্ট ওরিয়েন্টেড ভাষায় ফেলে দেয়। কোটলিন এখনও টুকরো টুকরো staticনীচে ব্যবহার করে এবং আদিম ব্যবহার করে তবে এটি সে ধারণাগুলি আর ব্যবহার করতে ডেভসকে নিরুৎসাহিত করে। পরিবর্তে, এখন কোটলিন স্থির প্রতিস্থাপন সিঙ্গলটন অবজেক্ট উদাহরণগুলির সাথে করে। যেখানে আপনি পূর্বে জাভাতে স্থির ক্ষেত্র ব্যবহার করবেন, কোটলিনে আপনি এখন একটি তৈরি করবেন objectএবং সেই ক্ষেত্রটি এটিতে রাখবেন object

জাভা সহ আন্তঃব্যবহার্যতা:

কোটলিন জাভা সহ 100% আন্তঃযোগযোগ্য, তাই কখনও কখনও আপনি নির্দিষ্ট API বা ক্ষেত্রগুলি এমন উপায়ে প্রকাশ করতে চাইবেন যা জাভা পড়ার পক্ষে সুন্দর। এটি করতে, আপনি @JvmStaticটীকাটি ব্যবহার করতে পারেন । এর সাথে কোনও ক্ষেত্র বা একটি ক্রিয়াকলাপের দ্বারা বর্ননা objectকরে @JvmStatic, এটি স্থির ক্ষেত্রগুলিতে সংকলন করবে যা জাভা আরও সহজে ব্যবহার করতে পারে।

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

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

class ExampleClass {
  companion object {
    // Things that would be static in Java would go here in Kotlin
    private const val str = "asdf"
  }

  fun example() {
    // I can access private variables in my companion object
    println(str)
  }
}

6
সুন্দর ব্যাখ্যা। অনেক ধন্যবাদ.
ড্যানিশ আনসারী

12

একটি বস্তু একটি সিঙ্গলটন is এটি ব্যবহার করার জন্য আপনার কোনও উদাহরণ তৈরি করার দরকার নেই।

কোনও শ্রেণি ব্যবহার করার জন্য তাত্ক্ষণিক হওয়া দরকার

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

এখানে কিছু তথ্য আছে:

https://kotlinlang.org/docs/references/object-declarations.html

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


অপেক্ষা করুন তবে যদি আমার ক্লাসের Humanএকটি স্ট্যাটিক ইনট ফিল্ড থাকে Populationতবে কোটলিনে কেমন লাগবে? companion object { @JvmField val Population; }অথবা অন্যকিছু?
Squirrelkiller

4

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

fun GenerateChecksumCrc16(bytes: ByteArray): Int {
    ...
}

এবং এই ফাংশনটি প্যাকেজের সাথে সম্পর্কিত যেখানে .kt ফাইলটি ঘোষণা করা হয়। আপনি এখানে এ সম্পর্কে আরও পড়তে পারেন https://kotlinlang.org/docs/references/packages.html


1

@ Speirce7 এর উত্তরে বিল্ডিং:

কোটলিনে আসার পরে নিম্নলিখিত কোডটি একটি শ্রেণি এবং একটি অবজেক্টের মধ্যে মৌলিক পার্থক্য দেখায়:

class ExampleClass(){
    fun example(){
            println("I am in the class.")
    }
}

object ExampleObject{
    fun example(){
            println("I am in the object.")
    }
}

fun main(args: Array<String>){
    val exampleClass = ExampleClass() // A class needs to be instantiated.
    exampleClass.example()            // Running the instance of the object.
    ExampleObject.example()           // An object can be thought of as a Singleton and doesn't need any instantiation.
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.