कोटलिन में जावा स्थिर विधियों के समतुल्य क्या है?


618

staticKotlin में कोई कीवर्ड नहीं है ।

staticकोटलिन में जावा विधि का प्रतिनिधित्व करने का सबसे अच्छा तरीका क्या है ?



12
सलाह दी जाती है: कोटलिन ने जावा-शैली के स्टैटिक्स को अधिक बनाए रखने योग्य बनाने के लिए हटा दिया है (हिम्मत से कहता हूं कि 'बेहतर') कोडिंग प्रथाओं। स्थैतिक ग्लोबल्स आमतौर पर ओओपी-प्रतिमान के खिलाफ होते हैं लेकिन वे काफी सुविधाजनक हो सकते हैं। इसलिए, कोटलिन ने हमें साथियों के
निकोलस मिलर

Google के अनुसार, अब एंड्रॉइड डेवलपमेंट के लिए कोटलिन को प्राथमिकता दी जाती है।
AFD

@ NicholasMiller क्यों यह OOP के अनुकूल है? मुझे लगता है कि स्थिर (बॉयलरप्लेट) के आवर्ती नोट के बिना पढ़ना और लिखना आसान है। या कोई और अच्छा कारण है?
तोराबेन जी

जवाबों:


886

आप फ़ंक्शन को "साथी ऑब्जेक्ट" में रखते हैं।

तो इस तरह जावा कोड:

class Foo {
  public static int a() { return 1; }
}

हो जाएगा

class Foo {
  companion object {
     fun a() : Int = 1
  }
}

फिर आप इसे कोटलिन कोड के अंदर से उपयोग कर सकते हैं

Foo.a();

लेकिन जावा कोड के भीतर से, आपको इसे कॉल करना होगा

Foo.Companion.a();

(जो कोटलिन के भीतर से भी काम करता है।)

यदि आपको Companionबिट निर्दिष्ट करना पसंद नहीं है तो आप @JvmStaticएनोटेशन जोड़ सकते हैं या अपने साथी वर्ग का नाम दे सकते हैं।

से डॉक्स :

साथी वस्तुओं

किसी कक्षा के अंदर एक वस्तु घोषणा को साथी कीवर्ड के साथ चिह्नित किया जा सकता है:

class MyClass {
   companion object Factory {
       fun create(): MyClass = MyClass()
   }
}

साथी ऑब्जेक्ट के सदस्यों को केवल क्वालीफायर के रूप में वर्ग नाम का उपयोग करके बुलाया जा सकता है:

val instance = MyClass.create()

...

हालाँकि, JVM पर आप @JvmStatic एनोटेशन का उपयोग करते हुए वास्तविक स्थिर विधियों और क्षेत्रों के रूप में उत्पन्न साथी वस्तुओं के सदस्य हो सकते हैं । अधिक विवरण के लिए जावा इंटरऑपरेबिलिटी सेक्शन देखें।

@JvmStaticएनोटेशन जोड़ना इस तरह दिखता है

class Foo {
  companion object {
    @JvmStatic
    fun a() : Int = 1;
  }
}

और फिर यह जावा और कोटलिन दोनों के रूप में सुलभ एक वास्तविक जावा स्थिर फ़ंक्शन के रूप में मौजूद होगा Foo.a()

यदि यह केवल Companionनाम के लिए नापसंद है , तो आप इस तरह के साथी ऑब्जेक्ट के लिए एक स्पष्ट नाम भी प्रदान कर सकते हैं:

class Foo {
  companion object Blah {
    fun a() : Int = 1;
  }
}

जो आपको कोटलिन से उसी तरह से कॉल करेगा, लेकिन जावा से Foo.Blah.a()( जैसे कि कोटलिन में भी काम करेगा)।


4
कोटलिन में यह fun a(): Int { return 1 }या भी होगाfun a(): Int = 1
दिमित्री ज़ेत्सेव

3
@DmitryZaitsev या भी fun a() = 1
मोइरा

फैक्टरी का क्या मतलब है?
बगुस आजी सैंटोसो

@BagusAjiSantoso Factoryहै नाम साथी वस्तु की - लेकिन क्या है कि के लिए इस्तेमाल किया जा सकता है? मुझे कोई पता नहीं है, लेकिन मुझे दिलचस्पी थी इसलिए मैंने एक सवाल बनाया जो कि समर्पित था: stackoverflow.com/q/45853459/222255
माइकल एंडरसन

