Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 科特林的接球手和二传手_Kotlin_Getter Setter - Fatal编程技术网

Kotlin 科特林的接球手和二传手

Kotlin 科特林的接球手和二传手,kotlin,getter-setter,Kotlin,Getter Setter,例如,在Java中,我可以自己编写Getter(由IDE生成),或者在lombok中使用@Getter之类的注释,这非常简单 然而,科特林没有。 但我不知道如何使用它们 我想让它,比方说-类似于Java: private val isEmpty: String get() = this.toString() //making this thing public rises an error: Getter visibility must be the same as proper

例如,在Java中,我可以自己编写Getter(由IDE生成),或者在lombok中使用@Getter之类的注释,这非常简单

然而,科特林没有。 但我不知道如何使用它们

我想让它,比方说-类似于Java:

private val isEmpty: String
        get() = this.toString() //making this thing public rises an error: Getter visibility must be the same as property visibility.

那么getter是如何工作的呢

在Kotlin中自动生成getter和setter。如果你写:

val isEmpty: Boolean
它等于以下Java代码:

private final Boolean isEmpty;

public Boolean isEmpty() {
    return isEmpty;
}
在您的情况下,私有访问修饰符是冗余的-默认情况下,isEmpty是私有的,并且只能由getter访问。当您试图获取对象的isEmpty属性时,可以调用实函数中的get方法。为了更好地理解Kotlin中的getter/setter,下面的两个代码示例是相同的:

var someProperty: String = "defaultValue"

我还想指出,getter中的
this
不是您的属性,而是类实例。如果要访问getter或setter中的字段值,可以使用保留字
字段

val isEmpty: Boolean
  get() = field
如果您只想在公共访问中使用get方法,则可以编写以下代码:

var isEmpty: Boolean
    private set 

由于set访问器附近有private修饰符,因此只能在对象内部的方法中设置此值。

有关属性访问器的规则如下:

  • var
    val
    属性的Getter可见性应与属性的可见性完全相同,因此只能显式复制属性修饰符,但这是多余的:

    protected val x: Int
        protected get() = 0 // No need in `protected` here.
    
  • var
    属性的Setter可见性应与属性可见性相同或更少的权限

    protected var x: Int
        get() = 0
        private set(x: Int) { } // Only `private` and `protected` are allowed.
    
在Kotlin中,属性总是通过getter和setter进行访问,因此不需要像Java中那样使用
public
访问器使属性
私有化。因此,属性访问器上的可见性修饰符仅用于降低setter可见性的权限:

  • 对于具有支持字段和默认访问器的属性:

    var x = 0 // `public` by default
        private set
    
  • 对于没有支持字段的属性:

    var x: Int // `public` by default
        get() = 0
        protected set(value: Int) { }
    

默认情况下,kotlin中的Getter是public,但是您可以将setter设置为private,并通过在类中使用一个方法来设置值。像这样

/**
* Created by leo on 17/06/17.*/

package foo
class Person() {
var name: String = "defaultValue"
               private set

fun foo(bar: String) {
    name = bar // name can be set here
       }
}

fun main(args: Array<String>) {
  var p = Person()
  println("Name of the person is ${p.name}")
  p.foo("Jhon Doe")
  println("Name of the person is ${p.name}")
}
/**
*由leo于2017年6月17日创建*/
打包食品
班主任(){
变量名称:String=“defaultValue”
专用设备
fun-foo(酒吧:字符串){
name=bar//可以在此处设置名称
}
}
趣味主线(args:Array){
var p=个人()
println(“此人的姓名为${p.Name}”)
p、 富(Jhon Doe)
println(“此人的姓名为${p.Name}”)
}

有关更多信息,请参见本教程:

性质

在Kotlin世界中,类不能有字段,只能有属性。变量 关键字告诉我们属性是可变的,与val相反 请参见一个示例:

class Contact(var number: String) {

   var firstName: String? = null
   var lastName: String? = null
   private val hasPrefix : Boolean
       get() = number.startsWith("+")

}
虽然代码不多,但很多事情都发生在 场景我们将一步一步地进行。首先,我们创建了一个 公开期末课程联系人。

这是我们必须面对的主要规则:如果没有另行规定, 默认情况下,类是公共的和最终的(顺便说一下,对于 类方法)。如果要从类继承,请将其标记为open 关键词

