2013-01-03 161 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; 
    } 

谁能推荐的方式,使用及样品,在另一个类不还?这可能是当你使用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; 
    } 
} 

然后重构你的方法来返回包装器对象。

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

如果您已经使用的返回值的专用类(提及诸如TableWrapper在另一个答案中),那么你可以在那里添加额外的字段。

这是类的好处 - 它们可以扩展。但是你不能用Java扩展String[][]

0

您可以使用class(Inside Reader类)变量。但要确保它的读/写是同步的