Невозможно присвоить значение конечной переменной name - PullRequest
0 голосов
/ 03 октября 2018

Почему Java не позволяет мне косвенно инициализировать конечные переменные?Я не понимаю, почему он не должен работать, я имею в виду, что метод всегда будет запускаться, поэтому какая разница, если он будет инициализирован напрямую или через метод?

Этот код работает:

package com.company;

public class Person {

    private final String name;

    public Person() {
        name = "bob";
    }
}

Этот не делает.(даже если я избавлюсь от кода ввода-вывода и жестко закодирую значение, присвоенное имени)

package com.company;

import java.util.Scanner;

public class Person {

    private final String name;

    public Person() {
        askName();
    }

    public void askName() {
        Scanner scanner = new Scanner(System.in);
        name = scanner.nextLine();
    }
}

Ответы [ 5 ]

0 голосов
/ 03 октября 2018

final поля должны быть установлены в конструкторе.Что вы можете сделать, это следующее.

import java.util.Scanner;

public class Person {

    private final String name;

    public Person() {
        name = askName();
    }

    public static String askName() {
        Scanner scanner = new Scanner(System.in);
        return scanner.nextLine();
    }
}

Тем не менее, лучший вариант может ввести нужное вам значение.

import java.util.Scanner;

public class Person {

    private final String name;

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

    public static Person askName() {
        Scanner scanner = new Scanner(System.in);
        return new Person(scanner.nextLine());
    }
}
0 голосов
/ 03 октября 2018

Это здравый смысл.Инициализировать окончательную переменную можно только один раз.

Конструктор может быть вызван только один раз, поэтому, если переменная не является статической, ее можно инициализировать здесь.

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

0 голосов
/ 03 октября 2018

Вы можете инициализировать конечную переменную в 4 местах.

  • с объявлением
  • в конструкторе (только нестатический)
  • в статическом инициализаторе (только для статического)
  • в инициализаторе экземпляра (только нестатический)

конечная статическая переменная

Эти переменные могут быть инициализированы либо в объявлении, либо в статическом инициализаторе.

class Program {
    static final int i1 = 10;
    static final int i2;
    static {
        i2 = 10;
    }
}

конечная переменная

конечные переменные могут быть инициализированы в объявлении, инициализаторе экземпляра или конструкторе:

class Program {
    final int i1 = 10;
    final int i2;
    final int i3;
    {
        i2 = 10;
    }

    Program() {
        i3 = 10;
    }
}

локальные конечные переменные

Эти переменные могутинициализироваться в декларации или в любом месте после ее декларации.Локальные конечные переменные должны быть инициализированы перед использованием.

class Program {
    void method() {
         final int i1 = 10;
         final int i2;
         System.out.println(i1);
         i2 = 10;
         System.out.println(i2);
         return ;
    }
}
0 голосов
/ 03 октября 2018

Это потому, что конечные переменные не могут быть инициализированы в методе.Его нужно инициализировать в конструкторе при объявлении только или только в статических блоках.

0 голосов
/ 03 октября 2018

Вы можете присвоить значения переменным конечного члена только в 4 местах:

  1. В точке объявления

  2. В конструкторе

  3. В статическом блоке инициализации (если переменная является статической)

  4. В блоке инициализации (если переменная не является статической)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...