我是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)
但仍然阻止调用者修改类的内部(至少尽可能多)。例如,删除元素或清除支持列表。
答案 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。