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

问题描述 投票:-3回答:3

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

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

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

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

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

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

而且,状态始终为0或1

我感谢任何建议都可以达到最佳效果

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

我将Spring与Hibernate结合使用,有人问我正在使用什么ORM。

java spring code-cleanup
3个回答
2
投票

您可以在实体中为属性使用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;

2
投票

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

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

如果字段改为CHAR(1),您仍然可能会成功,可能需要在Java实体端使用某些转换器。

通过这种方式,您的数据模型是干净的,并且没有人为的样板代码。


1
投票

只需创建一个可用于此类事物的辅助方法

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...

您也可以静态导入该方法,以减少样本量

编辑:使用Spring和Hibernate表示OP

正如您所指出的,您正在使用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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.