Java의 생성자 전에 최종 변수를 초기화하십시오
-
21-08-2019 - |
문제
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);
}
}
키워드 결정적인 회원을 상수로 표시하면 다른 구성원으로 취급됩니다.
편집 : 당신은 노력하고 있습니까? 세트 생성자의 값? 회원은 최종으로 정의 된 경우 불변이 아니기 때문에 작동하지 않을 것입니다.