2014-09-06 1 views
2

그래서 나는 불가능을하려고 노력했다고 생각하는데, 나는 그것에 대해 올바르게하고 싶습니다.arraylist를 확장하는 정적 클래스에()를 추가하는 방법은 무엇입니까?

ArrayList의 add() 메서드는 정적이 아니므로 ArrayList의 모든 하위 클래스를 인스턴스화해야 추가 할 수 있습니다.

개체 집합을 관리하기위한 몇 가지 새로운 기능을 제공하기 위해 ArrayList를 확장하는 클래스를 갖고 싶다면 실제로 하위 클래스의 인스턴스를 만들어야합니까? 이런 경우

,이 같은 정적 초기화를 통해 인스턴스화 할 수 있습니다 : 변수가 정적

static ArrayList<object> manager = new ArrayList<object>(); 

에도 불구하고,이를 만든 인스턴스로 간주 될 때 클래스로드 ? 그리고 그것이 언제 만들어 지는지 어떻게 알 수 있습니까? 그래서 관리자를 참조하는 코드가 문제가 없는지 확인할 수 있습니까? 나는 시간이 지남에 따라 동일한 ArrayList를 여러 번 사용 (추가, 제거 등)하기를 원하기 때문에 코드의 시작 부분에서 한 번만 인스턴스화해야합니다.

설명해 주셔서 감사합니다.

+0

모든 클래스의 하위 클래스는 무엇이든 수행하기 위해 인스턴스화되어야합니다. 따라서 * 변수가 정적 인 경우에도 클래스를로드 할 때 생성되는 인스턴스로 간주됩니까? * 예. 그렇습니다. –

+1

일반적으로 말하자면 전역 변수로 참조하지 않고 매개 변수 (a-la dependency injection)로 전달하는 것이 바람직하며이를 대신 수행해야합니다. 변경할 수있는 전역 상태는 디버그하고 추론하기가 정말 어렵습니다. –

+0

죄송합니다. 프로그래밍에 익숙하지 않아서 귀하의 의견이 제 머리 위로 넘어갔습니다. 의존성 주입이란 무엇입니까? 그리고 내가 지금하고있는 것 대신에 그것을 어떻게 사용하러 갈 것인가? – zephos2014

답변

1

당신이 null이 아닌지 확인하려는 경우, 당신은이 작업을 수행 할 수 있습니다 :

private static void instIfNull() { 
    if (manager == null) { 
     manager = new ArrayList<object>(); 
    } 
} 

그런 다음 모든 로컬 기능에서이를 호출합니다.

+0

정적 초기화 블록은 OP 정적 선언 코드 인 AFAIK와 동일합니다 ('정적 {}'안에는 다른 것이 없습니다). – watery

+0

예, 대체로 동일합니다. 왜 내가 거기에 두는 유일한 이유는'manager.put'와 비슷한 것을 사용할 수 있다는 것입니다. 나는 그것을 명확하게하기 위해 나의 awnswer를 편집 할 것이다. – Pokechu22

1

메모리에서 refernce 변수의 위치를 ​​인쇄하면 JVM이이를 생성했다고 알 수 있습니다.

는이 작업을 수행 :

system.out.println(manager); 

이 메모리의 개체 위치를 인쇄합니다이 그것을 만든 당신을 말할 것이다. 희망이 도움이됩니다. P.S 메모리의 개체 위치 표시는 언뜻보기에는 많은 양의 쓰레기처럼 보일 수 있지만 의미가 있습니다.

private static final ArrayList<Object> manager; 
static { 
    //Static blocks are automatically called 
    manager = new ArrayList<Object>(); 
    //You can use any of the needed methods here as well, or even add things to manager. 
    //Note that this is basically the same as assigning it beforehand, and certainly not required. 
    //But it does allow, say, loading it from a file or however you need it. 
} 

당신은 양자 택일 인스턴스가 null 경우 확인하는 방법을 만들 수 있으며,이 경우, 인스턴스를 생성 :

+0

멋진 아이디어입니다. 나는 내가 의심 할 때 그것을 기억할 것이다. – zephos2014

+0

이 답을 수락 된 것으로 표시 할 수 있습니까? – rert588

+0

예, 방금 그 방법을 알아 냈습니다. 새 소식. – zephos2014

관련 문제