当前位置: 首页 > 面试题库 >

Kotlin“何时”声明与Java“ switch”

云慈
2023-03-14
问题内容

在Kotlin中,模式匹配很好,并且在90%的用例中,它不执行下一个模式匹配也很不错。

在Android中,当数据库更新时,如果不让代码看起来像这样,我们将使用Java switch属性进行下一种情况:

switch (oldVersion) {
    case 1: upgradeFromV1();
    case 2: upgradeFromV2(); 
    case 3: upgradeFromV3();
}

因此,如果某人拥有一个数据库版本为1的应用程序,而错过了DB v2版本的应用程序,则他将获得所有所需的升级代码。

转换为Kotlin后,我们会像这样混乱:

when (oldVersion) {
    1 -> {
        upgradeFromV1()
        upgradeFromV2()
        upgradeFromV3()
    }
    2 -> {
        upgradeFromV2()
        upgradeFromV3()
    }
    3 -> {
        upgradeFromV3()
    }
}

这里只有3个版本,假设DB达到19版。

反正以相同的方式做出动作然后切换?我试图继续没有运气。


问题答案:

简单但罗word的解决方案是:

if (oldVersion <= 1) upgradeFromV1()
if (oldVersion <= 2) upgradeFromV2()
if (oldVersion <= 3) upgradeFromV3()

函数引用的另一种可能的解决方案:

fun upgradeFromV0() {}
fun upgradeFromV1() {}
fun upgradeFromV2() {}
fun upgradeFromV3() {}

val upgrades = arrayOf(::upgradeFromV0, ::upgradeFromV1, ::upgradeFromV2, ::upgradeFromV3)

fun upgradeFrom(oldVersion: Int) {
    for (i in oldVersion..upgrades.lastIndex) {
        upgrades[i]()
    }
}


 类似资料:
  • 我是 Kotlin 的新手,我有以下疑问 - 使用Java到Kotlin转换器(此链接),我将以下Java代码转换为Kotlin。 Java类: 生成的Kotlin类: 但是我不明白Java代码和生成的静态编程语言代码是如何等价的,因为类数据成员的可见性修饰符从私有(Java)变为公共(静态编程语言)。 我相信,如果可见性修饰符被保留(数据成员在静态编程语言中被声明为私有),getter和sett

  • 在Java类中,我通常在单个常量文件中声明我的所有常量,并跨项目访问 如何在Kotlin中实现相同 Java代码:

  • 主要内容:对象表达式,对象声明,伴生对象,对象表达式和对象声明之间的语义差异Kotlin 用对象表达式和对象声明来实现创建一个对某个类做了轻微改动的类的对象,且不需要去声明一个新的子类。 对象表达式 通过对象表达式实现一个匿名内部类的对象用于方法的参数中: 对象可以继承于某个基类,或者实现其他接口: 如果超类型有一个构造函数,则必须传递参数给它。多个超类型和接口可以用逗号分隔。 通过对象表达式可以越过类的定义直接得到一个对象: 请注意,匿名对象可以用作只在本地和私有作用域

  • 问题内容: 我有基于Web的编程(php,jsf等)的背景,并且带有swing和swt的背景很少。 目前,我正在寻找用于新桌面应用程序的java fx 2.x,并且我想了解有关构建实际GUI的最佳实践。我可以使用fxml进行声明式路由,也可以采用过程式路由。目前,为了进行快速原型制作,我正在使用后者,但我想知道是否有令人信服的理由使用fxml。 更新 最后,我为一个中等规模的项目使用了FXML路线

  • fun setCollection(collection:(Mutable)Collection !):KotlinClass中定义的单元 无论我做什么,都没有办法只用Kotlin代码来编译它。 再现情况的代码: Java本身就不存在这个问题。所以我猜测这可能与平台类型有关(不是)。 有没有一个优雅的解决方案来解决这个问题,最好不需要编写Java代码?还是应该在Kotlin编译器中解决这个问题?

  • 我试图将我的应用程序从Java转换为静态编程语言。 我使用了Android Studio内置转换器并修复了它生成的大部分错误。 对于科特林来说,这一次让我很难受: 我得到了这个用Java编写的类,并进行了转换,显然没有任何错误,这有助于我在回收视图中管理项目点击: 在main活动中,转换后在函数中设置如下: IDE给我以下错误: 类型不匹配: 必需:ItemClickSupport。OnItemC