1
@ Yajairo87 मुझे लगता है कि आप जो पूछ रहे हैं, वह यहाँ एक टिप्पणी में शामिल करने के लिए बहुत ज्यादा है - इसलिए मैंने इसे सीधे संबोधित करते हुए एक प्रश्न बनाया है: stackoverflow.com/questions/47046474/…
माइकल एंडरसन

154

डॉक्स पैकेज-स्तर के फ़ंक्शंस के साथ स्थैतिक कार्यों के लिए अधिकांश आवश्यकताओं को हल करने की सिफारिश करता है । वे केवल स्रोत कोड फ़ाइल में एक वर्ग के बाहर घोषित किए जाते हैं। फ़ाइल के पैकेज को पैकेज कीवर्ड के साथ फ़ाइल की शुरुआत में निर्दिष्ट किया जा सकता है।

घोषणा

package foo

fun bar() = {}

प्रयोग

import foo.bar

वैकल्पिक रूप से

import foo.*

अब आप फ़ंक्शन को इसके साथ कॉल कर सकते हैं:

bar()

या यदि आप आयात कीवर्ड का उपयोग नहीं करते हैं:

foo.bar()

यदि आप पैकेज को निर्दिष्ट नहीं करते हैं, तो फ़ंक्शन रूट से सुलभ होगा।

यदि आपके पास केवल जावा के साथ अनुभव है, तो यह थोड़ा अजीब लग सकता है। कारण यह है कि कोटलिन कड़ाई से वस्तु-उन्मुख भाषा नहीं है। आप कह सकते हैं कि यह कक्षाओं के बाहर के तरीकों का समर्थन करता है।

संपादित करें: उन्होंने पैकेज स्तर के फ़ंक्शंस की सिफारिश करने के बारे में वाक्य को शामिल नहीं करने के लिए दस्तावेज़ संपादित किया है। यह मूल है जिसे ऊपर संदर्भित किया गया था।


8
ध्यान दें कि हुड के तहत ये "शीर्ष-स्तर" या "पैकेज" फ़ंक्शन वास्तव में अपने स्वयं के वर्ग में संकलित किए जाते हैं। उपर्युक्त उदाहरण में, कंपाइलर class FooPackageशीर्ष स्तर के सभी गुणों और कार्यों के साथ निर्माण करेगा , और आपके सभी संदर्भों को उन्हें उचित रूप से रूट करेगा। Jetbrains से अधिक जानकारी।
मिशेल ट्रेसी

29
+1 यह समझने के लिए कि जावा से समतुल्य दर्पण के बजाय कोटलिन में समतुल्य अधिकार कैसे किया जाए ।
फीनिक्स

1
यह स्वीकृत उत्तर होना चाहिए या एक मॉड को पैकेज स्तर के कार्यों को शामिल करने के लिए स्वीकार किए गए उत्तर को अपडेट करना चाहिए
ओसामा शबर्ज़

@MitchellToice जानकारी का उत्कृष्ट बिट! धन्यवाद।
एक Droid

1
यह अब तक का बेहतर उपाय है। बस यह स्पष्ट करना चाहता था कि जहाँ आप फ़ंक्शन को परिभाषित करते हैं bar(), फ़ाइल नाम से कोई फर्क नहीं पड़ता, आप इसे BarUtils.ktया जो भी नाम दे सकते हैं , फिर जैसा कि पाठ कहता है कि आप इसके साथ आयात करेंगेimport <package name>.bar
Mariano Ruiz

33

ए। पुराने जावा वे:

  1. companion objectएक स्थिर विधि / चर को संलग्न करने के लिए एक की घोषणा करें

    class Foo{
    companion object {
        fun foo() = println("Foo")
        val bar ="bar"  
        }
    }
  2. उपयोग :

    Foo.foo()        // Outputs Foo    
    println(Foo.bar) // Outputs bar


B. न्यू कोटलिन रास्ता

  1. एक फ़ाइल पर कक्षा के बिना फ़ाइल को सीधे घोषित करें .kt

    fun foo() = println("Foo")
    val bar ="bar"
  2. methods/variablesउनके नाम के साथ प्रयोग करें । ( उन्हें आयात करने के बाद )

    उपयोग :

    foo()        // Outputs Foo          
    println(bar) // Outputs bar     


अगर im किसी अन्य वर्ग में इनिशियलाइज़ करने की कोशिश कर रहा है, तो यह java.lang.ExceptionInInitializerError और I वैल के बजाय var का उपयोग कर रहा है
सुदर्शन

