2013-04-19 1 views
1

자바로 매핑 앱을 만들고 있는데 작은 오브젝트를 전달하는 것에 대한 질문이 있습니다. 윈도우가 직사각형으로 보여주고있는 영역을 나타내기를 원한다면 어떤 타일이 그 직사각형 안에 있는지를 알아보고로드 할 타일을 알고 싶습니다. C++에서는 Rect 구조체를 만들고 tileInRect 메서드를 포함 시켰을 것입니다. 자바에 가장 직접적인 번역은 같은 것입니다 :Java에서 작은 구조체를 대체해야하는 대상은 무엇입니까?

class Rect { 
    float x, y, width, height; 

    public boolean tileInRect(Tile t) { 
     // yada yada 
    } 
} 

class MyProgram { 
    public void main(String[] args) { 
     while (windowIsOpen()) { 
      // event loop 
      // render map 
      Rect r = getVisibleRect(); 
      for (Tile t : tiles) { 
       if (r.tileInRect(t)) { 
        // etc. 
       } 
      } 
     } 
    } 
} 

을하지만 아마도이 될 새로운 사각형 모든 프레임 만들기 때문에 이것은 나에게 일종의 구역질을 느낀다. Java에서 이러한 가벼운 객체를 표현하는 더 나은 표준적인 방법이 있습니까? 나는 실제로 매개 변수 전달의 터무니없는 양처럼 보이기 때문에 tileInRect(Tile t, int rect_x, int rect_y, int ...과 같은 도우미 메서드를 작성하고 싶지 않습니다. 감사!

+0

클래스가 가장 좋습니다. 필요한 경우 컬렉션을 시도해보십시오. –

+1

프레임간에 동일한 rect 인스턴스를 재사용하고 해당 필드를 업데이트 할 수도 있습니다. 어느 쪽이든 올바른 디자인입니다. – radai

+3

새로운 직사각형을 만드는 것은 그렇게 비용이 많이 들지 않습니다. Java 코드는 중복되지 않습니다. JVM은 클래스의 인스턴스와 x, y 등에 필요한 저장소의 인스턴스를 추적하기 위해 일부 제어 구조 만 할당합니다. –

답변

3

Rect 클래스는 좋은 방법입니다.

이러한 개체를 많이 만들어야하지만 한 번만 필요하면 그의 특성을 업데이트하여 모든 호출에 대해 동일한 개체를 다시 사용하면됩니다.

+0

좋습니다, 감사합니다! @ 제임스는 모든 프레임을 새로운 사각형으로 만들면 비용이 많이 들지 않아야한다고 언급 했으므로이 방법을 사용할 것이라고 생각합니다. – fyhuang

0

변경할 수없는 클래스 형식이나 변경 가능한 클래스 형식을 사용할 수 있습니다. .NET에서의 이상적인 표현은 노출 필드 구조입니다 (대부분의 해당 컨텍스트에서 변경 가능하고 대부분의 해당 컨텍스트에서는 변경할 수 없음). Java는 이러한 개념을 지원하지 않으므로 하나는 가변적 인 클래스 또는 불변의 클래스로 가야하며 각각의 장단점을 인식해야합니다.

변경할 수있는 클래스는 개체에 대한 유일한 참조가있는 경우 어떤 방식 으로든 다른 개체를 갖기를 원하며 더 이상 개체의 이전 버전이 필요하지 않다는 장점이 있습니다. 새 객체를 만들 필요없이 객체의 적절한 부분을 변경하기 만하면됩니다. 변경하지 않으려는 객체의 부분을 복사하거나 수행하지 않아도됩니다. mutable class는 단 하나의 현존하는 객체에 대한 참조만을 가지고 있다면 그러한 변이가 안전하기 때문에 하나의 객체에 대한 참조를 다른 코드와 안전하게 공유 할 수 없다는 단점이 있습니다. 하나는 대신 새로운 객체를 생성하여 다른 객체에 전달하거나 다른 객체에있는 객체의 데이터를 다른 객체에서 제공하는 객체로 복사해야합니다.

불변 클래스는 객체에 대한 참조가 외부 코드와 자유롭게 공유 될 수 있다는 장점이 있습니다 (객체가 불변이므로 코드 외부에서 에 아무 것도 할 수 없습니다). 그것!). 불행히도, 외부가 객체에 대해 아무 것도 할 수 없다는 것은 대단한 일이지만, 불변성은 또한 객체의 논리적 "소유자"가 아무 것도 할 수 없다는 것을 의미합니다. 사람이 물건을 가지고 어떤 식 으로든 다른 물건을 갖고 싶다면, 다른 방식으로 완전히 새로운 물건을 만들어야합니다. 사실, 우주의 어느 곳에서도 오래된 물체가 수정되면 아무도 신경 쓰지 않는다고해도 코드가이를 알 수있는 방법은 일반적으로 없습니다.

코드가 수정 된 형태의 객체를 다른 코드와 교환하는 것보다 자주 생성하는 경우 변경 가능한 클래스 유형이 선호 될 수 있습니다. 객체가 많이 전달되지만 새로운 양식의 생성이 상대적으로 드문 경우 불변 인 클래스 유형이 선호 될 수 있습니다. 유니버스의 어디에서나 "변경할 수있는"개체에 대한 유일한 참조를 보유하고 해당 개체를 변경하거나 참조 할 수있는 내용을 노출하지 않는 변경할 수없는 클래스 형식으로 변경할 수있는 클래스 형식을 래핑하는 것은 가능합니다. 그래서. 실제로 mutate 할 수없는 유형의 객체에 대한 용어가 있는지는 모르겠지만 실제로 유용한 패턴입니다 (가장 좋은 예는 String, Java의 배열은 변경할 수 있지만 String은 문자 배열을 변경하지 않기 때문입니다.) 결코 외부 코드에 노출시키지 않으면 String 객체의 문자 시퀀스가 ​​변경 될 수는 없습니다.

관련 문제