2013-01-22 2 views
0

기본 프로그래밍으로 구조화 된 사람으로부터 오는 기본 질문 ... 너무 기본 적이기를 바랄뿐입니다.글로벌 데이터, 정적 및 신규

내 응용 프로그램 내에서 다른 클래스가 공유하는 많은 데이터 배열이 필요합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 이것이 맞습니까?

public class LargeData { 
    private static long[] myData; 
    private static final int MAX = 100000; 

    public LargeData() { 
     myData = new long[MAX]; 
     // ... initialize 
    } 

    public long getData(int x) { 
    // ... do whatever and return a long 
    } 
} 

그리고 이것이 맞으면 내 수업에서이 데이터에 액세스하는 올바른 방법은 무엇입니까? 해야합니까?

LargeData ld = new LargeData(); 

myData에 액세스하려는 모든 클래스 내에 있습니까?

답변

1

매번로 액세스 할 수 있습니다, 당신은 효과적으로 잘못

myData = new long[MAX]; 

를 호출합니다.

당신이 할 수있는 것은 :

public class LargeData { 

    private static final int MAX = 100000; 
    public static long[] myData = new long[MAX]; 
} 

어디서나 LargeData.myData로 액세스합니다.

+0

처음에 "새로운"것을 만들어야한다고 생각합니까? –

+0

편집을 마치 신 것처럼 말입니다. –

+1

고마워요, 제 생각에 모든 사람들이 저를 똑같은 방식으로 반복해서 반복해서 생각합니다. :) –

4

:)이에 대한 싱글 톤 패턴을 사용 ... 너무 쉽게 주셔서 미안 감사드립니다.

+1

그냥 배열 참조를 유지하기 위해 '싱글 톤'패턴을 사용하는 목적은 무엇입니까? – mishadoff

+0

지연 초기화를 수행하는 데있어 싱글 톤을 사용하지 않는 것이 좋습니까? –

+1

음, 간단하게 ... 정적을 사용하면 클래스 인스턴스를 놓아 버리지 않으려 고 클래스 로더에 의존하고 있습니다 (왜냐하면 그가 풀어주지 않으면 정적 콜렉션의 모든 데이터에서 GC가 실행되지 않기 때문입니다) . Singleton을 사용하면 콜렉션에 대한 라이브 참조를 저장할 수 있으며 GC는이를 건너 뜁니다. 이 경우 myData는 정적이 아니어야합니다. 따라서 Singleton은 좋은 선택입니다. – fazhool

1

즉시 어레이를 초기화하십시오. 현재 구현에서는 LargeData이라는 객체를 만들 때까지 정적 배열을 사용할 수 없습니다.

배열을 보관 유지하는 클래스가 final 및 생성자를 private으로 지정하여 인스턴스화 및 확장을 막는 경우에도 마찬가지입니다.

public final class LargeData { 
    public static long[] myData = new long[100000]; 

    private LargeData() { } 
} 

그리고 당신은 당신의 코드에서

LargeData ld = new LargeData(); 

전화 LargeData.myData

+0

죄송합니다 어떻게 할 수있는 예제를 보는 것이 좋겠지 만. 내가 뭘 생각했는지 확신 할 수 없어. 이전 댓글을 삭제합니다. 바보 같은 느낌 :/ –

+0

@VikramSingh 모두 삭제 – mishadoff

+0

이렇게하면이 클래스의 인스턴스를 가질 필요가 없습니다. 맞습니까? 나는 새 것을 만들 필요가 없다. –

0

인스턴스 생성자에서 정적 변수에 값을 할당하는 것은 좋지 않은 생각입니다.이 클래스에서 두 개의 객체를 인스턴스화하면 두 번째로 배열에 저장된 모든 데이터가 손실됩니다. 두 번째 인스턴스가 정적 참조를 덮어 쓸 때 오래된 배열). null 체크를 사용하면 나쁜 생각이지만, 한 인스턴스의 데이터를 "전역 변수"방식으로 정말로 정말로 필요로하지 않는다면 말입니다. 정적 참조는 전역 변수로 생각하는 것이 가장 좋습니다. 전역 변수는 모두 공개 (공개 인 경우) 또는 사용자가 정의한 클래스 (비공개) 또는 중간에 정의 된 클래스 (보호 또는 패키지로 보호 된 액세스)에서만 볼 수 있습니다. 거의 모든 경우에 그것들을 사용하는 것을 피하고 클래스 내에서 정적 변수 대신에 싱글 톤 패턴을 사용하는 것이 좋습니다. Singleton 패턴을 사용하면 인스턴스 변수와 비 정적 getter를 사용하여 데이터에 접근 할 수 있습니다.

그러나이 특정 문제에 대해 왜 싱글 톤 패턴이 필요한지 넌 알지 못합니다. 단지 데이터를 객체에 저장하고 그 객체를 공유하려고합니다.

당신은 정적 키워드없이이 같은 게시 된 코드를 해결할 수이 여러 LargeData 인스턴스가 응용 프로그램에서 한 번에 살아있을 수 있습니다 :

public class LargeData { 
private long[] myData; // instance variable to store the data 
private static final int MAX = 100000; // max length 


public LargeData() { 
    myData = new long[MAX]; 

}

public long[] getData() { 
    return myData; 
} 

} 

그런 다음을 사용할 수 있습니다 데이터 형식 :

LargeData ld = new LargeData(); 
long[] = ld.getData(); 

그리고 ld에 저장된 참조를 원하는대로 사용할 수 있습니다. 다른 클래스 등을 통해 전달할 수 있습니다.

더 나은 아이디어는 배열을 노출시키지 않고 저장된 데이터를 사용하는 API를 만드는 것입니다. 예를 들면 : 당신이 LD에 저장된 LargeData 인스턴스에 대한 참조 주위에 통과하지 않으려면 지금

public long getLong(int n) { return myData[n]; } 
public void setLong(int n, long value) { myData[n] = value; } 

, 당신은 당신이 액세스 할 수있는 참조 및 정적 게터를 저장하는 LargeData에서 정적 변수를 사용할 수 있습니다 다른 Java 코드에서 가져온 것입니다. 여러 LargeData 인스턴스가 필요하면 인스턴스화 된 각 LargeData 인스턴스를 저장할 Map을 캡슐화하는 LargeDataRegistry 클래스를 만들 수 있습니다.

관련 문제