2015-09-05 2 views
0

Возможно ли изменить значение поля val? Если это так, это делается только через конструкторы и нигде в программе? Использование val означает, что память не может быть изменена? Например: val x = 5 Могу ли я снова использовать x, чтобы указать другое местоположение с различным значением?Изменение значения поля val

ответ

7

Вкратце: Нет, вы не можете. Это пункт непреложности, гарантирующий, что вы можете всегда быть уверенным, что значение остается неизменным.

Вот почему есть опция immutables [Vals] и mutables [вары] это гибкая и позволяет выбрать в зависимости от ваших потребностей. Выберите свой выбор и действуйте с его правилами.

3

Если вы хотите поле, чтобы быть изменяемым, вы должны объявить его как var вместо val. Если по какой-то причине вы не можете изменить на var и по-прежнему необходимо изменить его значение, вы можете сделать это с помощью отражения. не

class ModifyVal { 
    val x = 5 
} 

object ModifyVal { 
    def main(args: Array[String]): Unit = { 
    val instance = new ModifyVal() 
    println(instance.x) // 5 
    // instance.x = 10 doesn't compile: Reassignment to val 
    val fieldX = instance.getClass.getDeclaredField("x") 
    fieldX.setAccessible(true) 
    fieldX.setInt(instance, 10) 
    println(instance.x) // 10 
    } 
} 
2

По общему правилу (не прибегая к искривлениям, что деформирует намерение языка), нет, вы не можете изменить val, не должны вы хотите. Вместо этого, если вы хотите придерживаться функционального стиля программирования, подумайте о создании копии содержащего экземпляра с измененным значением для поля val. Классы Дело уже в этом помочь, предоставляя copy конструктор для того, чтобы такого рода манипуляции:

case class Person(name: String, age: Int) { 
    def birthday = copy(age = age + 1) // returns a new Person with the same name, but one year older 
} 
2

вал, грубо говоря, означает постоянную (окончательный в Java).

При объявлении, вал должны быть назначены на то, либо значение

val name: String // compilation error 
val name : String = "Hello" 

или ничего (хотя никто этого не делает)

val name : String = _ 

После Вэл назначен, он не может переназначить.

Неизменимость - полезная характеристика, которая сильно поддерживается Scala. Это способствует написанию кода, который не содержит побочных эффектов и потокобезопасности. Вот почему Scala - хороший выбор для масштабируемых и параллельных приложений.

Особый вид непреложности в Scala - будущее. Будущее является контейнером с однократной записью - после того, как будущее будет завершено, оно является фактически неизменным.

Смежные вопросы