2012-12-21 2 views
7

Java에서 작업하면서, 나는 작업중인 다각형 함수 (다각형 생성자)를 단순화하고 싶었다. 다각형을 만들 때 일반적으로,이 작업을 수행 :가변 인수를 사용하여 Java 메소드 단순화

Polygon mypoly = new Polygon(); 
mypoly.addPoint(x1, y1); 
mypoly.addPoint(x2, y2); 
mypoly.addPoint(x3, y3); 
Draw.fillPolygon(g, mypoly, Color.blue); 

내가 자동으로 나에게 좌표를 제공하는 이미지 매퍼를 사용하고 싶습니다, 그래서 난 내 자신의 기능에 붙여 복사 만 할 수있다.

myCommand(x1, y1, x2, y2, x3, y3); 

이들 각각은 맨 위에있는 polygon 명령을 사용합니다. 내가 직면하고있는 문제는 mypoly가 만들어 질 때 얼마나 많은 포인트를 추가하고 어디에 넣을 지 어떻게 알 수 있습니까?

인수를 추가 할 때 myCommand에 점을 자동으로 추가하려고 시도하고 있으며 각 점은 원래 다각형 작성 방법의 x, y에 해당합니다.

+1

사용 [가변 인자 (http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html) . –

답변

7

builder 패턴을 사용해야하는 것 같습니다. 의사 코드에서 :

PolygonBuilder pb = new PolygonBuilder(); 
pb.addPoint(1,1); 
pb.addPoint(1,2); 
// etc... 

Polygon p = pb.newPolygon(); 

그래서 아이디어는 점 세트와 함께 빌더를 제공하는, 그리고 그것은 당신에게 적절한 다각형을 생성 할 수 있습니다. 빌더는 종종 fluent interface으로 설계됩니다. 빌더는 공장처럼 행동하고 Polygon (원하는 경우 사각형, 삼각형, 오각형 등)의 적절한 하위 클래스를 반환 할 수 있습니다.

대신에 Java varargs mechanism을 사용하여 가변 인수를 취하는 메소드를 제공 할 수 있습니다. 예 :

public void addPoints(Integer... args) { 
    // and iterate here 
} 

당신은 X를 정의하는 Point 객체를 생성 할 수 있습니다/y를 함께 좌표입니다. 그렇지 않으면 위의 인수는 짝수 개의 인수를 확인해야하며 인수는 함께 묶이지 않습니다.

5

당신은 varargs를 사용하고 XS의 배열과 YS

을 가져옵니다 constructor를 사용하여 다각형을 동적으로 생성 할 수 있습니다

public Polygon createPolygon(int... points) { 
    if (0 != points.length % 2) { 
     throw new IllegalArgumentException("Must have even number of points"); 
    } 

    int numOfPoints = points.length/2; 
    int xs = new int[numOfPoints]; 
    int ys = new int[numOfPoints]; 
    for (int i=0; i < numOfPoints;i++) { 
     xs[i] = points[i*2]; 
     yx[i] = points[i*2 + 1]; 
    } 

    return new Polygon(xs, ys, numOfPOints); 
} 

이 그럼 당신은 임의의 수와 메소드를 호출 할 수 있습니다 (코드는 테스트하지) 지적

Polygon p = createPolygon(x1,y1,x2,y2,x3,y3);

+0

+1이 페이지의 모든 대답은 기술적으로는 정확하지만이 기사는 내 upvote를 얻습니다. 왜냐하면 * 단지 *는 varargs (가장 좋은 대답)를 언급하고 사소한 일로 복잡해지지 않기 때문입니다. – Asaph

+2

for 루프는'i ++'대신'for (int i = 0; i BalusC

+0

그리고 xs 및 ys의 색인은 무엇입니까? –

1

나는 당신이 varar을받은 방법을 사용할 수 있다고 생각 GS

(...)

당신은 각 지점에 대한 래퍼가 필요합니다

class Point { 
    int x; 
    int y; 
    Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

이 방법은 수 :

myCommand(Point ... points) 
전화

myCommand(new Point(0,0), new Point(1,1), new Point(0,1)); 

를 들어

과 무승부 :

Polygon mypoly = new Polygon(); 
for(Point p : points) 
    mypoly.addPoint(p.x,p.y); 
Draw.fillPolygon(g,mypoly,Color.blue); 
+0

['java.awt.Point'] (http://docs.oracle.com/javase/6/docs/api/java/awt/Point.html)는 이미 존재합니다 (1.0 이후). 휠을 다시 발명 할 필요가 없습니다. – Asaph

+0

당신이 옳습니다. –

2

Brian Agnew의 답변을 확장하려면 addPoints 메소드에서 가져올 수있는 Point 클래스를 추가하는 것이 좋습니다. 그러면 점을 폴리곤에서 추가/제거하는 것이 약간 더 쉬워 질 수 있습니다.

public final class Point<X,Y>{ 
    private final X x; 
    private final Y y; 

    public Point(X x, Y y){ 
     this.x=x; 
     this.y=y; 
    } 

    public X getX(){return x;} 

    public Y getY(){return y;} 
} 

그런 다음 당신은 할 수 :

public void addPoints(Point<Integer,Integer>... points){ 
    for(Point<Integer,Integer> point:points) 
     //your logic 
} 
+0

['java.awt.Point'] (http://docs.oracle.com/javase/6/docs/api/java/awt/Point.html)는 이미 존재합니다 (1.0 이후). 휠을 다시 발명 할 필요가 없습니다. – Asaph

+0

필자는 보통 동의 할 것이지만,이 경우에는 불변의 포인트 클래스를 사용하는 것이 의미가 있으며,이 코드는 제네릭을 사용하기 때문에 다른 많은 응용 프로그램에서 재사용 할 수 있습니다. –

+0

아마도 클래스를 'ImmutablePoint'라고 이름 지어 그것을 구별하고 코드가 의도를 더 잘 묘사하도록 만들 수 있을까요? – Asaph

관련 문제