Kotlin 단일 예(객체 선언)

6137 단어
대상 성명은 일례다.object DataProviderManager는 클래스DataProviderManager를 만들고 단일 모델을 실현한 것으로 이해할 수 있다.테스트 코드
class test {
    object DataProviderManager {
        fun registerDataProvider(provider: String) {
            // ……
        }

        val allDataProviders: Collection
            get() = listOf("a")

    }

    fun test() {
        DataProviderManager.registerDataProvider("")
    }
}

class MyClass {
    companion object {
          var a: String = ""
        
        fun create(): MyClass = MyClass()
    }

    fun test() {
        MyClass.create()
    }
}

class MyClass1 {

    companion object {

         @JvmStatic
        var a: String = ""

        @JvmStatic
        fun create(): MyClass1 = MyClass1()
    }

    fun test() {
        MyClass1.create()
    }
}

kotlin이 최종적으로 생성한 자바 코드 Tools->Kotlin->Decompile Kotlin to 자바를 보고 위의 Decompile 단추를 누르면 전환된 자바 파일을 얻을 수 있습니다. 아래와 같습니다.
// MyClass.java

import kotlin.Metadata;
import kotlin.jvm.internal.DefaultConstructorMarker;
import org.jetbrains.annotations.NotNull;

public final class MyClass {
   public static final MyClass.Companion Companion = new MyClass.Companion((DefaultConstructorMarker)null);

   public final void test() {
      Companion.create();
   }

   public static final class Companion {
     @NotNull
      public final String getA() {
         return MyClass.a;
      }

      public final void setA(@NotNull String var1) {
         Intrinsics.checkParameterIsNotNull(var1, "");
         MyClass.a = var1;
      }

      @NotNull
      public final MyClass create() {
         return new MyClass();
      }

      private Companion() {
      }

      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}
// test.java

import java.util.Collection;
import kotlin.Metadata;
import kotlin.collections.CollectionsKt;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;

public final class test {
   public final void test() {
      test.DataProviderManager.INSTANCE.registerDataProvider("");
   }

   public static final class DataProviderManager {
      public static final test.DataProviderManager INSTANCE;

      public final void registerDataProvider(@NotNull String provider) {
         Intrinsics.checkParameterIsNotNull(provider, "provider");
      }

      @NotNull
      public final Collection getAllDataProviders() {
         return (Collection)CollectionsKt.listOf("a");
      }

      private DataProviderManager() {
         INSTANCE = (test.DataProviderManager)this;
      }

      static {
         new test.DataProviderManager();
      }
   }
}
// MyClass1.java

import kotlin.Metadata;
import kotlin.jvm.JvmStatic;
import kotlin.jvm.internal.DefaultConstructorMarker;
import org.jetbrains.annotations.NotNull;

public final class MyClass1 {
  @NotNull
   private static String a = "";
   public static final MyClass1.Companion Companion = new MyClass1.Companion((DefaultConstructorMarker)null);

   public final void test() {
      Companion.create();
   }

@NotNull
   public static final String getA() {
      return Companion.getA();
   }

   public static final void setA(@NotNull String var0) {
      Intrinsics.checkParameterIsNotNull(var0, "");
      Companion.setA(var0);
   }

   @JvmStatic
   @NotNull
   public static final MyClass1 create() {
      return Companion.create();
   }

   public static final class Companion {
      @JvmStatic
      @NotNull
      public final MyClass1 create() {
         return new MyClass1();
      }

      private Companion() {
      }

      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}

  • 생성된test.java을 보면 안의DataProviderManager가 단례다.object DataProviderManager는 클래스DataProviderManager를 만들고 단일 모델을 실현한 것으로 이해할 수 있다.호출DataProviderManager.registerDataProvider("")에 대응하는 자바 코드는 DataProviderManager.INSTANCE.registerDataProvider("")
  • 입니다.
    흔한 호출 단일 클래스 방법 코드DataProviderManager.getInstance().registerDataProvider("")는 instance 획득 방식이 다를 뿐입니다
  • Companion object는 단례가 아니라 정적 변수로 생각하면 된다.@JvmStatic를 넣었더니 MyClass1에 private static String a = "";public static final MyClass1 create() {
  • 가 많아졌어요.
    JVM 플랫폼에서 @JvmStatic 주석을 사용하면 반생 대상의 구성원을 진정한 정적 방법과 필드로 만들 수 있습니다.

    어떤 학우회가 내가 어떻게 하나의 단례류를 다른 종류에 사용하느냐고 물었다.


    위에서 말한 바와 같이 object className는 하나의 단일 모델을 실현하는 유형을 정의하는 것과 같다.그래서 우리는 어떤kt 파일에 다음과 같은 코드를 썼다
    object UserHelper{
        var username:String = ""
    }
    
    class LoginActivity{
    
        fun doLogin(name:String){
            UserHelper.username = name
        }
    }
    

    로그인한 사용자의 정보를 저장하기 위한 UserHelper 단일 클래스를 만들었습니다.LoginActivity에서 사용자가 로그인하여 되돌아오는 name에게 UserHelper, Decompile kotlin to java에 값을 부여합니다.
    
    public final class LoginActivity {
       public final void doLogin(@NotNull String name) {
          Intrinsics.checkParameterIsNotNull(name, "name");
          UserHelper.INSTANCE.setUsername(name);
       }
    }
    // UserHelper.java
    package com.xstudy.assistteacher.module.inclass;
    
    import kotlin.Metadata;
    import kotlin.jvm.internal.Intrinsics;
    import org.jetbrains.annotations.NotNull;
    
    public final class UserHelper {
       @NotNull
       private static String username;
       public static final UserHelper INSTANCE;
    
       @NotNull
       public final String getUsername() {
          return username;
       }
    
       public final void setUsername(@NotNull String var1) {
          Intrinsics.checkParameterIsNotNull(var1, "");
          username = var1;
       }
    
       private UserHelper() {
          INSTANCE = (UserHelper)this;
          username = "";
       }
    
       static {
          new UserHelper();
       }
    }
    

    좋은 웹페이지 즐겨찾기