在对象中包装布尔值

rao*_*son 4 java refactoring

我有一些我想重构的代码.我有很多方法采用相同类型的多个参数,例如:

public void foo(String name, String street, boolean b1, boolean b2) { ... }
Run Code Online (Sandbox Code Playgroud)

等等.因为不同的对象只能通过名称来区分,所以我想将它们包装在Objects(Enums)中,这样我就可以使用该语言的类型系统(在本例中为Java).

public class Name {
    private String value;
    public String getValue() { return value; }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

像这样我可以强制调用代码传递某种类型的对象.这样可以确保它不会意外混淆方法参数的顺序,因此不会在运行时产生意外行为:

foo(new Name("John"), new Street("Broadway"), new B1(true), new B2(false);
Run Code Online (Sandbox Code Playgroud)

这使得重构更加安全,只要你愿意,你可以通过系统携带对象,其中的数据,字符串始终是安全的.只有在需要它时,才能通过调用getValue()来获得它.

现在,对于包装字符串的对象,它非常简单,因为有许多状态实例可以存在.

但是布尔包装器怎么样?这些是TRUE或FALSE.实现只是看起来,有点好笑:

public enum Quanto {

    YES() {
        protected boolean isQuanto() {
            return true;
        }
    },
    NO() {
        protected boolean isQuanto() {
            return false;
        }
    };

    protected abstract boolean isQuanto();

}
Run Code Online (Sandbox Code Playgroud)

更奇怪的是我发现调用代码是什么样的:

public void doStuff(Quanto quanto) {
    if(quanto.isQuanto()) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

从技术上讲,它当然没关系,但它感觉不对......你找到了"更好"的方法来解决这个问题吗?

编辑:令我不高兴的,在上面的例子中有比YesNO更值得思考的事实,比如MAYBE ......?!

谢谢!

Chs*_*y76 9

我会将布尔值换成语义枚举.换一种说法:

public void doStuff(boolean isActive, boolean wrapResult);
Run Code Online (Sandbox Code Playgroud)

public enum State {ACTIVE, INACTIVE};
public enum ResultMode {WRAPPED, UNWRAPPED};

public void doStuff(State state, ResultMode resultsMode);
Run Code Online (Sandbox Code Playgroud)