在 Java 中将字符串转换为布尔值的最佳方法

Best way to convert String to Boolean in Java

我目前对我工作的数据库有疑问。

他们使用基于 0 和 1 的字符串来指示它是否处于活动状态。但是根据我的逻辑,我想使用 true 或 false。

为什么?因为有冗余代码。例如:

if(foo.getStateClient().equals("1"))
   //Do things...

想象一下,还有 6 或 7 个字段。

无法修改数据库。而且我不知道是否像前面的例子那样使用字符串,或者做任何事情来将字符串转换为布尔值。

并且,状态始终为 0 或 1

我很感激任何更优化的建议

编辑 1 我不是在问怎么做,我是在问最佳实践。

我将 Spring 与 Hibernate 一起使用,因为人们问我我使用的是什么 ORM。

只需创建一个可以重复用于此类事情的辅助方法

public class BooleanHelper {

    public static boolean fromString(String value) {
        if (value == null) {
            return false;
        }
        if ("1".equals(value) || "true".equalsIgnoreCase(value)) {
            return true;
        }
        return false;
    }

}

这样你就可以在任何需要的地方使用它

if(BooleanHelper.fromString(foo.getStateClient()))
   //Do things...

您也可以静态导入该方法,以减少样板代码

编辑:OP 表示使用 Spring 和 Hibernate

正如您所指出的,您正在使用 Spring 和 Hibernate,您可以为此创建一个 AttributeConverter

public class BooleanAttributeConverter implements AttributeConverter<Boolean, String> {
    @Override
    public String convertToDatabaseColumn(Boolean value) {
        if (value == null) {
            return "0";
        }
        return value ? "1" : "0";
    }

    @Override
    public Boolean convertToEntityAttribute(String value) {
        if (value == null) {
            return false;
        }
        if ("1".equals(value) || "true".equalsIgnoreCase(value)) {
            return true;
        }
        return false;
    }
}

然后在您的实体上指定此

@Entity
public class Foo {

    @Column
    @Convert(converter = BooleanAttributeConverter.class)
    private boolean stateClient;

    public boolean isStateClient() {
        return stateClient;
    }

    public void setStateClient(boolean stateClient) {
        this.stateClient = stateClient;
    }
}

在数据库中,TINYINT 0/1 可以立即成为 java 端的 boolean。 因此,将字段设置为布尔值(有时可能是布尔值)并尝试它是否有效。

通过这种方式,可以逐步将所有准布尔字段重构为真实字段。

如果字段是 CHAR(1),您仍然可能会成功,可能在 java 实体端使用一些转换器。

这样你的数据模型很干净,没有人工样板代码。

您可以在实体中为属性使用 Boolean 类型,并使用 AttributeConverter 处理实体中 Boolean 和数据库中 String/varchar 之间的转换。

@Converter
public class BooleanConverter implements AttributeConverter<Boolean, String> {

    @Override
    public Character convertToDatabaseColumn(Boolean value) {
        if (value != null) {
            if (value) {
                return '1';
            } else {
                return '0';
            }

        }
        return null;
    }

    @Override
    public Boolean convertToEntityAttribute(String value) {
        if (value != null) {
            return !value.equals('0');
        }
        return null;
    }

}

实体:

@Convert(converter = BooleanConverter.class)
private boolean status;