如何在内部类中定义常量?

时间:2019-09-13 10:56:33

标签: android kotlin

我有以下Java代码想要转换为Kotlin:

class RideHistoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    class HistoryItemHolder extends RecyclerView.ViewHolder {
        private static final int TYPE_IN_PROGRESS = 1
        private static final int TYPE_CANCELLED = 2
        private static final int TYPE_FINISHED = 3

        // class methods and properties are written
    }
}

我想出了以下代码:

class RideHistoryAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    private inner class HistoryItemHolder(view: View)
        : RecyclerView.ViewHolder(view) {
        private companion object {
            private const val TYPE_IN_PROGRESS = 1
            private const val TYPE_CANCELLED = 2
            private const val TYPE_FINISHED = 3

            // class methods and properties are written
        }

    }

}

Android Studio在行companion object的“对象”下方呈红色波浪状显示,

  

此处不允许使用随播对象

注意::我知道我可以将其转换为非内部类,但我希望保留它。我还检查了我也无法在内部类中定义接口。

2 个答案:

答案 0 :(得分:5)

首先,您的Java无效。如果您对其进行修复,则会收到错误消息:Inner classes can not have static declarations

invalid java

由于无法拥有static members in an inner class in java

的原因,您不能在内部类中拥有伴随对象

https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

  

与实例方法和变量一样,内部类也被关联   包含其封闭类的实例,并可以直接访问该类   对象的方法和字段。 此外,因为内部类是   与实例相关联,它本身无法定义任何静态成员。

(我的重点)

基于相同的推理,将准静态伴侣对象与实例相关联是没有意义的。

解决方案(选择一项):

  1. 使用val(类似于final)。
  2. 将伴随对象移动到封闭类。
  3. 使HistoryItemHolder不是内部类。

答案 1 :(得分:0)

我可以确认无法在内部类中添加常量(请参阅Kotlin论坛上的my question)。

但是,有两种方法可以解决(我选择了第一种):

  1. 使ViewHolder非内部类-这意味着它不再可以访问适配器的方法/属性:

    public class Adapter {
    
        public class ViewHolder(private val adapter: Adapter) {
    
            private companion object {
                private const val TYPE_IN_PROGRESS = 1
                private const val TYPE_CANCELLED = 2
                private const val TYPE_FINISHED = 3
            }
        }
    }
    
  2. 在适配器中定义常量:

    public class Adapter {
        private const val TYPE_IN_PROGRESS = 1
        private const val TYPE_CANCELLED = 2
        private const val TYPE_FINISHED = 3
    
        public class ViewHolder(private val adapter: Adapter) {
            // ..
        }
    }
    

注意:请勿将您的const val转换为val,因为它将绑定到您的类实例(这很糟糕。More about it here)。