4
मेथड कॉल के लिए INSTANCEकीवर्ड का होना आवश्यक है, जैसे:Foo.INSTANCE.sayFoo()
रायलगन

मुझे लगता है कि यह समाधान पसंदीदा तरीका है यदि आप static CLASSनहीं चाहते हैं static methdos। क्योंकि साथी वस्तुओं के साथ आप अभी भी मूल वर्ग को तुरंत कर सकते हैं।
फैब्रिकोरिसिटो

valस्थिर नहीं है यह static finalजावा में बराबर है
फरीद

23

स्थिर बनाने के लिए val / var / पद्धति का प्रतिनिधित्व करने के लिए ऑब्जेक्ट का उपयोग करें । आप सिंगलटन क्लास के बजाय ऑब्जेक्ट का भी उपयोग कर सकते हैं। यदि आप किसी वर्ग के अंदर स्थैतिक बनाना चाहते हैं तो आप साथी का उपयोग कर सकते हैं

object Abc{
     fun sum(a: Int, b: Int): Int = a + b
    }

यदि आपको इसे जावा से कॉल करने की आवश्यकता है:

int z = Abc.INSTANCE.sum(x,y);

Kotlin में, INSTANCE को नजरअंदाज करें।


11

यह भी मेरे लिए काम किया

object Bell {
    @JvmStatic
    fun ring() { }
}

कोटलिन से

Bell.ring()

जावा से

Bell.ring()

8
object objectName {
    fun funName() {

    }
}

5
हालांकि यह कोड स्निपेट समाधान हो सकता है, स्पष्टीकरण सहित वास्तव में आपके पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
नरेंद्र जाधव

5

आपको स्थैतिक विधि के लिए साथी ऑब्जेक्ट को पास करने की आवश्यकता है क्योंकि कोटलिन में स्थिर कीवर्ड नहीं है - साथी ऑब्जेक्ट के सदस्यों को केवल क्वालीफायर के रूप में वर्ग के नाम का उपयोग करके बुलाया जा सकता है:

package xxx
    class ClassName {
              companion object {
                       fun helloWord(str: String): String {
                            return stringValue
                      }
              }
    }

4

कोटलिन में स्टेटिक लागू करने के 2 तरीके हैं

पहले कक्षा के अंतर्गत एक साथी वस्तु बनाएं

पूर्व के लिए:

class Test{
    companion object{
          fun isCheck(a:Int):Boolean{
             if(a==0) true else false
          }
     }
}

आप इस फ़ंक्शन को कॉल कर सकते हैं

Test.Companion.isCheck(2)

एक अन्य तरीका जो हम उपयोग कर सकते हैं वह है ऑब्जेक्ट क्लास बनाना

object Test{
       fun isCheck(a:Int):Boolean{
            if(a==0) true else false
       }
}

हैप्पी कोडिंग!


पहले उपयोग (यानी Test.Companion.isCheck(2)) के लिए आईडीई चेतावनी दिखाता है और कहता है Companion reference is redundant। इसे घटाया जा सकता है Test.isCheck(2)और कम किया गया रूप जावा समकक्ष के अधिक करीब है।
VS23

3

Kotlin का कोई स्थिर कीवर्ड नहीं है। आपने वह जावा के लिए इस्तेमाल किया

 class AppHelper {
        public static int getAge() {
            return 30;
        }
    }

और कोटलिन के लिए

class AppHelper {
        companion object {
            fun getAge() : Int = 30
        }
    }

जावा के लिए कॉल करें

AppHelper.getAge();

कोटलीन के लिए कॉल करें

AppHelper.Companion.getAge();

मुझे लगता है कि यह पूरी तरह से काम कर रहा है।


3

मैं उपरोक्त उत्तरों में कुछ जोड़ना चाहूंगा।

हां, आप स्रोत कोड फ़ाइलों (कक्षा के बाहर) में कार्यों को परिभाषित कर सकते हैं। लेकिन यह बेहतर है कि आप कंपेनियन ऑब्जेक्ट का उपयोग करके कक्षा के अंदर स्थिर कार्यों को परिभाषित करें क्योंकि आप कोटलिन एक्सटेंशन का लाभ उठाकर अधिक स्थिर कार्यों को जोड़ सकते हैं ।

class MyClass {
    companion object { 
        //define static functions here
    } 
}

//Adding new static function
fun MyClass.Companion.newStaticFunction() {
    // ...
}

