2014-06-23 2 views
2

다른 클래스의 객체 변수 인 인스턴스가있는 여러 클래스가있는 Java 프로젝트에서 작업 중입니다. 예를 들어 BigClassA 객체에는 SmallClassA 객체의 배열이 있습니다. BigClassB 객체에는 SmallClassB 객체의 배열이 있습니다.자바의 다른 클래스에서 다른 필드의 비슷한 코드를 대체하는 방법은 무엇입니까?

이벤트 BigClassA와 BigClassB는 완전히 다른 필드를 가지므로 SmallClassA 및 SmallClassB와 유사한 작업을 수행합니다. 아래의 코드를 참조하십시오

public class BigClassA { 
    // initialize all instance variables to 0 
    double totValue  = 0; 
    double totGainLoss = 0; 
    SmallClassA[] smallClassArray = new SmallClassA[2]; 

    public BigClassA(int i, int j) { 

     smallClassArray[0] = new SmallClassA(i); 
     smallClassArray[1] = new SmallClassA(j); 

     for (int k; k<smallClassArray.length; k++) { 
      totValue += totSmallClassArray[k].getValue(); 
      totGainLoss += totSmallClassArray[k].getGainLoss(); 
     } 
    } 
} 

public class BigClassB { 
    // initialize all instance variables to 0 
    double totFoo = 0; 
    double totBar = 0; 
    double totPvsNP = 0; 
    SmallClassB[] smallClassArray = new SmallClassB[3]; 

    public BigClassB (int p, int q, int r) { 

     smallClassArray[0] = new SmallClassB(p); 
     smallClassArray[1] = new SmallClassB(q); 
     smallClassArray[2] = new SmallClassB(r); 

     for (int k; k<smallClassArray.length; k++) { 
      totFoo  += smallClassArray[k].getFoo(); 
      totBar  += smallClassArray[k].getBar(); 
      totPvsNP += smallClassArray[k].getPvsNP(); 
     }  
    } 
} 

을 나는 BigClassA과 BigClassB 모두에 대한 루프의 충분히 유사한 특성을 가지고 있으며, 공통의 코드로 대체 될 수 있다고 생각.

누구나 for 루프를 각 클래스에 대해 for 루프를 반복적으로 작성할 필요없이 위의 두 루프처럼 작동 할 수있는 외부 메소드를 작성하는 방법을 조언 할 수 있습니까? 아니면 코드를보다 간결하게 만드는 다른 방법이 있을까요? 도와 주셔서 감사합니다.

+1

[This] (http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html)가 도움이 될 것입니다. – Maroun

+0

+1. Java8에서 배열을 반복하고 getter 값을 요약하는 것이 있습니까? – Thilo

+0

@MarounMaroun : 여기서 하위 클래스를 어디서 소개하겠습니까? – Thilo

답변

0

유사한 동작을 추상화하는 표준 방법은 인터페이스를 사용하는 것입니다. 귀하의 경우에는 목록의 모든 요소에 대해 전체를 구성하고자합니다.

먼저 지금의 인터페이스

public interface Summable { 
    double getSum(); 
} 

을 만들 SmallClassA 및 SmallClassB에서 해당 인터페이스를 구현합니다. 이것은 대부분의 루프 바디를 특정 클래스로 이동시킵니다. SmallClassA

public SmallClassA implements Summable{ 
    public double getSum() { 
     return getValue() + getGainLoss(); 
    } 
} 

을 위해 이제 모두 당신의 루프는 또한이 외부 방법 할 수

for (Summable summable : smallClassArray) { 
    total += summable.getSum(); 
} 

과 같이 쓸 수있다.

1

코드는 이러한 리팩토링에 가치가있는 공통 부분을 충분히 보여주지 않지만이를 수행 할 수있는 방법이 있습니다. Maroun Maroun에 의해 제안으로, 당신은 상속으로 이동해야하지만 여러 단계가 있습니다 :

  • SmallClassASmallClassB 사이에 공통 인터페이스 또는 추상 클래스를 식별은. 가장 좋은 세상에서는 공통 서명이있는 모든 메소드를 포함하는 인터페이스와 공통 코드를 포함하는 추상 클래스로 둘 다 정의하게됩니다.
  • 은 당신이 특정 복잡성의 가격 코드의 중복을 피할 수, B

위해 그 방법을 class BigClassA extends CommonBigClass<SmallClassA>과 동일하게 <T extends CommonSmallInterface>

  • BigClassABigClassB, 매개 변수 사이에 공통의 일반적인 추상 클래스를 식별합니다.

    참고 : SmallClassASmallClassB이 선언 된 방법에 따라 공통 인터페이스 및/또는 수퍼 클래스가 일반 일 수도 있습니다.

  • 관련 문제