首页 文章

Kotlin:在API中公开不可变列表

提问于
浏览
4

我是Kotlin的新手,我正在努力解决返回内部可变列表的不可变版本的问题 .

我查看了以下'Kotlin: Modifying (immutable) List through cast, is it legitimate?',并了解不可变列表实际上只是只读视图,不会公开修改方法 .

我希望有一个暴露“不可变”列表的类,并且仍然希望利用Kotlins自动获取器(无需提供获取列表或列表成员的所有样板)

以下是一个坏主意(或将导致可能在将来的版本中阻止的问题)

class Foo {
  val names: List<String> = LinkedList;

  fun addName(name: String) {
    (names as LinkedList).add(name)
  }
}

我希望允许(例如):

val foo = Foo;
  println(foo.names.size)

但仍然阻止调用者修改类的内部(至少尽可能多) . 例如,删除元素或清除支持列表 .

2 回答

  • 0

    以下作品:

    class Foo {
        private val _names: MutableList<String> = mutableListOf()
        val names: List<String>
            get() = _names.toList()
    
        fun addName(name: String) {
            _names.add(name)
        }
    }
    

    toList意味着如果他们将它转换为 MutableList<String> 并尝试添加到它,他们将获得 UnsupportedOperationException_names 字段保存真实数据,外部访问通过names属性完成

  • 5

    将可变列表定义为具有下划线的私有属性(Kotlin中的一种“字段”),并通过另一个公共只读属性公开它 .

    如果“字段”是只读的,这将成功(由@JWT建议):

    class Foo {
        private val _names: MutableList<String> = mutableListOf()
        val names: List<String> = _names
    
        fun addName(name: String) {
            _names.add(name)
        }
    }
    

    如果"field"可能被重新分配,则需要将getter定义为函数(注意 var _names ):

    class Foo2 {
        private var _names: MutableList<String> = mutableListOf()
        val names: List<String>
            get() = _names
    
        fun addName(name: String) {
            _names.add(name)
        }
    
        fun reset() {
            _names = mutableListOf()
        }
    }
    

    测试可用here .

相关问题