और आप परिभाषित फ़ंक्शन के ऊपर कॉल कर सकते हैं क्योंकि आप किसी भी फ़ंक्शन को साथी ऑब्जेक्ट के अंदर कॉल करेंगे।


3

भले ही अब यह 2 साल से अधिक पुराना है, और इसमें बहुत सारे शानदार जवाब थे, मैं देख रहा हूं कि "स्थिर" कोटलिन के खेत गायब होने के कुछ अन्य तरीके गायब हैं। यहाँ कोटलिन-जावा इंटरोप के लिए एक उदाहरण मार्गदर्शिका दी गई है static:

परिदृश्य 1: जावा के लिए कोटलिन में एक स्थिर विधि बनाना

Kotlin

@file:JvmName("KotlinClass") //This provides a name for this file, so it's not defaulted as [KotlinClassKt] in Java
package com.frybits

class KotlinClass {
    companion object {

        //This annotation tells Java classes to treat this method as if it was a static to [KotlinClass]
        @JvmStatic
        fun foo(): Int = 1

        //Without it, you would have to use [KotlinClass.Companion.bar()] to use this method.
        fun bar(): Int = 2
    }
}

जावा

package com.frybits;

class JavaClass {

    void someFunction() {
        println(KotlinClass.foo()); //Prints "1"
        println(KotlinClass.Companion.bar()); //Prints "2". This is the only way to use [bar()] in Java.
        println(KotlinClass.Companion.foo()); //To show that [Companion] is still the holder of the function [foo()]
    }

    //Because I'm way to lazy to keep typing [System.out], but I still want this to be compilable.
    void println(Object o) {
        System.out.println(o);
    }
}

माइकल एंडरसन का उत्तर इससे अधिक गहराई प्रदान करता है, और निश्चित रूप से इस परिदृश्य के लिए संदर्भित होना चाहिए।


यह अगला परिदृश्य कोटलिन में स्थिर फ़ील्ड बनाने का काम करता है ताकि जावा को KotlinClass.foo()उन मामलों के लिए कॉल न करना पड़े जहां आप एक स्थिर फ़ंक्शन नहीं चाहते हैं।

परिदृश्य 2: जावा के लिए कोटलिन में एक स्थिर चर बनाना

Kotlin

@file:JvmName("KotlinClass") //This provides a name for this file, so it's not defaulted as [KotlinClassKt] in Java
package com.frybits

class KotlinClass {

    companion object {

        //This annotation tells Kotlin to not generate the getter/setter functions in Java. Instead, this variable should be accessed directly
        //Also, this is similar to [@JvmStatic], in which it tells Java to treat this as a static variable to [KotlinClass].
        @JvmField
        var foo: Int = 1

        //If you want something akin to [final static], and the value is a primitive or a String, you can use the keyword [const] instead
        //No annotation is needed to make this a field of [KotlinClass]. If the declaration is a non-primitive/non-String, use @JvmField instead
        const val dog: Int = 1

        //This will be treated as a member of the [Companion] object only. It generates the getter/setters for it.
        var bar: Int = 2

        //We can still use [@JvmStatic] for 'var' variables, but it generates getter/setters as functions of KotlinClass
        //If we use 'val' instead, it only generates a getter function
        @JvmStatic
        var cat: Int = 9
    }
}

जावा

package com.frybits;

class JavaClass {

    void someFunction() {
        //Example using @JvmField
        println(KotlinClass.foo); //Prints "1"
        KotlinClass.foo = 3;

        //Example using 'const val'
        println(KotlinClass.dog); //Prints "1". Notice the lack of a getter function

        //Example of not using either @JvmField, @JvmStatic, or 'const val'
        println(KotlinClass.Companion.getBar()); //Prints "2"
        KotlinClass.Companion.setBar(3); //The setter for [bar]

        //Example of using @JvmStatic instead of @JvmField
        println(KotlinClass.getCat());
        KotlinClass.setCat(0);
    }

    void println(Object o) {
        System.out.println(o);
    }
}

Kotlin के बारे में एक महान विशेषता यह है कि आप शीर्ष स्तर के कार्य और चर बना सकते हैं। यह निरंतर फ़ील्ड और फ़ंक्शंस की "क्लासलेस" सूची बनाने के लिए इसे महान बनाता है, जो बदले staticमें जावा में फ़ंक्शन / फ़ील्ड के रूप में उपयोग किया जा सकता है ।

परिदृश्य 3: जावा से कोटलिन में शीर्ष स्तर के खेतों और कार्यों तक पहुँचना

Kotlin

