Инициализировать конечную переменную перед конструктором в Java - PullRequest
7 голосов
/ 24 марта 2009

Есть ли решение использовать конечную переменную в конструкторе Java? Проблема в том, что если я инициализирую последнее поле, например:

private final String name = "a name";

тогда я не могу использовать его в конструкторе. Сначала Java запускает конструктор, а затем поля. Есть ли решение, которое позволяет мне получить доступ к последнему полю в конструкторе?

Ответы [ 9 ]

17 голосов
/ 24 марта 2009

Я не очень понимаю ваш вопрос. Это

public class Test3 {
    private final String test = "test123";

    public Test3() {
        System.out.println("Test = "+test);
    }

    public static void main(String[] args) {
        Test3 t = new Test3();
    }
}

выполняется следующим образом:

$ javac Test3.java && java Test3
Test = test123
15 голосов
/ 24 марта 2009

Выполните инициализацию в конструкторе, например,

private final String name;
private YourObj() {
    name = "a name";
}

Конечно, если вы действительно знаете значение во время объявления переменной, имеет смысл сделать его постоянным, например,

private static final String NAME = "a name";
5 голосов
/ 09 сентября 2011

Мы уходим от вопроса.

Да, вы можете использовать переменную private final. Например:

public class Account {
    private final String accountNumber;
    private final String routingNumber;

    public Account(String accountNumber, String routingNumber) {
        this.accountNumber = accountNumber;
        this.routingNumber = routingNumber;
    }
}

Это означает, что класс Account имеет зависимость от двух строк: счета и номеров маршрутизации. Значения этих атрибутов класса ДОЛЖНЫ быть установлены при создании класса Account, и их число нельзя изменить без создания нового класса.

Модификатор 'final' делает атрибуты неизменяемыми.

3 голосов
/ 24 марта 2009

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

private static final String name = "a_name";

возможно также использовать статический блок инициализации.

private static final String name;

static { name = "a_name"; }

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

private String name = "a_name";
Foo( String name )
{
    this.name = name;
}

или

private final String name;

Foo( String name )
{
    if( s == null )
       this.name = "a_name";
    else
       this.name = name;
}
2 голосов
/ 24 марта 2009

Другая возможность - инициализировать поле в блоке инициализатора экземпляра:

public class Foo {
        final String bar;

        {
                System.out.println("initializing bar");
                bar = "created at " + System.currentTimeMillis();
        }

        public Foo() {
                System.out.println("in constructor. bar=" + bar);

        }

        public static void main(String[] args) {
                new Foo();
        }
}
2 голосов
/ 24 марта 2009

В этом случае вы также можете пометить поле как «статическое».

1 голос
/ 24 марта 2009
private static final String name = getName();

где getName () - статическая функция, которая возвращает вам имя.

1 голос
/ 24 марта 2009

В этом случае вы также можете сделать его статичным. И соглашение Java состоит в том, чтобы называть такие константы в ALL_CAPS.

0 голосов
/ 24 марта 2009

Я не могу использовать его в конструкторе, в то время как Java сначала запускает конструктор, а затем поля ...

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

public class A {
    protected int member = 1;
    public A() {
        System.out.println(member);
    }
}

Ключевое слово final просто отмечает константу члена, в противном случае оно обрабатывается как любой другой член.

EDIT: вы пытаетесь установить значение в конструкторе? Это не сработает, поскольку член является неизменным, если он определен как final.

...