কোটলিনে জাভা স্থির পদ্ধতির সমতুল্য কী?


618

staticকোটলিনে কোনও কীওয়ার্ড নেই ।

staticকোটলিনে জাভা পদ্ধতি উপস্থাপনের সর্বোত্তম উপায় কোনটি ?


8
একটি প্যাকেজ-স্তরের ফাংশন ব্যবহার করুন ।
ফিনিক্স

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

গুগলের মতে, কোটলিন এখন অ্যান্ড্রয়েড বিকাশের জন্য পছন্দীয় ভাষা।
এএফডি

@ নিকোলাসমিলার কেন এটি আরও ওওপি বান্ধব? আমি মনে করি স্ট্যাটিক (বয়লারপ্লেট) এর পুনরাবৃত্তি নোট ছাড়া পড়া এবং লেখা আরও সহজ easier বা অন্য কোন ভাল কারণ আছে?
তোরবেন জি

উত্তর:


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()

...

তবে, জেভিএম-তে আপনি @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
@ দিমিত্রিজাইতসেভ বা এমনকি fun a() = 1
মাইরা

কারখানার অর্থ কী?
বাগস আজি সান্টোসো

@ বাগুসজিজি সান্টোসো Factoryহ'ল সহচর বস্তুর নাম - তবে এটি কীসের জন্য ব্যবহার করা যেতে পারে? আমার কোনও ধারণা নেই তবে আমি আগ্রহী তাই আমি এতে উত্সর্গীকৃত একটি প্রশ্ন তৈরি করেছি: stackoverflow.com/q/45853459/221955
মাইকেল অ্যান্ডারসন

1
@ ইয়াজায়েরো ৮৮ আমি মনে করি আপনি যা জিজ্ঞাসা করছেন তা এখানে একটি মন্তব্যে আবৃত করার জন্য অনেক বেশি - তাই আমি সরাসরি এটিকে সম্বোধন করার জন্য একটি প্রশ্ন তৈরি করেছি: স্ট্যাকওভারফ্লো
মাইকেল অ্যান্ডারসন

154

ডক্স প্যাকেজ-স্তরের ফাংশন সহ স্থির ফাংশনগুলির জন্য বেশিরভাগ প্রয়োজনগুলি সমাধান করার পরামর্শ দেয় । এগুলি সোর্স কোড ফাইলে কোনও শ্রেণীর বাইরে ঘোষিত হয়। একটি ফাইলের প্যাকেজটি প্যাকেজ কীওয়ার্ড সহ কোনও ফাইলের শুরুতে নির্দিষ্ট করা যেতে পারে।

ঘোষণা

package foo

fun bar() = {}

ব্যবহার

import foo.bar

বিকল্পভাবে

import foo.*

আপনি এখন এইটির সাথে ফাংশনটি কল করতে পারেন:

bar()

বা আপনি যদি আমদানি কীওয়ার্ডটি ব্যবহার না করেন:

foo.bar()

আপনি যদি প্যাকেজটি নির্দিষ্ট না করেন তবে ফাংশনটি মূল থেকে অ্যাক্সেসযোগ্য হবে।

যদি আপনার কেবল জাভা নিয়ে অভিজ্ঞতা থাকে তবে এটি কিছুটা অদ্ভুত বলে মনে হতে পারে। কারণটি হ'ল কোটলিন কোনও কঠোরভাবে বস্তু-কেন্দ্রিক ভাষা নয়। আপনি বলতে পারেন এটি ক্লাসের বাইরে পদ্ধতিগুলি সমর্থন করে।

সম্পাদনা করুন: তারা ডকুমেন্টেশন সম্পাদনা করেছে যাতে প্যাকেজ স্তরের কার্যকারিতা সুপারিশ করার বিষয়ে বাক্যটি আর অন্তর্ভুক্ত করা হয় না। এটি মূল যা উপরে উল্লেখ করা হয়েছিল।


8
নোট করুন যে ফণা অধীনে এই "শীর্ষ-স্তর" বা "প্যাকেজ" ফাংশনগুলি তাদের নিজস্ব শ্রেণিতে সংকলিত হয়েছে। উপরের উদাহরণে, সংকলক class FooPackageশীর্ষ-স্তরের সমস্ত বৈশিষ্ট্য এবং ফাংশন সহ একটি তৈরি করবে এবং আপনার সমস্ত উল্লেখগুলিকে যথাযথভাবে রুট করবে। জেটব্রেন থেকে আরও তথ্য।
মিচেল ট্রেসি

29
+1 জাভা থেকে আয়না সমতুল্য না হয়ে কোটলিনে সমতুল্য সঠিক কীভাবে করবেন তা ব্যাখ্যা করার জন্য ।
ফিনিক্স