//In this example, the file name is "KSample.kt". If this annotation wasn't provided, all functions and fields would have to accessed
//using the name [KSampleKt.foo()] to utilize them in Java. Make life easier for yourself, and name this something more simple
@file:JvmName("KotlinUtils")

package com.frybits

//This can be called from Java as [KotlinUtils.TAG]. This is a final static variable
const val TAG = "You're it!"

//Since this is a top level variable and not part of a companion object, there's no need to annotate this as "static" to access in Java.
//However, this can only be utilized using getter/setter functions
var foo = 1

//This lets us use direct access now
@JvmField
var bar = 2

//Since this is calculated at runtime, it can't be a constant, but it is still a final static variable. Can't use "const" here.
val GENERATED_VAL:Long = "123".toLong()

//Again, no need for @JvmStatic, since this is not part of a companion object
fun doSomethingAwesome() {
    println("Everything is awesome!")
}

जावा

package com.frybits;

class JavaClass {

    void someFunction() {

        println(KotlinUtils.TAG); //Example of printing [TAG]


        //Example of not using @JvmField.
        println(KotlinUtils.getFoo()); //Prints "1"
        KotlinUtils.setFoo(3);

        //Example using @JvmField
        println(KotlinUtils.bar); //Prints "2". Notice the lack of a getter function
        KotlinUtils.bar = 3;

        //Since this is a top level variable, no need for annotations to use this
        //But it looks awkward without the @JvmField
        println(KotlinUtils.getGENERATED_VAL());

        //This is how accessing a top level function looks like
        KotlinUtils.doSomethingAwesome();
    }

    void println(Object o) {
        System.out.println(o);
    }
}

एक और उल्लेखनीय उल्लेख है कि जावा में "स्थिर" फ़ील्ड के रूप में इस्तेमाल किया जा सकता है कोटलिन objectवर्ग। ये शून्य पैरामीटर सिंगलटन कक्षाएं हैं जो पहले उपयोग पर आलसी रूप से तात्कालिक हैं। उनके बारे में अधिक जानकारी यहां पाई जा सकती है: https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations

हालांकि, सिंगलटन तक पहुंचने के लिए, एक विशेष INSTANCEऑब्जेक्ट बनाया जाता है, जो कि जैसा है उससे निपटने के लिए उतना ही बोझिल Companionहै। यहां यह बताने के लिए कि एनोटेशन का उपयोग कैसे किया जाए ताकि staticजावा में साफ महसूस हो:

परिदृश्य 4: objectकक्षाओं का उपयोग करना

Kotlin

@file:JvmName("KotlinClass")

//This provides a name for this file, so it's not defaulted as [KotlinClassKt] in Java
package com.frybits

object KotlinClass { //No need for the 'class' keyword here.

    //Direct access to this variable
    const val foo: Int = 1

    //Tells Java this can be accessed directly from [KotlinClass]
    @JvmStatic
    var cat: Int = 9

    //Just a function that returns the class name
    @JvmStatic
    fun getCustomClassName(): String = this::class.java.simpleName + "boo!"

    //Getter/Setter access to this variable, but isn't accessible directly from [KotlinClass]
    var bar: Int = 2

    fun someOtherFunction() = "What is 'INSTANCE'?"
}

जावा

package com.frybits;

class JavaClass {

    void someFunction() {
        println(KotlinClass.foo); //Direct read of [foo] in [KotlinClass] singleton

        println(KotlinClass.getCat()); //Getter of [cat]
        KotlinClass.setCat(0); //Setter of [cat]

        println(KotlinClass.getCustomClassName()); //Example of using a function of this 'object' class

        println(KotlinClass.INSTANCE.getBar()); //This is what the singleton would look like without using annotations
        KotlinClass.INSTANCE.setBar(23);

        println(KotlinClass.INSTANCE.someOtherFunction()); //Accessing a function in the object class without using annotations
    }

    void println(Object o) {
        System.out.println(o);
    }
}

3

इसे छोटा बनाने के लिए आप "साथी वस्तु" का उपयोग कर सकते हैं जैसे कोटलिन स्थिर दुनिया में प्राप्त करने के लिए:

  companion object {
    const val TAG = "tHomeFragment"
    fun newInstance() = HomeFragment()
}

और कोड के रूप में एक स्थिर फ़ील्ड "कॉन्स्ट वैल" का उपयोग करने के लिए। लेकिन स्थैतिक कक्षाओं से बचने की कोशिश करें क्योंकि यह मॉकिटो का उपयोग करके यूनिट परीक्षण में मुश्किलें पैदा कर रहा है!