1) Kotlin中属性
firstName
的默认设置
getter
示例

class Person {
    var firstName: String = ""
            get() = field       // field here ~ `this.firstName` in Java or normally `_firstName` is C#
            set(value) {
                field = value
            }

}
使用

如果您的
setter
getter
与上面的完全相同,您可以删除它,因为它是不必要的

2) 示例自定义setter和getter

const val PREFIX = "[ABC]"

class Person {

    // set: if value set to first name have length < 1 => throw error else add prefix "ABC" to the name
    // get: if name is not empty -> trim for remove whitespace and add '.' else return default name
    var lastName: String = ""
        get() {
            if (!field.isEmpty()) {
                return field.trim() + "."
            }
            return field
        }
        set(value) {
            if (value.length > 1) {
                field = PREFIX + value
            } else {
                throw IllegalArgumentException("Last name too short")
            }
        }
}
const val PREFIX=“[ABC]”
班主任{
//set:如果设置为first name的值的长度<1=>则抛出错误,否则在名称中添加前缀“ABC”
//获取:如果名称不为空->删除空白并添加“.”的修剪,否则返回默认名称
var lastName:String=“”
得到(){
如果(!field.isEmpty()){
返回字段。trim()+“”
}
返回场
}
设置(值){
如果(value.length>1){
字段=前缀+值
}否则{
抛出IllegalArgumentException(“姓氏太短”)
}
}
}
使用

val p=Person()
p、 lastName=“DE”//input带有许多空白
println(p.lastName)//输出:[ABC]DE。
p、 lastName=“D”//IllegalArgumentException,因为名称长度<1
更多
我开始从Java学习Kotlin,所以我对
字段
属性
感到困惑,因为Java中没有
属性

经过一些搜索,我看到Kotlin中的
字段
属性
看起来像C#()

下面是一些相关的帖子,讨论Java和Kotlin中的
字段
属性



如果我错了,请纠正我。希望能有所帮助

这里是一个实际的Kotlin getter和setter示例(请参阅更多详细信息):


在您的情况下,私有访问修饰符是冗余的
如何?Kotlin文档的默认修饰符为public@没什么是的,它看起来像公共字段,但在引擎盖下调用getter方法,
val isEmpty:Boolean
将不会编译,因为isEmpty尚未初始化,对吗?刚开始学习科特林。还有,
get()=field
?很好的解释,Kotlin文档很难理解,除非您已经熟悉该语言……为什么Kotlin不经常使用私有修饰符。似乎所有库的变量都是公共的。一个库可以设置并获取不同的类型吗?将
x
设置为some
“some String”
,并返回字符串的长度
11
。@Carel,否,到目前为止,不支持此用例:属性的访问器应使用
val p = Person()
p.firstName = "A"  // access setter
println(p.firstName) // access getter (output:A)
const val PREFIX = "[ABC]"

class Person {

    // set: if value set to first name have length < 1 => throw error else add prefix "ABC" to the name
    // get: if name is not empty -> trim for remove whitespace and add '.' else return default name
    var lastName: String = ""
        get() {
            if (!field.isEmpty()) {
                return field.trim() + "."
            }
            return field
        }
        set(value) {
            if (value.length > 1) {
                field = PREFIX + value
            } else {
                throw IllegalArgumentException("Last name too short")
            }
        }
}
val p = Person()
p.lastName = "DE         " // input with many white space
println(p.lastName)  // output:[ABC]DE.
p.lastName = "D" // IllegalArgumentException since name length < 1
// Custom Getter
val friendlyDescription get(): String {
    val isNeighborhood = district != null
    var description = if (isNeighborhood) "Neighborhood" else "City"
    description += " in"
    if (isNeighborhood) {
        description += " $city,"
    }
    province?.let {
        if (it.isNotEmpty()) {
            description += " $it,"
        }
    }
    description += " $country"
    return description
}

print(myLocation.friendlyDescription) // "Neighborhood in Denver, Colorado, United States"


// Custom Setter
enum class SearchResultType {
    HISTORY, SAVED, BASIC
}

private lateinit var resultTypeString: String

var resultType: SearchResultType
    get() {
        return enumValueOf(resultTypeString)
    }
    set(value) {
        resultTypeString = value.toString()
    }

result.resultType = SearchResultType.HISTORY
print(result.resultTypeString) // "HISTORY"