Kotlin-Object

4765 단어

object 키워드


object 키워드는 두 가지 의미를 나타낼 수 있습니다. 하나는 대상 표현식이고, 다른 하나는 대상 성명입니다.

1. 객체 표현식


익명 대상 계승
binding.tvTitle.setOnClickListener(object : View.OnClickListener {
            override fun onClick(v: View?) {
                Toast.makeText(this@MainActivity, " ", Toast.LENGTH_SHORT);
            }
        })

2. 개체 선언


Object로 수식된 클래스는 정적 클래스이고 그 안의 방법과 변수는 모두 정적 클래스입니다.
2.1 직접 성명 클래스
 private const val TAG: String = "DEMO_TAG"
    
    fun log(): Unit {
        Log.i(TAG, "log: ")
    }

2.2 정적 내부 클래스 선언
class DemoManager{
    object MyObject {
        fun a() {
            Log.e(TAG,"  object    ")
        }
    }
}

만약 a () 방법을 호출해야 한다면
  • kotlin에서 직접 클래스를 호출합니다.함수 이름
  • fun init() {
        MyObject.a()
    }
    
  • java에서 고정 표현식 클래스를 호출합니다.INSTANCE.함수 이름
  • MyObject.INSTANCE.a(); 
    

    2. companion object


    companion object는 반생 대상으로 수식되어 있으며 반생 대상은 클래스에 하나만 존재합니다. 자바의 정적 방법과 유사합니다. 자바에서 클래스를 사용하여 정적 구성원에 접근하고 정적 방법입니다.
    companion object {
        private val TAG = "DemoManager"
    
        fun b() {
            Log.e(TAG,"  companion objec t   ")
        }
    }
    
  • kotlin에서 호출
  • fun init(){
           b()
    }
    
  • java에서 호출
  • DemoManager.Companion.b();
    

    3. companion object에서 외부 구성원 변수를 어떻게 호출하는가


    3.1 외부 구성원 변수가 companion object에서 호출되지 않는 이유

    class DemoManager {
        private val MY_TAG = "DemoManager"
       
        fun init(){
           b()
       }
    
        companion object {
            fun b() {
                Log.e(MY_TAG,"  companion objec t   ")
            }
        }
    }
    
    

    위 코드에서 MY태그는 호출되지 않을 겁니다.원리는 매우 간단하다. 자바에서 우리는 정적 방법을 쓴다. 구성원 변수를 호출해야 한다면 호출할 수 없다.
    private String TAG = "MainActivity";
      
    public static void init(){
            Log.e(TAG,"init() ");
    }
    
    

    TAG를 정적 구성원 변수로 수정한 경우에만 호출할 수 있습니다.
    private static String TAG = "MainActivity";
      
    public static void init(){
            Log.e(TAG,"init() ");
    }
    

    이를 통해 알 수 있듯이 자바에서 정적 방법으로 구성원 변수를 호출하는데 구성원 변수는 반드시 정적이어야 한다.kotlin에서도 마찬가지이기 때문에companion object에서 비정상적인 구성원 변수를 호출해도 호출되지 않는다.

    3.2 어떻게 해결해야만 호출할 수 있습니까?

    companion object {
        private val MY_TAG = "DemoManager"
        fun b() {
            Log.e(MY_TAG,"  companion objec t   ")
        }
    }
    
    

    인용한 구성원 변수도 정태적으로 수식하면 인용할 수 있다.

    4. 상수와 정적 방법


    상수


    Java:
       class StaticDemoActivity {
             public static final String LOAN_TYPE = "loanType";
             public static final String LOAN_TITLE = "loanTitle";
        }
    
    

    Kotlin:
     class StaticDemoActivity {
          companion object StaticParams{
                val  LOAN_TYPE = "loanType"
                val  LOAN_TITLE = "loanTitle"
        }
    }
    
      
      class StaticDemoActivity {
          companion object {   //   
             const val LOAN_TYPE = "loanType"
             const val LOAN_TITLE = "loanTitle"
        }
    }
    

    주:const 키워드는 상수를 수식하는 데 사용되며 val만 수식할 수 있고 var은 수식할 수 없습니다. companion object의 이름은 생략할 수 있고 Companion으로 지칭할 수 있습니다.

    상수 인용 (자바 인용kotlin 코드에 대한 인용)


    TestEntity 클래스는 StaticDemoActivity의 상수를 참조합니다
       class TestEntity {
            public TestEntity () {
                String title = StaticDemoActivity.Companion.getLOAN_TITLE();
        }
      }
    
       
    
      class TestEntity {
            public TestEntity () {
                String title = StaticDemoActivity.StaticParams.getLOAN_TITLE();
            }
      }
    
       
    
      class TestEntity {
            public TestEntity () {
                String title = StaticDemoActivity.LOAN_TITLE;
                String type= StaticDemoActivity.LOAN_TYPE;
            }
      }
    
    

    정적 방법

  • Java 코드:
  •       class StaticDemoActivity {
              public static void test(){
                    、、、
              } 
          }
    
    
  • Kotlin 중:
  •       class StaticDemoActivity {
              public static void test(){
                    、、、
              } 
          }
    
    

    정적 방법 인용 (자바 인용kotlin 코드에만 대한 인용)
    TestEntity 클래스는 StaticDemoActivity의 정적 방법을 참조합니다
        class TestEntity {
              public TestEntity () {
                    StaticDemoActivity.Companion.test();
              }
        }
    
     
    
        class TestEntity {
              public TestEntity () {
                 StaticDemoActivity.StaticParams.test();
              }
        }
    
    

    companion object {}에서 정적 상수나 정적 방법, 단례 등을 수식하는 데 사용

    좋은 웹페이지 즐겨찾기