3

जावा स्टैटिक मेथड टू कोटलिन समतुल्य का सटीक रूपांतरण इस तरह होगा। उदाहरण यहाँ उपयोग वर्ग में एक स्थिर विधि है जो जावा और कोटलिन दोनों में बराबर होगी। @JvmStatic का उपयोग महत्वपूर्ण है।

जावा कोड:

    class Util{
         public static String capitalize(String text){
         return text.toUpperCase();}
       }

कोटलिन कोड:

    class Util {
        companion object {
            @JvmStatic
            fun capitalize(text:String): String {
                return text.toUpperCase()
            }
        }
    }

2

बस आपको एक साथी ऑब्जेक्ट बनाने और फ़ंक्शन को उसमें डालने की आवश्यकता है

  class UtilClass {
        companion object {
  //        @JvmStatic
            fun repeatIt5Times(str: String): String = str.repeat(5)
        }
    }

एक कोटलिन वर्ग से विधि लागू करने के लिए:

class KotlinClass{
  fun main(args : Array<String>) { 
    UtilClass.repeatIt5Times("Hello")
  }
}

या आयात का उपयोग करना

import Packagename.UtilClass.Companion.repeatIt5Times
class KotlinClass{
  fun main(args : Array<String>) { 
     repeatIt5Times("Hello")
  }
}

एक जावा वर्ग से विधि लागू करने के लिए:

 class JavaClass{
    public static void main(String [] args){
       UtilClass.Companion.repeatIt5Times("Hello");
    }
 }

या विधि में @JvmStatic एनोटेशन जोड़कर

class JavaClass{
   public static void main(String [] args){
     UtilClass.repeatIt5Times("Hello")
   }
}

या दोनों विधि में @JvmStatic एनोटेशन जोड़कर और जावा में स्थैतिक आयात करके

import static Packagename.UtilClass.repeatIt5Times
class JavaClass{
   public static void main(String [] args){
     repeatIt5Times("Hello")
   }
}

2

जावा के लिए:

public class Constants {
public static final long MAX_CLICK_INTERVAL = 1000;}

समतुल्य कोटलिन कोड:

object  Constants {
const val MAX_CLICK_INTERVAL: Long = 1000}

तो जावा स्थिर तरीकों के बराबर के लिए कोटलिन में ऑब्जेक्ट क्लास है।


2

एंड्रॉइड के लिए एक स्ट्रिंग से एक एकल गतिविधि से सभी आवश्यक गतिविधि का उपयोग करना। जैसे जावा में स्टेटिक

public final static String TEA_NAME = "TEA_NAME";

कोटलिन में समतुल्य दृष्टिकोण:

class MainActivity : AppCompatActivity() {
    companion object {
        const val TEA_NAME = "TEA_NAME"
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

एक और गतिविधि जहां मूल्य की आवश्यकता है:

val teaName = MainActivity.TEA_NAME

2

माइकल एंडरसन के जवाब को छोड़कर, मैंने अपने प्रोजेक्ट में अन्य दो तरीकों से कोडिंग की है।

प्रथम:

आप एक वर्ग में सभी चर को सफेद कर सकते हैं। कॉन्स्टल नाम की एक कोटलिन फ़ाइल बनाई

object Const {
    const val FIRST_NAME_1 = "just"
    const val LAST_NAME_1 = "YuMu"
}

आप इसे कोटलिन और जावा कोड में उपयोग कर सकते हैं

 Log.d("stackoverflow", Const.FIRST_NAME_1)

दूसरा:

आप उपयोग कर सकते हैं कोटलिन के एक्सटेंशन फ़ंक्शन
ने कोड के नीचे एक कोटलिन फ़ाइल बनाई है जिसका नाम एक्सट्रीम फ़ाइल में सभी कोड है

package pro.just.yumu

/**
 * Created by lpf on 2020-03-18.
 */

const val FIRST_NAME = "just"
const val LAST_NAME = "YuMu"

आप इसे कोटलिन कोड में उपयोग कर सकते हैं

 Log.d("stackoverflow", FIRST_NAME)

आप इसे जावा कोड में उपयोग कर सकते हैं

 Log.d("stackoverflow", ExtKt.FIRST_NAME);

1

उन्हें सीधे फाइलों में लिखें।

जावा में (बदसूरत):

package xxx;
class XxxUtils {
  public static final Yyy xxx(Xxx xxx) { return xxx.xxx(); }
}

कोटलिन में:

@file:JvmName("XxxUtils")
package xxx
fun xxx(xxx: Xxx): Yyy = xxx.xxx()

संकलन के बाद कोड के दो टुकड़ों को बराबर किया जाता है (यहां तक ​​कि संकलित फ़ाइल नाम, file:JvmNameइसका उपयोग संकलित फ़ाइल नाम को नियंत्रित करने के लिए किया जाता है, जिसे पैकेज नाम की घोषणा से ठीक पहले रखा जाना चाहिए)।


7
आप "कोटलिन (बदसूरत)" भूल गए ... कोटलिन: साथी वस्तु {वैल हैंडलर = ऑब्जेक्ट: हैंडलर (Looper.getMainLooper ()) {] ..... जावा: स्टेटिक हैंडलर हैंडलर = नया हैंडलर (Looper.getMainLooper) () ) {};
CmosBattery

1

@JVMStaticएनोटेशन का उपयोग करें

companion object {

    // TODO: Rename and change types and number of parameters
    @JvmStatic
    fun newInstance(param1: String, param2: String) =
            EditProfileFragment().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                }
            }
}