1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত বা কোনও মোডের প্যাকেজ স্তরের ক্রিয়াকলাপগুলি ধারণ করার জন্য গৃহীত উত্তরটি আপডেট করা উচিত
ওসামা শাবরেজ

@ মিচেলট্রেসি দুর্দান্ত তথ্য! ধন্যবাদ।
একজন ড্রয়েড

1
এটি এখন পর্যন্ত আরও ভাল সমাধান। কেবল এই বিষয়টি স্পষ্ট করে বলতে চেয়েছিলেন যে আপনি যেখানে ফাংশনটি সংজ্ঞায়িত করেছেন bar()তাতে ফাইলের নামের কোনও গুরুত্ব নেই, আপনি নামটি BarUtils.ktবা যে কোনও কিছু লিখতে পারেন , যেমন পাঠ্য অনুসারে আপনি এটি দিয়ে আমদানি করবেনimport <package name>.bar
মারিয়ানো রুইজ

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


বি। নতুন কোটলিন পথে

  1. কোনও ফাইলের ক্লাস ছাড়াই সরাসরি ফাইলটিতে ঘোষণা .ktকরুন।

    fun foo() = println("Foo")
    val bar ="bar"
  2. methods/variablesতাদের নাম সহ ব্যবহার করুন । ( সেগুলি আমদানির পরে )

    ব্যবহার:

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


তোমার দর্শন লগ করা কিছু অন্যান্য ক্লাসে আরম্ভ করার চেষ্টা যদি তার java.lang.ExceptionInInitializerError দেয় এবং আমি এর পরিবর্তে Var ব্যবহার Val এম
সুদর্শন

4
পদ্ধতি কলগুলিতে INSTANCEএই জাতীয় কীওয়ার্ড থাকা দরকার :Foo.INSTANCE.sayFoo()
রায়গ্লান

আমি মনে করি এই সমাধান prefered উপায় আপনি একটি চান তাহলে static CLASSশুধু static methdos। কারণ সহযোগী অবজেক্টের সাহায্যে আপনি এখনও অভিভাবক শ্রেণিকে ইনস্ট্যান্ট করতে পারেন।
08 এ 18

valস্থির নয় এটি static finalজাভার সমতুল্য
ফরিদ

23

স্ট্যাটিক তৈরি করতে ভাল / ভার / পদ্ধতি উপস্থাপন করতে অবজেক্ট ব্যবহার করুন । আপনি সিঙ্গলটন ক্লাসের পরিবর্তে অবজেক্টও ব্যবহার করতে পারেন। আপনি যদি ক্লাসের অভ্যন্তরে স্থির করতে চান তবে আপনি সহচর ব্যবহার করতে পারেন

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

আপনার যদি জাভা থেকে কল করতে হয়:

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

কোটলিনে, ইনস্ট্যান্ট উপেক্ষা করুন।


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

কোটলিনে স্থির প্রয়োগের জন্য দুটি উপায় রয়েছে

প্রথমে ক্লাসের আওতায় কোনও সহযোগী বস্তু তৈরি করুন

প্রাক্তন হিসাবে:

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)এবং হ্রাস করা ফর্ম জাভা সমতুল্যের আরও বেশি কাছাকাছি।
ভিএসবি

3

কোটলিনের কোনও স্থির কীওয়ার্ড নেই। আপনি এটি জাভা জন্য ব্যবহার করেছেন

 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);
    }
}

কোটলিন সম্পর্কে দুর্দান্ত বৈশিষ্ট্যগুলির মধ্যে একটি হ'ল আপনি শীর্ষ স্তরের ফাংশন এবং ভেরিয়েবলগুলি তৈরি করতে পারেন। এটি ধ্রুবক ক্ষেত্র এবং ক্রিয়াকলাপগুলির "শ্রেণিবদ্ধ" তালিকা তৈরি করতে গ্রেট করে তোলে, যা ঘুরে 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/references/object-declations.html#object-dlalations

তবে, সিঙ্গলটনে অ্যাক্সেসের জন্য একটি বিশেষ INSTANCEঅবজেক্ট তৈরি করা হয়েছে, যা যেমন মোকাবেলা করা ঠিক ততটাই জটিল Companionstaticজাভাতে এমন পরিষ্কার অনুভূতি দেওয়ার জন্য টীকাগুলি কীভাবে ব্যবহার করবেন তা এখানে :

পরিস্থিতি 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

জাভা স্থিত পদ্ধতিতে কোটলিনের সমতুল্যে সঠিক রূপান্তরকরণ এরকম হবে। উদাহরণস্বরূপ, এখানে ব্যবহার শ্রেণীর একটি স্থির পদ্ধতি রয়েছে যা জাভা এবং কোটলিন উভয়ের সমতুল্য equivalent @ জেভিএমস্ট্যাটিকের ব্যবহার গুরুত্বপূর্ণ।

