小编ore*_*reh的帖子

什么是Kotlin的密封课程?

我是Kotlin的初学者,最近读过有关密封课程的内容.但是从文档来看,我实际得到的唯一想法是它们存在.

该文件指出,他们"代表受限制的阶级等级制度".除此之外,我发现了一个声明,他们是超级大国的枚举.这两个方面实际上都不清楚.

那么你可以帮我解决以下问题:

  • 什么是密封类以及使用它们的惯用方法是什么?
  • 这样的概念是否存在于其他语言中,如Python,Groovy或C#?

更新: 我仔细检查了这篇博客文章,仍然无法理解这个概念.正如帖子中所述

效益

该功能允许我们定义在类型中受限制的类层次结构,即子类.由于所有子类都需要在密封类的文件中定义,因此编译器不了解未知子类的可能性.

为什么编译器不知道其他文件中定义的其他子类?即使IDE知道这一点.Ctrl+Alt+B例如,只需在IDEA上按下List<>定义,即使在其他源文件中也会显示所有实现.如果某个子类可以在某个第三方框架中定义,而该应用程序中未使用该框架,我们为什么要关心它?

kotlin

13
推荐指数
3
解决办法
3651
查看次数

这是Kotlin的一个错误还是我错过了什么?

我没有太多的多线程经验.所以不确定我是否正确使用从Kotlin反编译的以下Java代码.

这是Kotlin代码:

companion object {
    @Volatile private var INSTANCE: SomeDatabase? = null

    fun getInstance(context: Context): SomeDatabase =
            INSTANCE ?: synchronized(this) {
                INSTANCE ?: buildDatabase(context).also { INSTANCE = it }
            }
}
Run Code Online (Sandbox Code Playgroud)

这是Java中的反编译代码:

     SomeDatabase var10000 = ((SomeDatabase.Companion)this).getINSTANCE();
     if (var10000 == null) {
        synchronized(this){}

        SomeDatabase var4;
        try {
           var10000 = SomeDatabase.Companion.getINSTANCE();
           if (var10000 == null) {

               ...

        var10000 = var4;
     }

     return var10000;
Run Code Online (Sandbox Code Playgroud)

这是不是意味着代码实际上没有同步,因为空块synchronized(this){}

multithreading kotlin

13
推荐指数
1
解决办法
251
查看次数

带有 Integer 键的 Groovy 映射 - DefaultGroovyMethods 中的“getAt”无法应用于 (java.lang.Integer)

我刚刚开始练习 Groovy,我有一个与地图和 IDEA IDE 相关的问题。

Integer当我尝试用作地图的密钥时,为什么 IDEA 会显示以下通知?这个简单的 Groovy 脚本运行良好并打印正确的结果。

截屏

list = [4, 7, 3, 7, 7, 1, 4, 2, 4, 2, 7, 5]

map = [:]
list.each {
    t = map[(it)]
    map[(it)] = t != null ? t + 1 : 1
}

map.each {key, value -> if (value == 1) println key}
Run Code Online (Sandbox Code Playgroud)

groovy intellij-idea

5
推荐指数
1
解决办法
1510
查看次数

使用Integer作为Java中HashMap的键

最近我一直在寻找hashCode()Java API 中方法的良好实现,并查看Integer源代码.没想到,但hashCode()刚刚返回支持的int价值.

public final class Integer ... {
private final int value;
...
    public int hashCode() {
        return Integer.hashCode(value);
    }
    public static int hashCode(int value) {
        return value;
    }
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为有很多论文和页面以及专门用于解决这个问题的软件包 - 如何设计好的哈希函数来分配值.

最后我得出了这个结论:

Integer是与键一起使用的最差数据类型候选者HashMap,因为所有连续键都将位于一个bin/bucked中.就像上面的例子一样.

Map<Integer, String> map = HashMap<>();

for (int i = 1; i < 10; i++) {
    map.put(Integer.valueOf(i), "string" + i);
}
Run Code Online (Sandbox Code Playgroud)

有两个问题,谷歌搜索时没有找到答案:

  1. 我对Integer数据类型的结论是否正确?
  2. 万一这是真的,为什么Integer's hashCode()在使用电源操作,素数,二进制移位时,方法不能以某种棘手的方式实现?

java collections

2
推荐指数
2
解决办法
1020
查看次数

以Kotlin方式重构赋值

有一个变量:

var itemDecorators: MutableList<ItemDecorator>? = null
Run Code Online (Sandbox Code Playgroud)

在函数的最开始,我正在尝试执行以下操作:

private fun draw(c: Canvas, rv: RecyclerView, vh: ViewHolder) {
    val decorators = itemDecorators ?: return
    if (decorators.isEmpty()) return
Run Code Online (Sandbox Code Playgroud)

是否有可能在Kotlin中将最后两行重构为一个语句,即检查是否为null空,检查是否为空,然后分配,否则return

kotlin

1
推荐指数
1
解决办法
61
查看次数