1

चलो, तुम्हारे पास एक क्लास स्टूडेंट है । और आपके पास एक स्थिर विधि getUniversityName () और एक स्थिर क्षेत्र है, जिसे TotalStudent कहा जाता है ।

आपको अपनी कक्षा के अंदर साथी ऑब्जेक्ट ब्लॉक घोषित करना चाहिए ।

companion object {
 // define static method & field here.
}

फिर आपकी कक्षा लगती है

    class Student(var name: String, var city: String, var rollNumber: Double = 0.0) {

    // use companion object structure
    companion object {

        // below method will work as static method
        fun getUniversityName(): String = "MBSTU"

        // below field will work as static field
        var totalStudent = 30
    }
}

फिर आप इस तरह से उन स्थैतिक विधि और फ़ील्ड का उपयोग कर सकते हैं।

println("University : " + Student.getUniversityName() + ", Total Student: " + Student.totalStudent)
    // Output:
    // University : MBSTU, Total Student: 30

1

कोटलिन में कोई स्थिर कीवर्ड नहीं है। यदि आप DRY का अनुसरण करना चाहते हैं तो kotlin डॉक्स पैकेज-स्तर के फ़ंक्शंस का उपयोग करने की सलाह देते हैं। के साथ एक फ़ाइल बनाएँ.Kt एक्सटेंशन वाली और उसमें अपना तरीका डालें।

package p
    fun m(){
    //fun body
    }

संकलन के बाद m में सार्वजनिक स्थैतिक अंतिम शून्य का हस्ताक्षर होगा

तथा

import p.m


0

आप कॉम्पैनियन ऑब्जेक्ट्स द्वारा कोटलिन में स्थिर कार्यक्षमता प्राप्त कर सकते हैं

  • जोड़ना साथी वस्तु घोषणा करने के लिए जोड़ने के लिए अनुमति देता है स्थिर एक वस्तु भले ही वास्तविक स्थिर अवधारणा Kotlin में मौजूद नहीं है करने के लिए कार्यक्षमता।
  • एक साथी वस्तु निजी कंस्ट्रक्टरों सहित कक्षा के सभी सदस्यों तक भी पहुंच सकता है।
  • जब क्लास को तत्काल किया जाता है तो एक साथी ऑब्जेक्ट को इनिशियलाइज़ किया जाता है।
  • एक साथी वस्तु को कक्षा के बाहर घोषित नहीं किया जा सकता है।

    class MyClass{
    
        companion object {
    
            val staticField = "This is an example of static field Object Decleration"
    
            fun getStaticFunction(): String {
                return "This is example of static function for Object Decleration"
            }
    
        }
    }

साथी ऑब्जेक्ट के सदस्यों को केवल क्वालीफायर के रूप में वर्ग नाम का उपयोग करके बुलाया जा सकता है:

आउटपुट:

MyClass.staticField // This is an example of static field Object Decleration

MyClass.getStaticFunction() : // This is an example of static function for Object Decleration

0

सभी स्थिर सदस्य और फ़ंक्शन साथी ब्लॉक के अंदर होना चाहिए

  companion object {
    @JvmStatic
    fun main(args: Array<String>) {
    }

    fun staticMethod() {
    }
  }

0

