문제

Java 생성자에서 최종 변수를 사용하는 솔루션이 있습니까? 문제는 다음과 같은 최종 필드를 초기화한다는 것입니다.

private final String name = "a name";

그런 다음 생성자에서 사용할 수 없습니다. Java는 먼저 생성자를 실행 한 다음 필드를 실행합니다. 생성자의 최종 필드에 액세스 할 수있는 솔루션이 있습니까?

도움이 되었습니까?

해결책

나는 당신의 질문을 정말로 이해하지 못합니다. 저것

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

다른 팁

생성자에서 초기화를 수행하십시오 (예 :

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

물론 변수 선언 시간에 값을 실제로 알고 있다면 일정하게 만드는 것이 더 합리적입니다.

private static final String NAME = "a name";

우리는 질문에서 벗어나고 있습니다.

예, 사용할 수 있습니다 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;
    }
}

이것이 의미하는 바는 계정 클래스가 두 문자열, 계정 및 라우팅 번호에 의존한다는 것입니다. 이 클래스 속성의 값은 계정 클래스가 구성 될 때 설정해야하며 새 클래스를 작성하지 않고는이 숫자를 변경할 수 없습니다.

여기서 '최종'수정자는 속성을 불변으로 만듭니다.

정적으로 표시하면 생성자에서 사용할 수 있지만 최종적으로 만들었으므로 변경할 수 없습니다.

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

이 경우 필드를 '정적'으로 표시 할 수도 있습니다.

또 다른 가능성은 인스턴스 이니셜 라이저 블록에서 필드를 초기화하는 것입니다.

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

이 경우 정적으로 만들 수도 있습니다. 그리고 Java 협약은 All_caps에서 그러한 상수를 지명하는 것입니다.

private static final String name = getName();

어디 getName () 이름을 얻는 정적 함수입니다.

Java는 생성자에서 사용할 수 없지만 Java는 먼저 생성자를 실행합니다.

이것은 정확하지 않습니다. 필드는 먼저 평가됩니다. 그렇지 않으면 초기화되지 않기 때문에 생성자의 멤버의 기본값에 액세스 할 수 없습니다. 이것 하다 일하다:

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

키워드 결정적인 회원을 상수로 표시하면 다른 구성원으로 취급됩니다.

편집 : 당신은 노력하고 있습니까? 세트 생성자의 값? 회원은 최종으로 정의 된 경우 불변이 아니기 때문에 작동하지 않을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top