在每次迭代时重构for循环,设置不同的属性

Al *_*man 4 java refactoring coding-style

作为代码审查的一部分,我已经看到了以下Java代码,这很坦率.但是,我不知道重写它的最佳方法是什么.

我们有一个总是在相同顺序(0-5)的列表,每个索引对应于需要设置的不同属性.使用groovy会很容易,因为它会是myObject."setLine $ {i}"或者类似的但是我们怎样才能在普通Java中实现相同的功能呢?

    SomeObject myObject = new SomeObject();
    List<String> lines = new ArrayList<>(){{
    add("Line 1");
    add("Line 2");
    add("Line 3");
    add("Line 4");
    add("Line 5");
    add("Line 6");
}};

for(int i=0; i< lines.size(); i++){
    if(!StringUtils.isBlank(lines.get(i))){
        String line = lines.get(i);
        // line1
        if(i==0){
            myObject.setLine1(line);
        }
        // line2
        if(i==1){
            myObject.setLine2(line);
        }
        // line3
        if(i==2){
            myObject.setLine3(line);
        }
        // line4
        if(i==3){
            myObject.setLine4(line);
        }
        // line5
        if(i==4){
            myObject.setLine5(line);
        }
        //line6
        if(i==5){
            myObject.setLine6(line);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道,因为:每个都可以为我们提供一个索引,但它是调用我正在查询的"动态"方法.任何建议欢迎 - 我正在考虑MyObject类应该有一个方法来接收地址字符串列表,以便通过向调用者公开行数(即,如果我们添加/删除我们不想更新调用者的"setLineX"方法.

Mad*_*nan 7

第一个问题是myObject.正如您所见,为每条线设置方法是乏味的.这样的事怎么样?

class MyObject{
    private Map<Integer,String> lines = new HashMap<>();

    public void setLine(int lineNumber, String line){
        lines.put(lineNumber,line);
    }

    public String getLine(int lineNumber){
        lines.get(lineNumber);
    }

}
Run Code Online (Sandbox Code Playgroud)

现在你可以做到

for(int i=0;i<lineListSize;i++){
    myOjbect.setLine(i,lineList.get(i));
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如法比安刚刚指出的那样,你可以用a做同样的事情List.

class MyObject{
    private List<String> lines = new ArrayList<>();

    public void setLine(int lineNumber, String line){
        lines.add(lineNumber,line);
    }

    public String getLine(int lineNumber){
        lines.get(lineNumber);
    }

}
Run Code Online (Sandbox Code Playgroud)

编辑2:我永远不能完全离开.您可以使转移更清洁

class MyObject{
    ... 
    // Collection, getter and setter omitted
    ...
    public void addAllLines(List<String> lines){
       // implementation varies depending on collection,
       // but List would simply be "this.lines.addAll(lines);" 
    }

    public List<String> getAllLines(){
       // Again, depends on the type of Collection used by 
       // this instance.
       // Probably want to return a copy if thread safety is an issue.
    }
}
Run Code Online (Sandbox Code Playgroud)