Kotlin:在API

时间:2017-10-14 00:39:08

标签: collections kotlin

我是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 :(得分:5)

以下作品:

url: 'https://www.googleapis.com/youtube/v3/videos',
      idKey: 'videoId',
      method: 'GET',
      ...

        return this.http.get(this.url, options)
          .map(response => response.json())
          .catch(this.handleError)
          .do(res => {
            // This does not run...
            console.log('returned video details');
          });

toList表示如果他们将其转换为 function json() { if(document.getElementById('name').length >= 9) { var msgJson = { "text": "succes", }; send(msgJson); } } 并尝试添加到#include <iostream> #include <fstream> #include <string> #include <sstream> using namespace std; int main() { string filename; cout << "What is the name of the file?"; cin >> filename; ifstream readFile; readFile.open(filename); int rows; readFile >> rows; cout << rows << endl; //----------------------------------- ofstream toStudent("Student.txt"), toStaff("Staff.txt"), toProfessor("Professor.txt"); int dummy; string word, line; while ( std::getline(readFile, line) ){ std::istringstream iss(line); iss >> dummy >> word; if ( word == "Student") toStudent << line << endl; else if ( word == "Staff" ) toStaff << line << endl; else if ( word == "Professor" ) toProfessor << line << endl; } return 0; } ,则会class Foo { private val _names: MutableList<String> = mutableListOf() val names: List<String> get() = _names.toList() fun addName(name: String) { _names.add(name) } } MutableList<String>字段保存实际数据,外部访问权限为通过名称属性

完成

答案 1 :(得分:0)

将可变列表定义为带有下划线的私有属性(一种&#34;字段&#34;在Kotlin中)并通过另一个公共只读属性公开它。

如果&#34;字段&#34;是只读的,这将成功 (@JWT建议):

class Foo {
    private val _names: MutableList<String> = mutableListOf()
    val names: List<String> = _names

    fun addName(name: String) {
        _names.add(name)
    }
}

如果&#34;字段&#34;可能会被重新分配,它需要将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