Java 简化涉及布尔比较的重复代码
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>
但每当我比较给定键的值(方法参数中的字符串 shapeType)时,我遇到与上述相同的问题。
有什么方法可以简化这段代码?
您可以使用枚举。
public enum Shape {
CIRCLE, SQUARE, DIAMOND
}
然后,像这样在您的代码中使用它;
Shape shape;
public void shapeButtonPressed(Shape selectedShape) {
shape = selectedShape;
}
如果你不能改变shapeButtonPressed
的方法签名并且它必须接受一个String,你仍然可以这样做
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;
}
当然还有很多重复。您可以将其进一步重构为枚举并跟踪那里的状态。
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
方法 returns 所有已定义枚举的列表,因此我们可以遍历它们。
这有点花哨,我承认,因为它并不是枚举的真正目的,但它大大简化了您的逻辑。
作为我上面使用枚举的方法的替代方法(我强烈推荐这种方法),您可以使用位掩码而不是布尔标志来做一个更“C 风格”的解决方案。
位掩码本质上是一个数字(或二进制)值,其中每一位代表一个布尔值。
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
我正在努力寻找一种方法来减少长度并简化以下重复方法:
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>
但每当我比较给定键的值(方法参数中的字符串 shapeType)时,我遇到与上述相同的问题。
有什么方法可以简化这段代码?
您可以使用枚举。
public enum Shape {
CIRCLE, SQUARE, DIAMOND
}
然后,像这样在您的代码中使用它;
Shape shape;
public void shapeButtonPressed(Shape selectedShape) {
shape = selectedShape;
}
如果你不能改变shapeButtonPressed
的方法签名并且它必须接受一个String,你仍然可以这样做
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;
}
当然还有很多重复。您可以将其进一步重构为枚举并跟踪那里的状态。
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
方法 returns 所有已定义枚举的列表,因此我们可以遍历它们。
这有点花哨,我承认,因为它并不是枚举的真正目的,但它大大简化了您的逻辑。
作为我上面使用枚举的方法的替代方法(我强烈推荐这种方法),您可以使用位掩码而不是布尔标志来做一个更“C 风格”的解决方案。
位掩码本质上是一个数字(或二进制)值,其中每一位代表一个布尔值。
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