2013-01-03 4 views
0

값 표를 리턴하도록 작성한 java 프로그램이 있습니다. 나중에이 프로그램의 함수가 커짐에 따라 반환되지 않은 메서드 내에서 변수에 액세스하려고하지만 가장 좋은 방법은 확실하지 않다는 것을 알았습니다. 나는 당신이 하나 이상의 가치를 반환 할 수는 없다는 것을 알고 있지만, 어떻게이 중대한 개혁없이이 변수에 접근 할 것인가?메소드 java의 리턴 값

public class Reader { 
    public String[][] fluidigmReader(String cllmp) throws IOException { 
     //read in a file 
     while ((inpt = br.readLine()) != null) { 
      if (!inpt.equals("Calls")) { 
       continue; 
      } 
      break; 
     } 
     br.readLine(); 
     inpt = br.readLine(); 
     //set up parse parse parameters and parse 
     prse = inpt.split(dlmcma, -1); 
     while ((inpt = br.readLine()) != null) { 
      buffed.add(inpt); 
     } 
     int lncnt = 0; 
     String tbl[][] = new String[buffed.size()][rssnps.size()]; 
     for (int s = 0; s < buffed.size(); s++) { 
      prse = buffed.get(s).split(dlmcma); 
      //turns out I want this smpls ArrayList elsewhere 
      smpls.add(prse[1]); 
//making the table to search through 
      for (int m = 0; m < prse.length; m++) { 
       tbl[lncnt][m] = prse[m]; 
      } 
      lncnt++; 
     } 
     //but I return just the tbl here 
     return tbl; 
    } 

사람이 그것을 반환하지 않고 다른 클래스에 smpls를 사용하는 방법을 추천 할 수 : 여기 내 코드의 단순화 된 버전입니다? 아마도 get/set 정렬을 사용할 때입니까? 죄송 합니다만 이것이 분명한 질문 인 것 같습니다. 모듈 식 프로그래밍의 세계에 아직 익숙하지 않습니다.

+0

어디서나 smpls를 정의하지 않으므로 메소드의 일부가 아닙니다. 이미 클래스 변수입니다. – corsiKa

+3

또한 모음에 전쟁을 선언하셨습니까? 그들은 나쁜 것이 아닙니다! – corsiKa

+0

@corsiKa 그것은 내가 가진 것 같습니다. 나는 자신을 부수려고 노력하고있는 낡은 습관이지만 가끔은 그렇게 빠져 나간다. – Stephopolis

답변

3

지금 바로이 변수가 있습니다. tbl. 클래스에 랩핑하고 클래스에 목록을 추가하십시오.

class TableWrapper { 
    // default accessing for illustrative purposes - 
    // setters and getters are a good idea 
    String[][] table; 
    List<String> samples; 

    TableWrapper(String[][] table, List<String> samples) { 
     this.table = table; 
     this.samples = samples; 
    } 
} 

그런 다음 리팩터링하여 래퍼 객체를 반환하십시오. 당신이 반환 값을위한 전용 클래스 (언급과 같은 TableWrapper을 사용했다면 그런 다음 나중에 코드에서

public TableWrapper fluidigmReader(String cllmp) throws IOException { 
    // your code here 
    String tbl[][] = new String[buffed.size()][rssnps.size()]; 
    TableWrapper tw = new TableWrapper(tbl,smpls); 
    // more of your code 
    return tw; 
} 

당신이

String[][] tbl = fluidigmReader(cllmp); 

을 가고 있었다 대신

TableWrapper tw = fluidigmReader(cllmp); 
String[][] tbl = tw.table; 
List<String> smpls = tw.samples; 
+0

솔루션을 제공해 주셔서 감사합니다. 그것은 매우 명확하게 쓰여지고 이해하기 쉽습니다. 다시 한 번 감사드립니다! – Stephopolis

0

로컬 변수 대신 필드를 설정할 수 있습니다.이 필드는 나중에 getter로 검색 할 수 있습니다. 필요한 경우가 아니면 피하기를 원하지만이 경우에는 필요합니다.

1

이동 다른 대답에서), 거기에 추가 필드를 추가 할 수 있습니다.

클래스에 대한 좋은 점은 그것들을 확장 할 수 있다는 것입니다. 그러나 자바에서는 String[][]을 확장 할 수 없습니다.

0

클래스 (내부 리더 클래스) 변수를 사용할 수 있습니다. 하지만 읽기/쓰기가 동기화되어 있는지 확인하십시오.