Inicializovat konečné proměnné před konstruktéra v Javě

hlasů
7

Existuje řešení použít konečné proměnné v konstruktoru Java? Problém je v tom, že když jsem inicializovat konečné pole, jako jsou:

private final String name = a name;

Pak jsem nelze použít v konstruktoru. Java nejprve spustí konstruktor a potom v poli. Existuje řešení, které mi umožňuje přístup k finální pole v konstruktoru?

Položena 24/03/2009 v 15:16
zdroj uživatelem
V jiných jazycích...                            


9 odpovědí

hlasů
17

Nemám opravdu pochopit vaši otázku. Že

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();
    }
}

provádí takto:

$ javac Test3.java && java Test3
Test = test123
Odpovězeno 24/03/2009 v 15:20
zdroj uživatelem

hlasů
15

Proveďte inicializaci v konstruktoru, například,

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

Samozřejmě, pokud jste skutečně znát hodnotu v proměnné čase deklarace, to dává větší smysl, aby bylo konstantní, např

private static final String NAME = "a name";
Odpovězeno 24/03/2009 v 15:18
zdroj uživatelem

hlasů
5

Dostáváme od otázky.

Ano, můžete použít private finalproměnnou. Například:

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

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

To znamená, že třída účet má závislost na dva řetězce, účet a čísla směrování. Hodnoty těchto atributů třídy musí být nastaven, je konstruován třídy účtu, a to číslo nemůže být změněn bez vytvoření nové třídy.

Dále jen ‚konečná‘ modifikátor tady dělá atributy neměnné.

Odpovězeno 09/09/2011 v 14:59
zdroj uživatelem

hlasů
3

Značení je statická, vám umožní použít v konstruktoru, ale protože jste udělali to konečná, nemůže být změněn.

private static final String name = "a_name";

je možné použít statický init blok stejně.

private static final String name;

static { name = "a_name"; }

Pokud se snažíte změnit hodnotu v konstruktoru, pak nelze přiřadit výchozí hodnotu, nebo budete muset dělat to není konečný.

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

nebo

private final String name;

Foo( String name )
{
    if( s == null )
       this.name = "a_name";
    else
       this.name = name;
}
Odpovězeno 24/03/2009 v 15:21
zdroj uživatelem

hlasů
2

Další possiblity je inicializovat pole v instanci inicializátoru blok:

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();
        }
}
Odpovězeno 24/03/2009 v 15:55
zdroj uživatelem

hlasů
2

V tomto případě můžete označit oblast jako ‚statické‘ také.

Odpovězeno 24/03/2009 v 15:18
zdroj uživatelem

hlasů
1
private static final String name = getName();

kde getName () je statická funkce, která vás dostane jméno.

Odpovězeno 24/03/2009 v 15:21
zdroj uživatelem

hlasů
1

V takovém případě můžete také aby bylo statické, příliš. A Java konvence je pojmenovat tyto konstanty v ALL_CAPS.

Odpovězeno 24/03/2009 v 15:18
zdroj uživatelem

hlasů
0

Nemohu použít v konstruktoru, zatímco java prvním spuštění konstruktoru pak pole ...

To není správné, pole jsou hodnoceny jako první, jinak byste nemohli přistupovat k žádným výchozí hodnoty členů ve svých konstruktérů, protože by nebylo možné inicializovat. To dělá práci:

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

Klíčové slovo konečné pouze označí člen konstantní, je považován za jiného člena jinak.

EDIT: Snažíte se nastavit hodnotu v konstruktoru? To by nešlo, protože člen je neměnný pokud je definována jako konečná.

Odpovězeno 24/03/2009 v 15:51
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more