2016-06-14 2 views
3

문제가 있습니다. 그래서, 100+ 메소드를 가진 JRE 네이티브 클래스가 있다고 가정하십시오 :자바 : 메서드 인수를 변경하는 가장 효율적인 방법

그리고 이러한 메소드 중 5 개를 변경하고 싶습니다. 특히 정수를 double로 지정하십시오. 추가 double 인수를 추가
나의 현재 솔루션은 래퍼 클래스를 포함한다 :
-A : 제공 원래 클래스에 직접 액세스 할 수
-B : (몇 가지 추가 입력을) 더블 인수를 "번역"라는 다섯 개 가지 방법을 가지고 있습니다 원래의 정수 인수로 변환합니다. 그래서 :

class WrapperMethods{ 
    public HundredMethods original = (assigned at constructor) 

    public void method1(double,double(extra)) { 
    int i = (assigned a value in "code" below) 
    this.original.method1(i); 
    } 
} 

모두 변경하고 위의 한 외에 "무거운"클래스에 몇 가지 방법에 인수를 추가하는 또 다른 경량의 솔루션이 있습니까? 내 코드에서이 솔루션을 실제로 구현하는 측면에서 사용자가 래퍼 클래스가 어떤 메서드를 변경하는지 알지 못하는 경우 엉망이 될 수 있다는 것을 발견했습니다. 사실, 나는 대략 250+ 메소드 클래스를 가지고 있는데, 나는 25 개의 메소드를 변경하고있다. 그래서 클래스가 클수록 내 코드가 더 복잡해진다. 내 코드를 공용으로 게시하려는 경우 래퍼를 사용하려고 할 때마다 래퍼가 변경하는 메서드를 찾아야합니다.

감사합니다.

+3

랩하려는 클래스, 변경하려는 메서드 및 변경해야 할 이유를 알려 주면 더 나은 방법을 제공 할 수 있습니다. 공개 JRE 클래스이고 어쨌든 당신의 wrk를 공개하고 싶다면 지금 시작하지 않겠습니까? –

+0

@JBNizet java.awt.Component 클래스를 변경하고 크기 나 위치를 처리하는 메소드를 변경하려고합니다. 내가 내 질문을 제네릭으로 만든 이유는 내 프로젝트의 버전 0.1을 릴리스했기 때문입니다. [ScaleUtils] (https://github.com/19mkarpawich/ScaleUtils), 이는 다른 여러 UI 클래스가 될 가능성이 가장 높음을 의미합니다. 나는 방법을 바꾼다. –

+0

왜 메소드 시그니처를'int'에서'double'으로 바꿀 수 없습니까? 'int'가 자동적으로'double'으로 넓혀지기 때문에 모든 현재 호출 사이트가 작동 할 것입니다. –

답변

1

수정하려는 5 가지 방법 각각에 대해 하위 클래스를 만들고 2 가지 방법을 추가 할 수 있습니다. 하나는 double, 그 논리를 수행하고 원래 방법으로 super. 호출을 수행하고 하나는 int 걸리고 double 전달할 때 동일한 작업을 수행합니다.

다른 모든 95 개의 메소드는 여전히 정상적으로 서브 클래스를 통해 액세스 할 수 있습니다.

class WrapperMethods extends HundredMethods { 
    public void method1(double d) { 
     int i = (assigned a value in "code" below) 
     super.method1(i); 
    } 

    public void method1(int i) { 
     // Make sure that any calls that happen to pass in an integer, 
     // also go by your logic. 
     this.method1((double)i); 
    } 
} 
+0

우선, 귀하의 회신에 감사드립니다. 나는 당신의 접근법을 생각해 보았지만, 혼란 (그리고 그 혼란으로 인한 추가 개발 시간)의 관점에서, 사용자가 실수로 원래의 메서드를 실수로 사용하는 것을 방지하고있다. 래퍼 솔루션은 사용자가 원본 메서드에 액세스하기 전에 원래 클래스에 액세스해야하기 때문에 원래 메서드를 사용하지 않으려합니다. 또한 인수로 double은 사용자가 소수점을 입력 할 수 있으므로 불행히도 정수를 double로 캐스팅 할 수는 없습니다. –

+0

@MaxK 사용자가 실수로 정수 대신 원래의 메서드를 사용하지 못하게하는 것은 무엇입니까? 그리고 그것은 구체적으로 나의 코드가 다루는 것입니다. 'int' 인수로 메소드를 구현함으로써, 원래 메소드의 우발적 인 사용을 포착하고 그것을'double' 구현에 전달할 수 있습니다. –

+0

이제 코드가 완벽하게 이해됩니다. 사과드립니다.그러나 위의 JBNizet의 의견에 대한 내 답변을 읽으면 프로젝트는 0.1 버전이고 0.2에서는 각 새 메서드에 추가로 두 번 인수를 추가합니다. 어떻게 구현할 것인가? –

관련 문제