Kotlin – 使用“懒”与“lateinit”的属性初始化

在Kotlin中,如果您不想在构造函数或类体顶部启动类属性,则基本上有以下两个选项(来自语言参考): 延迟初始化 lazy()是一个函数,它接受一个lambda并返回一个Lazy实例,它可以作为实现一个lazy属性的委托:get()的第一个调用执行传递给lazy()的lambda并记住结果,随后的调用得到()只是返回记忆的结果。 例 public class Hello{ val myLazyString: String by lazy { "Hello" }` } 所以第一个调用和次要的调用,无论它在哪里, myLazyString都会返回“Hello” 延迟初始化 通常,声明为具有非null类型的属性必须在构造函数中初始化。 但是,这往往不方便。 例如,属性可以通过依赖注入来初始化,或者在单元测试的设置方法中进行初始化。 在这种情况下,你不能在构造函数中提供一个非null初始值设定项,但是当你引用一个类的内部属性的时候,你还是要避免使用null检查。 要处理这种情况,可以使用lateinit修饰符标记属性: public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } } 修饰符只能用于在类的主体内声明的var属性(不在主构造函数中),只有当属性没有自定义getter或setter时。 属性的类型必须是非空的,并且不能是原始类型。 那么,如何正确选择这两个选项,既然他们都能解决同样的问题呢?

kotlin验证输入字段

为了Android开发,我正在从Java转移到Kotlin。 我想检查EditText中的字段是否为空。 所以我试图做到这一点: override fun checkFields() { val username = username.text.toString().trim().takeUnless { username.text.isNullOrEmpty() } ?: presenter.usernameError() val password = password.text.toString().trim().takeUnless { password.text.isNullOrEmpty() } ?: presenter.passwordError() presenter.signInWithUsernameAndPassword(username as String,password as String) } 但是有两个问题: 如果用户名/密码为空,它也会传递给signInWithUsernameAndPassword 它崩溃,因为给我这个错误: java.lang.ClassCastException:kotlin.Unit不能转换为java.lang.String 为什么? takeUnless{}将字符串转换为单位? 谢谢

没有类型注释的Kotlin函数参数

在Kotlin上,当定义方法时,函数的参数需要类型注释。 在我的情况下,我有一个接口的两个类。 interface Base{ fun method() } class DervA():Base{ fun override method(){ … } } class DervB():Base{ fun override method(){ … } } 而且,我希望从其他功能中调用他们的方法 fun test_method(inst){ inst.method() } 但是,Kotlin编译器却抱怨:“一个值参数需要一个类型注解”。 我应该为每个类定义“test_method”吗? fun test_method_for_DervA(inst:DervA){ inst.method() } fun test_method_for_DervB(inst:DervB){ inst.method() } 你有更聪明的方法吗?

在java项目中运行kotlin代码

我想在一个Java项目中运行glm ,但我不断得到: Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics at main.vec._2.Vec2.<init>(Vec2.kt) at main.vec._2.Vec2.<init>(Vec2.kt:23) at test.Main.main(Main.java:19) Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 手动添加kotlin-reflect.jar和kotlin-runtime.jar解决了错误,但我更喜欢有一个单一的jar导入。 这是我如何构建神器: 这是内容: 我究竟做错了什么? Intellij 2016.3.1 Kotlin 1.1m03

在Kotlin中改进实现 – 方法默认参数

我正在尝试在Kotlin中 实现Android的Retrofit的入门 。 我已经创建了Retrofit类的实例,但是当我尝试在没有回调参数的接口中调用端点方法时,Kotlin似乎并不喜欢它。 这里是所有相关的代码。 数据类: data class GitHubRepo(val id:Int,val name:String) 界面: interface GitHubClient { @GET("/users/{user}/repos") fun reposForUser(@Path("user") user: String,callback: Callback<List<GitHubRepo>> ) } 改造实施: val httpClient = OkHttpClient.Builder() val builder = Retrofit.Builder().baseUrl(API_BASE_URL) .addConverterFactory(GsonConverterFactory.create()) val retrofit = builder.client(httpClient.build()).build() val client = retrofit.create(GitHubClient::class.java) val call = client.reposForUser("fs-opensource") <– Error – No value passed for parameter 'callback' 从教程: […]

Kotlin字节码 – 如何在IntelliJ IDEA中分析?

我是Kotlin的新手,我希望能够查看编译的字节码,以便了解更多关于它如何工作的信息。 我正在使用IntelliJ IDEA 15,但找不到查看字节码的好方法。 我错过了什么?

从Kotlin访问Java bean属性

我使用标准bean约定来管理Java类: public class Request { protected String vin; public String getVin() { return vin; } public void setVin(String value) { this.vin = value; } } 我希望使用好的属性语法在Kotlin中使用这个类: override fun search(request: Request): Response { log.info("search(vin={})", request.vin); … 但是这个代码不能编译: Error:(59, 64) Kotlin: Cannot access 'vin': it is 'protected/*protected and package*/' in 'SmvSearchRequest' request.getVin()当然可以工作,但看起来并不比Java好。 有什么办法把这些阶级当作财产持有人?

如何使用正确的名称将Kotlin函数导出到Javascript

我试图将Kotlin函数导出到Javascript。 问题是,需要参数的函数在Kotlin2JS操作之后被重命名,这里是一个例子: Kotlin来源: fun withParam(args: String) { println("JavaScript generated through Kotlin") } fun withoutParams() { println("Without params") } 在Kotlin2JS之后,试图在Node REPL中要求: > const kotlinBundle = require('./build/index.js'); undefined > kotlinBundle { 'withParam_61zpoe$': [Function: withParam], withoutParams: [Function: withoutParams] } > 正如你所看到的,带有_61zpoe$后缀的参数的函数。 是否有可能摆脱那部分? 我使用kotlin2js插件和kotlin-stdlib-js:1.1.1库,我的kotlinOptions是: compileKotlin2Js.kotlinOptions { moduleKind = "commonjs" outputFile = "build/index.js" } 谢谢

Kotlin泛型超/儿童班

试图使用泛型类,但有以下问题,即: 类型不匹配:推断的类型是ChildClass但是SuperClass<SuperType>是预期的 open class SuperClass<T> where T: SuperType { fun modifySomething(input: T): T { input.someValue.inc() return input } } open class SuperType { val someValue: Int = 0 } class ChildClass : SuperClass<ChildType>() class ChildType: SuperType() { fun getModifiedValue(): Int { return someValue } } class TestEnvironment { fun testType(superClass: SuperClass<SuperType>) { // do something […]

Kotlin启动应用程序崩溃

我的应用程序是用kotlin构建的,这里是我的build.gradle文件: compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 和我的工作区的build.gradle文件: ext.kotlin_version = '1.1.3-2' ext.kotlin_plugin_version = '1.1.1' dependencies { classpath "io.realm:realm-gradle-plugin:3.4.0" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_plugin_version" } 在我的项目中,我已经用java8和jack,所以gradle-plugin版本只能是1.1.1 当我开始我的应用程序,它随机崩溃,这里是日志: FATAL EXCEPTION: main Process: com.ss.android.caijing.stock.debug, PID: 31962 java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Intrinsics; at com.ss.android.caijing.stock.main.MainActivity.initData(MainActivity.kt:33) at com.ss.android.caijing.stock.base.BaseActivity.onCreate(BaseActivity.java:25) at android.app.Activity.performCreate(Activity.java:6367) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110) at com.bytedance.frameworks.plugin.hook.InstrumentationHook$PluginInstrumentation.callActivityOnCreate(InstrumentationHook.java:248) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2404) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2511) at android.app.ActivityThread.access$900(ActivityThread.java:165) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1375) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:150) at android.app.ActivityThread.main(ActivityThread.java:5621) […]