在 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;
我目前对我工作的数据库有疑问。
他们使用基于 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;