कोटलिन में एक वर्ग और वस्तु के बीच अंतर


98

मैं कोटलिन के लिए नया हूं और हाल ही में जावा से एक साधारण फाइल को कोटलिन में बदल दिया है। मैं सोच रहा हूं कि एंड्रॉइड कनवर्टर ने मेरे जावा वर्ग को कोटलिन ऑब्जेक्ट में क्यों बदल दिया।

जावा:

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 ...
}

किसी भी सहायता का स्वागत है, धन्यवाद।

जवाबों:


96

एक कोटलिन वस्तु एक वर्ग की तरह है जिसे तत्काल नहीं बनाया जा सकता है इसलिए इसे नाम से बुलाया जाना चाहिए। (प्रति स्थिर वर्ग)

एंड्रॉइड कनवर्टर ने देखा कि आपकी कक्षा में केवल एक स्थिर विधि थी, इसलिए उसने इसे कोटलिन ऑब्जेक्ट में बदल दिया।

इसके बारे में और अधिक पढ़ें यहाँ: http://petersommerhoff.com/dev/kotlin/kotlin-for-java-devs/##ject


165

इस पर कोटलिन का प्रलेखन बहुत अच्छा है, इसलिए इसे पढ़ने के लिए स्वतंत्र महसूस करें।

इस प्रश्न के लिए चुना गया उत्तर इसकी व्याख्या में कुछ खराब वाक्यांश है, और आसानी से लोगों को गुमराह कर सकता है। उदाहरण के लिए, एक ऑब्जेक्ट "प्रति वर्ग एक स्थिर वर्ग" नहीं है, बल्कि यह है 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():।

समतुल्य जावा कोड Kotlin उत्पन्न होगा:

कोटलिन जावा बाइट कोड के लिए संकलित करता है, लेकिन अगर हम उपरोक्त संकलित कोटलिन कोड को जावा कोड में संकलित करते हैं तो यह है:

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% इंटरऑपरेबल है, कभी-कभी आप कुछ एपीआई या फ़ील्ड को इस तरह से उजागर करना चाहेंगे जो पढ़ने के लिए जावा के लिए अच्छा हो। ऐसा करने के लिए, आप @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

एक वस्तु एक सिंगलटन है। इसका उपयोग करने के लिए आपको कोई उदाहरण बनाने की आवश्यकता नहीं है।

एक वर्ग का उपयोग करने के लिए तत्काल किया जाना चाहिए

उसी तरह जो जावा में आप Math.sqrt (2) कह सकते हैं और आपको sqrt का उपयोग करने के लिए Math उदाहरण बनाने की आवश्यकता नहीं है, Kotlin में आप इन विधियों को रखने के लिए एक ऑब्जेक्ट बना सकते हैं, और वे प्रभावी रूप से स्थिर हैं।

यहाँ कुछ जानकारी है:

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

IntelliJ जाहिर तौर पर काफी स्मार्ट रही है ताकि आपको एक वस्तु की जरूरत का पता चल सके क्योंकि आपके पास केवल स्थिर जावा तरीके हैं।


रुको, लेकिन अगर मेरी कक्षा Humanमें एक स्थिर इंट फील्ड है Population, तो कोटलिन में कैसा लगेगा? companion object { @JvmField val Population; }या कुछ और?
Squirrelkiller

3

इसके अलावा, आप ऑब्जेक्ट घोषणा के बिना कार्यों को परिभाषित कर सकते हैं। उदाहरण के लिए बस inkt फ़ाइल:

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

और यह फ़ंक्शन पैकेज से संबंधित है जहां .kt फ़ाइल घोषित की गई है। आप इसके बारे में यहाँ और अधिक पढ़ सकते हैं https://kotlinlang.org/docs/reference/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.
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.