Как получить доступ к полям из вспомогательных конструкторов в Scala? - PullRequest
1 голос
/ 09 октября 2019

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

Мой вопрос заключается в том, как получить доступ к полям из вспомогательных конструкторов, как мы делаем в Java.

Чтобы прояснить ситуацию, позвольте мне привести простой пример на Java.

public class Person {
  private String firstName;
  private String lastName;

  public Person() {
    // No arg constructor
  }

  public Person(String firstName) {
    this.firstName = firstName;
  }

  public Person(String firstName, String lastName) {
    this(firstName);
    this.lastName = lastName;
  }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

Тестовый класс приведен ниже.

public class TestPerson {
  public static void main(String[] args) {
    Person p = new Person("Sambit");
    System.out.println("First Name: " + p.getFirstName());
    System.out.println("Last Name: " + p.getLastName());//<--- last name may be null
  }
}

Как вы можете видеть, основываясь на требованиях,Я могу добавить новые конструкторы и поля с помощью методов установки геттера для доступа. Как я могу сделать это в Scala, я здесь не использую case case.

Мой эквивалентный класс scala приведен ниже.

class Person {

  def this(firstName: String) {
    this();
  }

  def this(firstName: String, lastName: String) {
    this(firstName);
  }
}

object TestPerson {
  def main(args: Array[String]): Unit = {
    var p: Person = new Person("Sambit", "Mishra");
    println("Person: " + p)
    println("Person Last Name: " + p); <--- Here I can not access last name,
  }
}

1 Ответ

5 голосов
/ 09 октября 2019

В вашем примере вы создаете класс с двумя конструкторами, но без каких-либо полей. Таким образом, эквивалентным в Java было бы создание класса с конструкторами с параметрами, а затем без присвоения этих параметров каким-либо полям.

Вы можете создать класс с 3 конструкторами следующим образом:

//Here we declare that our class would have two fields.
//It also created primary constructor, which takes 2 arguments

class Person(val firstName: String, val lastName: String) {

  def this(firstName: String) { //second constructor
    this(firstName, "");
  }

  def this() { //third constructor
    this("");
  }
}

AС другой стороны, в Scala редко требуется создавать дополнительные конструкторы, потому что вы можете определить значения по умолчанию для ваших полей:

class Person(val firstName: String = "", val lastName: String = "")

new Person()
new Person("fn")
new Person("fn","ln")

Если вы не можете придумать пригодное для использования значение по умолчанию для своего поля, но вывсе еще хотите сделать его необязательным, вы можете использовать Option:

class Person(val firstName: String, val lastName: Option[String] = None)

new Person("fn")
new Person("fn",Some("ln"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...