Tag: 构造函数

如何在Kotlin中实现验证构造函数?

我正在Kotlin实施可能会接收某些用户的输入界限的变数。 我希望能够有选择地调用(只能来自这些不受信任的用户的输入)一个可以返回null的验证构造函数,然后使用Elvis运算符来指定在输入无效的情况下的默认值,如下所示: var myFoo = Foo.fromInt(i) ?: 1 。 我目前正在使用伴随对象方法来验证输入: open class Foo(val x:Int) { // relies on valid x in 1..3 companion object { fun fromInt(x: Int): Foo? = if (x in 1..3) Foo(x) else null } } class Bar(x:Int) : Foo(x) fun main(args:Array<String>) { println(Foo.fromInt(2)) // Foo(2) println(Foo.fromInt(20)) // null // println(Bar.fromInt(2)) // […]

Kotlin的建筑师

我正在从官方文档学习Kotlin ,我创建了一个class ,如下创建一个具有两个parameters constructor parameters 。 constructor主体在init块中。 class Person(name: String, surname: String) { init { Log.d("App", "Hello"); } } 那么,我想创建一个更多的constructor ,将采取一个constructor中的一个parameter 。 Kotlin什么办法呢?

Kotlin:在构造函数中初始化类属性

我创建了一个类属性的Kotlin类,我想在构造函数中进行初始化: public class TestClass { private var context : Context? = null // Nullable attribute public constructor(context : Context) { this.context = context } public fun doSomeVoodoo() { val text : String = context!!.getString(R.string.abc_action_bar_home_description) } } 不幸的是,我不得不声明属性为“?” 签名,虽然属性将在构造函数中初始化。 将这个属性声明为Nullable属性使得总是需要用“!!”强制NonNull值 或者用“?”提供一个空值检查。 有什么办法可以避免这种情况,如果类属性将在构造函数中初始化? 我想感谢这样一个解决方案: public class TestClass { private var context : Context // Non-Nullable attribute public […]

Kotlin数据类可以有多个构造函数吗?

我知道数据类就像kotlin中的简单模型,默认情况下是getter和setter,它们就像这样简单: data class User(val name: String, val age: Int) 是否可以声明该数据类的第二个构造函数?

在Kotlin中,如何扩展具有多个构造函数的类?

我正在学习Kotlin的过程中,遇到了一个我无法想象的问题。 我想在Kotlin中扩展Java类的RuntimeException,并且能够在不同情况下使用它的三个构造函数中的任何一个(根据我当时想要抛出异常的信息)。 在Java中,我的类看起来像这样: public class PhotoLibException extends RuntimeException { public PhotoLibException(String message, RuntimeException ex) { super(message, ex); } public PhotoLibException(String message) { super(message); } public PhotoLibException(RuntimeException ex) { super(ex); } } 当我尝试在Kotlin中这样做时,我使用了这个答案作为指导:但是, Kotlin二级构造函数试图找出如何正确调用适当的超级构造函数的问题。 例如,使用函数似乎是一个好方法,就像这样: fun PhotoLibException(message: String): PhotoLibException { val ex = null return PhotoLibException(message, ex) } fun PhotoLibException(ex: Exception): PhotoLibException { val message = […]

什么是Kotlin类初始化语义?

我一直无法在解释Kotlin中一个类的初始化的语言定义中找到任何东西。 import java.util.Properties fun main(args: Array<String>) { val out = MyClass() out.fn() } class MyClass { private val a = Properties() // 1 init { fn() } public fun fn() { println("Fn called. a = $a") } // private val a = Properties() // 2 } 运行这个程序的结果会根据属性是在(1)还是在(2)初始化而改变。 我很惊讶宣言的顺序与语言有关,并希望了解这背后的决定。 我的期望是在调用构造函数体之前初始化属性。

Kotlin和通用构造函数让我感到困惑

不了解Kotlin结合泛型。 我试图把我的一些java移向kotlin。 这些类中的几个是spring-data存储库和一个通用服务,它们将一个类型的存储库作为通用参数,例如: @Transactional interface ForumRepository : CrudRepository<Forum, Long> { fun findByName(name: String): Forum? } 那么GenericKotlinService: abstract class GenericKotlinService<T>(val repository: CrudRepository<Any, Serializable>) { fun <T> findOne(id: Serializable): T { return repository.findOne(id) as T } fun delete(id: Any) { repository.delete(id) } } 但是,现在当我尝试创建一个使用这个通用服务与特定的crudRepository的服务时,我总是得到错误,例如 class ForumService @Autowired constructor(repository: ForumRepository) : GenericKotlinService<Forum>(repository) { open fun findByName(name: String) = […]

使用Kotlin自定义Android视图

我正在尝试在我的Android项目中使用Kotlin。 我需要创建自定义视图类。 每个自定义视图有两个重要的构造函数: public class MyView extends View { public MyView(Context context) { super(context); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); } } MyView(Context)用于在代码中实例化视图,当从XML扩充布局时, MyView(Context, AttributeSet)由布局inflater调用。 对这个问题的回答建议我使用默认值或工厂方法的构造函数。 但是,这里是我们所拥有的: 工厂方法: fun MyView(c: Context) = MyView(c, attrs) //attrs is nowhere to get class MyView(c: Context, attrs: AttributeSet) : View(c, attrs) { … } 要么 fun […]

Kotlin二级构造函数

如何在Kotlin中声明次级构造函数? 有没有关于这个的文件? 以下不编译… class C(a : Int) { // Secondary constructor this(s : String) : this(s.length) { … } }