簡體   English   中英

Java簡化涉及boolean比較的重復代碼

[英]Java simplifying repetitive code involving boolean comparison

我試圖找到一種方法來減少長度並簡化以下重復方法:

boolean circleFlag, squareFlag, diamondFlag;

public void shapeButtonPressed(String shapeType) {

    if (shapeType.equals("Circle")) {
        circlePressed();
    } else if (shapeType.equals("Square")) {
        squarePressed();
    } else if (shapeType.equals("Diamond")) {
        diamondPressed();   
    }

}

public void circlePressed() {
    if(!circleFlag){
        //set only circleFlag true and the rest false.
        circleFlag = true;
        squareFlag = false;
        diamondFlag = false;

        //(... some code)
    } else {
        //set all flags false.
        circleFlag = false; 
        diamondFlag = false
        squareFlag = false;

        //(... some different code)
    }

}
public void squarePressed() {
    if(!squareFlag){
        //set only squareFlag true and the rest false.
        squareFlag = true;
        circleFlag = false;
        diamondFlag = false;

        //(... some code)
    } else {
        //set all flags false.
        circleFlag = false; 
        diamondFlag = false
        squareFlag = false;

        //(... some different code)
    }

}
public void diamondPressed() {
    if(!diamondFlag){
        //set only diamondFlag true and the rest false.
        diamondFlag = true;
        squareFlag = false;
        circleFlag = false;

        //(... some code)
    } else {
        //set all flags false.
        circleFlag = false; 
        diamondFlag = false
        squareFlag = false;

        //(... some different code)
    }
}

我嘗試過的事情

我試圖將我所有的值設置為Boolean類型,將它們設置在ArrayList<Boolean>並將shapePressed(String shapeType)方法更改為

public void shapePressed(String shapeType) {

    Boolean currFlag = false;

    if (shapeType.equals("Circle")) {
        currFlag = circleFlag;
    } else if (shapeType.equals("Square")) {
        currFlag = squareFlag;
    } else if (shapeType.equals("Diamond")) {
        currFlag = diamondFlag;
    }

    if (!currFlag){
        for (Boolean flag : shapeFlag) flag = ( flag == currFlag ) ? true : false; 

        //(...)
    } else {
        for (Boolean flag : shapeFlag) flag = false;

        //(...)
    }
}

但是該行( flag == currFlag )將布爾值作為值而不是單個對象進行比較。 所以我的currFlag在上面的方法中毫無意義。

然后我雖然使用了HashMap<String,Boolean>但是每當我比較給定鍵(方法參數中的 String shapeType)的值時,我都會遇到與上述相同的問題。

有什么方法可以簡化這段代碼?

您可以使用枚舉。

public enum Shape {
  CIRCLE, SQUARE, DIAMOND
}

然后,像這樣在您的代碼中使用它;

Shape shape;

public void shapeButtonPressed(Shape selectedShape) {
    shape = selectedShape;
}

如果您不能更改shapeButtonPressed的方法簽名並且它必須采用字符串,您仍然可以這樣做

Shape shape;

public void shapeButtonPressed(String shapeType) {
    if (shapeType.equals("Circle")) {
        shape = Shape.CIRCLE;
    } else if (shapeType.equals("Square")) {
        shape = Shape.SQUARE;
    } else if (shapeType.equals("Diamond")) {
        shape = Shape.DIAMOND;
    }

}

當給定的形狀被激活時,您只需反轉該標志。 然后其他標志設置為 false。

因此,簡單地說,您可以將circlePressed()邏輯簡化為:

public void circlePressed() {
    circleFlag = !circleFlag;
    squareFlag = false;
    diamondFlag = false;

}

當然還是有很多重復的。 您可以將其進一步重構為枚舉並在那里跟蹤 state。

public enum Flag {
  CIRCLE( false ),
  SQUARE( false ),
  DIAMOND( false ); // default state is false for all

  private boolean state;
  private Flag(boolean state) {
    this.state = state;
  }

  public void flipState() {
    this.state = !this.state;
  }

  public void setState(boolean state) {
    this.state = state;
  }
}

// notice this method takes the Flag not a string
public void shapeButtonPressed(Flag selected) {

    // iterate through all the flags ...
    for( Flag flag : Flag.values() ) {
        if (flag == selected) {
            // invert the "pressed" flag state
            flag.flipState();
        } else {
            // ... and set the rest to false
            flag.setState(false);
        }
    }
}

枚舉的內置values方法返回所有已定義枚舉的列表,因此我們可以遍歷它們。

這有點花哨,我承認,因為它並不是枚舉的真正目的,但它大大簡化了您的邏輯。

作為我上面使用枚舉的方法的替代方法(我強烈推薦這個方法),您可以使用位掩碼而不是 boolean 標志來做一個更“C 風格”的解決方案。

位掩碼本質上是一個數字(或二進制)值,其中每一位代表一個 boolean 值。

int shapeFlags;

public void shapeButtonPressed(String shapeType) {
    if (shapeType.equals("Circle")) {
        shapeFlags = 1;
    } else if (shapeType.equals("Square")) {
        shapeFlags = 2;
    } else if (shapeType.equals("Diamond")) {
        shapeFlags = 4;
    }
}

這仍然讓您可以選擇將多個形狀設置為true ,同時能夠在單個操作中覆蓋所有標志。

從數值到形狀的映射如下所示:

0 : no shape
1 : circle
2 : square
3 : circle & square
4 : diamond
5 : diamond & circle
6 : diamond & square
7 : all three

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM