Java: 정적 초기화 블록은 언제 유용합니까?
에서의 초기화의 차이점은 무엇입니까?static
삭제:
public class staticTest {
static String s;
static int n;
static double d;
static {
s = "I'm static";
n = 500;
d = 4000.0001;
}
...
개별 정적 초기화:
public class staticTest {
static String s = "I'm static";
static int n = 500;
static double d = 4000.0001;
....
스태틱 초기화 블록을 사용하면 예를 들어 다음과 같은 조건을 사용하여 보다 복잡한 초기화가 가능합니다.
static double a;
static {
if (SomeCondition) {
a = 0;
} else {
a = 1;
}
}
또한 빌드만을 필요로 하는 것이 아니라 빌더를 사용하여 인스턴스를 작성할 때 예외 처리 또는 정적 필드 작성 이외의 작업이 필요합니다.
스태틱 초기화 블록은 인라인 스태틱인테셜라이저 뒤에 실행되므로 다음 사항이 유효합니다.
static double a;
static double b = 1;
static {
a = b * 4; // Evaluates to 4
}
try은 try/catch block 내에서 할 수 .static{}
같이 .
MyCode{
static Scanner input = new Scanner(System.in);
static boolean flag = true;
static int B = input.nextInt();
static int H = input.nextInt();
static{
try{
if(B <= 0 || H <= 0){
flag = false;
throw new Exception("Breadth and height must be positive");
}
}catch(Exception e){
System.out.println(e);
}
}
}
PS: 여기서 언급!
일반적인 사용법:
private final static Set<String> SET = new HashSet<String>();
static {
SET.add("value1");
SET.add("value2");
SET.add("value3");
}
스태틱 이니셜라이저 없이 어떻게 할 수 있을까요?
초기화 중 예외 처리도 원인 중 하나입니다.예를 들어 다음과 같습니다.
static URL url;
static {
try {
url = new URL("https://blahblah.com");
}
catch (MalformedURLException mue) {
//log exception or handle otherwise
}
}
이는 위와 같이 체크된 예외 또는 예외 발생 가능성이 높은 복잡한 초기화 로직을 성가시게 던지는 생성자에게 유용합니다.
생성자를 사용하여 조건부로 인스턴스 변수를 초기화합니다.
클래스/정적 변수를 조건부로 초기화하고 객체를 작성하지 않고 이를 수행하려면(컨스트럭터는 객체를 작성할 때만 호출할 수 있음) 정적 블록이 필요합니다.
static Scanner input = new Scanner(System.in);
static int widht;
static int height;
static
{
widht = input.nextInt();
input.nextLine();
height = input.nextInt();
input.close();
if ((widht < 0) || (height < 0))
{
System.out.println("java.lang.Exception: Width and height must be positive");
}
else
{
System.out.println("widht * height = " + widht * height);
}
}
정적 변수에 값을 할당하는 것 이상의 작업을 수행할 수 있습니다.클래스 본문에 임의의 문을 넣을 수 없기 때문에 정적 이니셜라이저 블록을 사용할 수 있습니다.
단, 첫 의 표현으로 할 수 를 들어, '일부러'입니다).List<String>
은 그 a로 잘 표현된다.for
입니다.Method
존재하지 않을 수 있으므로 예외 지정이 필요합니다.) 및/또는 정적 필드를 특정 순서로 설정해야 합니다.
static
singleton instance를 초기화하는 데 블록을 사용하여 동기화된 사용을 방지할 수 있습니다. getInstance()
★★★★★★ 。
엄밀히 말하면, 넌 그것 없이도 도망칠 수 있어.스태틱한 방법으로 이행하기 위해서, 멀티 라인 초기화 코드를 선호하는 사람도 있습니다.비교적 간단한 멀티 스테이트 초기화를 위해 정적 이니셜라이저를 사용하는 것이 매우 만족스럽습니다.
저는 거의 final
수정할 수 없는 개체를 가리킵니다.
static 키워드(변수인지 블록인지에 관계없이)는 클래스에 속합니다.따라서 클래스가 호출되면 이러한 변수 또는 블록이 실행됩니다.따라서 대부분의 초기화는 static 키워드를 사용하여 수행됩니다.이 클래스는 클래스 자체에 속하므로 클래스의 인스턴스를 만들지 않고 직접 액세스할 수 있습니다.
예를 들어, 신발 클래스에는 색상, 사이즈, 브랜드 등 여러 변수가 있습니다.그리고 신발 제조 회사가 하나의 브랜드만 가지고 있다면 정적 변수로 초기화해야 합니다.따라서 신발 클래스가 호출되어 (클래스의 인스턴스를 만들어) 다른 종류의 신발이 제조되면 새로운 신발이 만들어질 때마다 색상과 사이즈가 기억력을 차지하지만, 여기서는 브랜드가 모든 신발의 공통 특성이기 때문에 아무리 많은 신발이 만들어지더라도 한 번쯤은 기억력을 차지하게 된다.
예:
class Shoe {
int size;
String colour;
static String brand = "Nike";
public Shoe(int size, String colour) {
super();
this.size = size;
this.colour = colour;
}
void displayShoe() {
System.out.printf("%-2d %-8s %s %n",size,colour, brand);
}
public static void main(String args[]) {
Shoe s1 = new Shoe(7, "Blue");
Shoe s2 = new Shoe(8, "White");
System.out.println("=================");
s1.displayShoe();
s2.displayShoe();
System.out.println("=================");
}
}
정적 코드 블록은 명령 이상의 필드를 초기화하고 선언의 다른 순서로 필드를 초기화할 수 있으며 조건부 초기화에도 사용할 수 있습니다.
좀 더 구체적으로 말하면
static final String ab = a+b;
static final String a = "Hello,";
static final String b = ", world";
a와 b는 ab 뒤에 선언되어 있기 때문에 동작하지 않습니다.
그러나 이를 극복하기 위해 정적 초기화 블록을 사용할 수 있습니다.
static final String ab;
static final String a;
static final String b;
static {
b = ", world";
a = "Hello";
ab = a + b;
}
static final String ab;
static final String a;
static final String b;
static {
b = (...) ? ", world" : ", universe";
a = "Hello";
ab = a + b;
}
정적 초기화 블록은 클래스를 처음 사용하기 전에 지정된 클래스 정적 유형을 초기화하는 경우 유용합니다.이후 사용 시 정적 초기화 블록은 호출되지 않습니다.인스턴스 멤버를 초기화하는 인스턴스 이니셜라이저와는 정반대입니다.
클래스 로드 시간 동안 특정 식을 평가하려면 정적 블록을 사용할 수 있지만 다음 사항에 유의하십시오.
스태틱 블록에서는 예외를 처리해야 합니다.즉, 스태틱블록에서는 예외를 슬로우할 수 없습니다.
언급URL : https://stackoverflow.com/questions/9379426/java-when-is-a-static-initialization-block-useful
'programing' 카테고리의 다른 글
MySQL 연결이 작동하지 않음: 2002 해당 파일 또는 디렉터리가 없습니다. (0) | 2022.09.12 |
---|---|
HTML 문서의 문자 인코딩이 선언되지 않았습니다. (0) | 2022.09.12 |
Django에 유니코드 문자열을 저장할 때 MySQL "잘못된 문자열 값" 오류가 발생함 (0) | 2022.09.11 |
사용자 역할 및 권한 시스템 설계의 베스트 프랙티스 (0) | 2022.09.11 |
Twitter Bootstrap modal 박스의 기본 너비를 변경하려면 어떻게 해야 하나요? (0) | 2022.09.11 |