জাভা কোড:

    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");
    }
 }

বা পদ্ধতিতে @ জেভিএমস্ট্যাটিক টীকা যুক্ত করে

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

বা উভয়ই পদ্ধতিতে @ জাভিএমস্ট্যাটিক টীকা যুক্ত করে এবং জাভাতে স্থির আমদানি করে

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)

দ্বিতীয়ত:

আপনি
কোটলিনের এক্সটেনশন ফাংশনটি ব্যবহার করতে পারেন এক্সট named নামের কোডলিন ফাইল তৈরি করেছেন কোডের নীচের কোডটি হ'ল এক্সট্রা ফাইলের সমস্ত কোড

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
আপনি "কোটলিন (কুরুচিপূর্ণ)" ভুলে গেছেন ... কোটলিন: সহযোগী অবজেক্ট {ভ্যাল হ্যান্ডলার = অবজেক্ট: হ্যান্ডলার (লুপার.সেটমেনলুপার ()) {] ..... জাভা: স্ট্যাটিক হ্যান্ডলার হ্যান্ডলার = নতুন হ্যান্ডলার (লুপার.জেটমেইনলুপার () ) {};
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 () এবং মোট স্টুডেন্ট নামে একটি স্থির ক্ষেত্র রয়েছে

আপনার ক্লাসের ভিতরে আপনার সহকর্মী অবজেক্ট ব্লক ঘোষণা করা উচিত ।

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

কোটলিনে কোনও স্থির কীওয়ার্ড নেই। কোটলিন ডক্স প্যাকেজ-স্তরের ফাংশনগুলি ব্যবহার করার পরামর্শ দিচ্ছে যদি আপনি ডিআরওয়াই অনুসরণ করতে চান। .Kt এক্সটেনশান সহ একটি ফাইল তৈরি করুন এবং এতে আপনার পদ্ধতিটি রেখে দিন।

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

সংকলনের পরে এম এর সর্বজনীন স্থির চূড়ান্ত শূন্যতার স্বাক্ষর থাকবে

এবং

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")

এই ধরণের ধরণটি কোটলিনে এক ধরণের অকেজো, যদিও এর একটি শক্তি এটি স্থির পদ্ধতিতে ভরা শ্রেণীর প্রয়োজনীয়তা থেকে মুক্তি পেয়ে যায়। আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে গ্লোবাল, এক্সটেনশন এবং / অথবা স্থানীয় ফাংশনগুলি ব্যবহার করা আরও উপযুক্ত। আমি যেখানে কাজ করি আমরা প্রায়শই নামকরণের কনভেনশন সহ একটি পৃথক, ফ্ল্যাট ফাইলে গ্লোবাল এক্সটেনশন ফাংশনগুলি সংজ্ঞায়িত করি: [ক্লাসনেম] এক্সটেনশনস.কেটি, অর্থাৎ, 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

দ্বিতীয়টি হ'ল @ জভিএমস্ট্যাটিক টীকাটি ব্যবহার করুন:

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)

দেখে মনে হচ্ছে গ্রহণযোগ্য উত্তরটি ইতিমধ্যে সহচর বস্তুগুলি বর্ণনা করছে। অন্যান্য উত্তর অনেক হয়। আপনার উত্তর নতুন কিছু সরবরাহ করে?
স্নেফটেল 6'19

আরও ব্যাখ্যা জন্য আপনি এটি এখানে পরীক্ষা করতে পারবেন kotlinlang.org/docs/tutorials/kotlin-for-py/...
আসাদ মাহমুদ

-2

আপনি কম্পিটিয়েন অবজেক্টস - কোটলিংলং ব্যবহার করতে পারেন

যা প্রথমে সেই ইন্টারফেস তৈরি করে দেখানো যেতে পারে

interface I<T> {

}

তারপরে আমাদের সেই ইন্টারফেসের ভিতরে একটি ফাংশন তৈরি করতে হবে:

fun SomeFunc(): T

তারপরে, আমাদের একটি ক্লাস দরকার:

class SomeClass {}

এই শ্রেণীর ভিতরে আমাদের সেই শ্রেণীর ভিতরে একটি সহযোগী অবজেক্ট দরকার:

companion object : I<SomeClass> {}

সেই কম্পেনিয়ান অবজেক্টের ভিতরে আমাদের সেই পুরানো SomeFuncফাংশনটি প্রয়োজন, তবে আমাদের এটি চালিয়ে যাওয়া দরকার:

override fun SomeFunc(): SomeClass = SomeClass()

অবশেষে work সমস্ত কাজের নীচে, আমাদের স্ট্যাটিক ফাংশনটি পাওয়ার জন্য কিছু দরকার, আমাদের একটি ভেরিয়েবল দরকার:

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