बहुत सारे लोग साथी वस्तुओं का उल्लेख करते हैं, जो सही है। लेकिन, जैसा कि आप जानते हैं, आप किसी भी प्रकार के ऑब्जेक्ट का उपयोग कर सकते हैं (ऑब्जेक्ट कीवर्ड का उपयोग करके, क्लास नहीं), अर्थात

object StringUtils {
    fun toUpper(s: String) : String { ... }
}

इसे किसी भी स्थिर विधि की तरह जावा में उपयोग करें:

StringUtils.toUpper("foobar")

कोटलिन में उस तरह का पैटर्न बेकार है, हालांकि इसकी एक खासियत यह है कि यह स्टैटिक तरीकों से भरी कक्षाओं की जरूरत से छुटकारा दिलाता है। आपके उपयोग के मामले के आधार पर, इसके बजाय वैश्विक, विस्तार और / या स्थानीय कार्यों का उपयोग करना अधिक उपयुक्त है। जहां मैं काम करता हूं हम अक्सर नामकरण सम्मेलन के साथ एक अलग, फ्लैट फ़ाइल में वैश्विक विस्तार कार्यों को परिभाषित करते हैं: [className] Extensions.kt यानी, FooExtensions.kt। लेकिन आम तौर पर हम ऐसे कार्यों को लिखते हैं जहां उनकी आवश्यकता उनके ऑपरेटिंग क्लास या ऑब्जेक्ट के अंदर होती है।


0

जावा में, हम नीचे तरीके से लिख सकते हैं

class MyClass {
  public static int myMethod() { 
  return 1;
  }
}

कोटलिन में, हम नीचे तरीके से लिख सकते हैं

class MyClass {
  companion object {
     fun myMethod() : Int = 1
  }
}

एक साथी को कोटलिन में स्थिर के रूप में प्रयोग किया जाता है।


0

कोटलिन दस्तावेज़ प्रदाता तीन तरीकों से ऐसा करता है, पहला पैकेज में फ़ंक्शन को परिभाषित करता है, बिना कक्षा के:

package com.example

fun f() = 1

दूसरा @JvmStatic एनोटेशन का उपयोग है:

package com.example

class A{
@JvmStatic
fun f() = 1
}

और तीसरा साथी वस्तु है:

package com.example

clss A{
companion object{
fun f() = 1
}
}

-1

यदि आपको इसके उदाहरणों के बजाय किसी फ़ंक्शन या किसी वर्ग से बंधे होने के लिए एक संपत्ति की आवश्यकता है, तो आप इसे एक साथी के अंदर घोषित कर सकते हैं:

class Car(val horsepowers: Int) {
    companion object Factory {
        val cars = mutableListOf<Car>()

        fun makeCar(horsepowers: Int): Car {
            val car = Car(horsepowers)
            cars.add(car)
            return car
        }
    }
}

साथी ऑब्जेक्ट एक सिंगलटन है, और इसके सदस्यों को सीधे वर्ग के नाम के माध्यम से पहुँचा जा सकता है

val car = Car.makeCar(150)
println(Car.Factory.cars.size)

ऐसा लगता है कि स्वीकृत उत्तर पहले से ही साथी वस्तुओं का वर्णन कर रहा है। तो बहुत सारे दूसरे जवाब हैं। क्या आपका जवाब कुछ नया प्रदान करता है?
स्नेफेल

आगे स्पष्टीकरण के लिए आप इसे यहाँ देख सकते हैं kotlinlang.org/docs/tutorials/kotlin-for-py/…
asad mahmood

-2

आप उपयोग कर सकते हैं कंपैनियन ऑब्जेक्ट्स - कोटलिनलैंग का

जिसे पहले उस इंटरफ़ेस को बनाकर दिखाया जा सकता है

interface I<T> {

}

फिर हमें उस इंटरफ़ेस के अंदर एक फंक्शन करना है:

fun SomeFunc(): T

उसके बाद, हमें एक वर्ग चाहिए:

class SomeClass {}

उस वर्ग के अंदर हमें उस वर्ग के अंदर एक साथी वस्तु की आवश्यकता है:

companion object : I<SomeClass> {}

उस पुरानी वस्तु के अंदर हमें उस पुराने SomeFuncकार्य की आवश्यकता है , लेकिन हमें इसकी सवारी करने की आवश्यकता है:

override fun SomeFunc(): SomeClass = SomeClass()

अंत में उस काम के सभी नीचे, हमें स्टेटिक फंक्शन को पावर देने के लिए कुछ चाहिए, हमें एक वेरिएबल चाहिए:

var e:I<SomeClass> = SomeClass()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.