Question

Y at-il une solution à utiliser une variable finale dans un constructeur Java? Le problème est que si j'initialiser un dernier champ comme:

private final String name = "a name";

alors je ne peux pas l'utiliser dans le constructeur. Java se dirige d'abord le constructeur, puis les champs. Y at-il une solution qui me permet d'accéder au dernier champ dans le constructeur?

Était-ce utile?

La solution

Je ne comprends pas vraiment votre question. Ce

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

est exécuté comme suit:

$ javac Test3.java && java Test3
Test = test123

Autres conseils

Faites l'initialisation dans le constructeur, par exemple.

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

Bien sûr, si vous connaissez réellement la valeur au moment de la déclaration variable, il est plus logique de faire une constante, par exemple.

private static final String NAME = "a name";

Nous nous écartons de la question.

Oui, vous pouvez utiliser une variable private final. Par exemple:

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

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

Ce que cela signifie est que la classe compte a une dépendance sur les deux chaînes, compte et numéros de routage. Les valeurs de ces attributs de classe DOIT être réglé lorsque la classe de compte est construit, et ce nombre ne peuvent être modifiés sans créer une nouvelle classe.

Le modificateur 'final' fait ici les attributs immuables.

La marquer statique, vous permettra de l'utiliser dans le constructeur, mais depuis que vous l'avez fait final, il ne peut pas être changé.

private static final String name = "a_name";

est est possible d'utiliser un bloc d'initialisation statique ainsi.

private static final String name;

static { name = "a_name"; }

Si vous essayez de modifier la valeur dans le constructeur, alors vous ne pouvez pas attribuer une valeur par défaut ou vous devez le faire pas définitif.

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

ou

private final String name;

Foo( String name )
{
    if( s == null )
       this.name = "a_name";
    else
       this.name = name;
}

Dans ce cas, vous pouvez marquer le champ comme « statique » aussi.

Une autre possibilité consiste à initialiser le champ dans une instance initialiseur bloc:

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

Dans ce cas, vous pourriez aussi bien le rendre statique, aussi. Et convention Java est de nommer ces constantes dans ALL_CAPS.

private static final String name = getName();

getName () est une fonction statique que vous obtient le nom.

  

Je ne peux pas l'utiliser dans le constructeur, alors que java se dirige d'abord le constructeur un puis les champs ...

Ce n'est pas correct, les champs sont évalués en premier, sinon on ne peut pas accéder à toutes les valeurs par défaut des membres dans vos constructeurs, car ils ne seraient pas initialisés. Cette fait travail:

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

Le mot-clé finale simplement marque la constante de membre, il est traité comme tout autre membre autrement.

EDIT: Vous essayez de set la valeur dans le constructeur? Cela ne fonctionnerait pas, puisque le membre est immuable si elle est définie comme définitive.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top