2012-07-01 3 views
1
public static MyType mtOrders;  
public static MyType mtCustomers;  
public static MyType mtItems;  
public static MyType mtGroups;  
public static MyType mtDelieverAddresses;  
public static MyType mtVendors;  
public static MyType mtOrderItems;  
public static MyType mtPrims;   

public final static MyType[] xTable = {mtCustomers, mtGroups, mtItems, mtOrders, 
         mtDelieverAddresses, mtVendors, mtOrderItems, mtPrims}; 

for (int i = 0; i < xTables.length; i++) {  
    xTable[i] = new MyType(); 
} 

실행 후 xTable의 요소는 초기화되지만 mtOrders ... mtPrims은 null입니다!어레이에 널 객체를 초기화하는 방법은 무엇입니까?

이 이유는 무엇인지 이해하지만 루프의 개체를 어떻게 초기화하는지 생각할 수 없습니다.

나는이 일을하지 않으려 :

mtOrders = new MyType(); 
mtCustomers = new MyType(); 
... 
mtPrims = new MyType(); 

답변

3

xTable 변수와 정적 변수의 시리즈는 같은 객체에 포인트하지만, 서로를 수정하는 데 사용 할 수 없음을, 참조 다릅니다. 즉, 두 객체 모두 동일한 객체 인을 수정하는 데 사용할 수 있지만 객체의 한 점을 가져도 해당 객체의 다른 점은 만들지 않습니다.

나는 실제 목표를 이해하지 못합니다. 내가 제공 할 수있는 최선책은 모든 중급 클래스를 사용하는 것입니다. 그래서 mtOrdersMyType이 아니고, 인데, MyType 필드를 갖습니다. 그런 다음 새로운 MyTypeRef으로 초기화하고 루프를 사용하여 모든 참조에서 MyType 개체를 설정하십시오. 정적 변수와 xTable 항목이 같은 MyTypeRef을 가리킬 것이므로 MyType 필드를 하나 설정하면 다른 변수에도 영향을줍니다.

IMO, 각 개별 변수를 초기화하는 대신 해당 루프를 사용하면 더 엄격한 코드처럼 보이지만 작동하지 않습니다. 몇 줄의 코드 만 작성하면 꽤 효과적이지는 않지만 실제로 작동합니다.

+0

귀하의 솔루션을 좋아합니다 <..> MyTypeRef <..>, 감사합니다. –

+0

글쎄, 난이 솔루션에 미친 게 아니야, 일부 초기화 문제를 우회하기 위해 모든 변수에 여분의 래퍼를 추가하기 때문이다. 하지만 그것은 당신의 코드입니다 ... – eran

+0

제 초기화는 제가 보여준 것보다 훨씬 복잡합니다. 내가 생각하기에, 배열에 새로운 var를 추가하는 것이 더 간단하다. 많은 코드 라인을 복사하여 붙여 넣는 것보다. –

2

자바가에 할당하는 것보다 변수의 다른 참조를 초기화하는 방법이 없습니다.

public static final String myOrders = "mtOrders"; 
// etc. 

public final static Map<String, MyType> xTable; 

static { 
    HashMap<String, MyType> table = new HashMap<String, MyType>(); 
    String[] keys = { myOrders, . . . } 
    for (int i = 0; i < keys.length; ++i) { 
     table.put(keys[i], new MyType()); 
    } 
    xTable = Collections.unmodifiableMap(table); 
} 

이 그럼 당신은 개별 요소에서 얻을 수 있습니다 :

MyType orders = xTable.get(myOrders); 

이 요구 사항을 충족하지 않는 경우 당신은 그냥해야합니다, 당신은지도 원하는 당신은 아마 가까운 얻을 수 있습니다 각 필드를 개별적으로 할당합니다.

+0

답변 해 주셔서 감사합니다. 나는 eran이 제안한대로 할 것입니다. –

관련 문제