我是Kotlin的新人,但我在Java方面有很多经验。
问题的背景很少......我有一个具有MutableList属性的类。
class ModesAdapter(val modes : MutableList<Mode> = mutableListOf()) : RecyclerView.Adapter<ModeViewHolder>()
我希望能够设置此属性,但禁止(或限制)获取操作。在Java中它就像:
class ModesAdapter extends RecyclerView.Adapter<ModeViewHolder>{
private final List<Mode> modes;
public ModesAdapter() {
modes = new ArrayList<Mode>();
}
public ModesAdapter(List<Mode> modes) {
this.modes = modes;
}
public void updateModes(List<Mode> modes) {
this.modes.clear();
this.modes.addAll(modes);
notifyDatasetChanged();
}
}
对于Kotlin,我有两种可能的选择。
选项#1。使用Kotlin提供的get / set方法+支持属性。在这种情况下,我需要覆盖一个get方法来返回不可变列表。
class ModesAdapter(modes : MutableList<Mode> = mutableListOf()) : RecyclerView.Adapter<ModeViewHolder>(){
private val _modes : MutableList<Mode> = modes
var modes : List<Mode>
get() = _modes.toList()
set(value) {
_modes.clear()
_modes.addAll(value)
notifyDataSetChanged()
}
}
理想情况下,我必须删除get
或将其设为私有,但由于var modes
的可见性,我无法执行此操作。要更新模式,我只需要:
val modesAdapter = ModesAdapter()
modesAdapter.modes = mutableListOf<Mode>(Mode("Mode 1"))
选项#2。只要扔掉所有Kotlin的东西并使用&#34; Java方法&#34;。
class ModesAdapter(private val modes : MutableList<Mode> = mutableListOf()) : RecyclerView.Adapter<ModeViewHolder>(){
fun updateModes(modes : List<Mode>) {
this.modes.clear()
this.modes.addAll(modes)
notifyDataSetChanged()
}
要在这种情况下访问模式,我需要:
val modesAdapter = ModesAdapter()
modesAdapter.updateModes(mutableListOf<Mode>(Mode("Mode 1")))
也许第二种方法更清晰,代码行更少,但第一种方法看起来更多&#34; Kotlin风格&#34;:我们有一个属性和单独的setter / getter。
那么从Kotlin的意识形态角度来看,实现上述行为的正确方法是什么?也许你可以建议你自己的正确选择(顺便说一句,这会很好)。