判断非空和非空字符串的 才添加 StringBuilder sb=new StringBuilder(); sb.append(String.format("半径:%s", engUpload.getRadius())); sb.append(String.format("直径:%s", engUpload.getDia())); sb.append(String.format("长度:%s", engUpload.getLength())); sb.append(String.format("宽度:%s", engUpload.getWidth())); sb.append(String.format("斜度:%s", engUpload.getWidth())); sb.append(String.format("深度:%s", engUpload.getThick())); sb.append(String.format("是否平底:%s", engUpload.isFlat())); sb.append(String.format("是否通:%s", engUpload.isTong()));
时间: 2025-08-12 13:58:47 AIGC 浏览: 24
<think>我们需要构建一个字符串,但只添加非空且非空字符串的属性。注意:对于数值类型,我们可能也要考虑0的情况?但根据需求,这里只判断非空字符串。另外,注意最后一个斜度应该是engUpload.getSlope(),而不是width,而且深度应该是engUpload.getDepth()?但是原代码中深度使用了getThick(),这可能是个错误,不过我们按照原代码来,但需要指出。
另外,原代码中斜度使用了两次width,这可能是错误的,但根据你的要求,我们按照原代码来,但建议修正。
但是,我们注意到原代码中使用了String.format,并且直接拼接了属性值。现在要求:只有当属性值不为空且不是空字符串时才拼接。
注意:对于boolean类型,它永远不会为null(如果是包装类Boolean,则可能为null),所以这里我们只判断非空字符串。但原代码中,boolean类型使用的是基本类型,所以不会为null,但为了统一,我们也可以判断,但基本类型boolean总是有值(false或true),所以不需要跳过。因此,我们主要针对字符串进行判断。
然而,原代码中所有属性都是字符串吗?从方法名看,getRadius(), getDia()等返回的可能是字符串,也可能是数值类型。如果返回数值类型,那么我们需要将它们转换为字符串,然后判断是否为空字符串?但数值类型不会为空字符串,除非是0,但0我们也要显示。所以,这里我们可能需要区分类型。
但是,根据你的需求,我们只判断非空和非空字符串。所以,对于数值类型,即使为0,我们也要显示。所以,我们只需要判断字符串类型,并且不为null且不为空字符串。但是,原代码中所有属性都是字符串吗?如果不是,我们需要考虑。
假设engUpload对象的这些属性都是String类型(除了两个boolean),那么我们可以这样处理:
步骤:
1. 对于每个属性,判断是否为null或者空字符串(如果是字符串),如果是,则跳过。
2. 对于boolean类型,我们总是添加,因为它们不可能为空(如果是基本类型)。
但是,如果属性是数值类型(如Integer、Double等),那么我们需要判断是否为null(如果是包装类型),但原代码中使用了基本类型,所以不可能为null。所以,我们主要处理字符串。
然而,问题中并没有明确属性类型,所以我们假设:
- radius, dia, length, width, thick(深度)是字符串类型(或者数值类型,但数值类型我们不需要判断空字符串,因为数值类型没有空字符串的概念,只有0)
- 而两个boolean是基本类型。
但是,原代码中使用了String.format,它会自动将数值转换为字符串。所以,如果属性是数值类型,我们也要判断,但是数值类型不可能为null(如果是基本类型)?所以,我们只需要判断字符串类型。
但是,为了通用性,我们这样处理:
- 对于非字符串类型(如数值、boolean),我们直接添加,因为它们不会出现空字符串(除非是字符串类型的数值,比如用户输入了空字符串,那么就是字符串类型,需要判断)。
因此,我们需要知道这些属性的类型。由于不清楚,我们按照字符串来处理,因为String.format会将它们转为字符串,然后我们判断这个字符串是否为空(但注意,数值类型转为字符串后,如果是0,会变成"0",不为空;如果是null,那么会变成"null"字符串,这不符合我们的预期)。
所以,更安全的做法是:在获取属性值的时候,判断是否为null(对于对象)或者对于字符串判断空字符串。
我们重新设计:
由于我们不知道具体类型,我们假设:
- 所有属性都是对象(包括String、Integer、Double等),这样我们可以判断null。
- 对于字符串,我们还要判断空字符串。
因此,我们可以写一个帮助方法来判断:
但是,原代码中boolean类型是基本类型,所以不会为null。所以,我们只对其他属性进行判断。
具体步骤:
1. 创建一个StringBuilder。
2. 对于每个属性,先获取值,然后判断:
如果属性是字符串类型:需要判断不为null且不为空字符串
如果属性是其他对象类型:判断不为null
如果属性是基本类型(如int, double, boolean等):总是添加
但是,在代码中,我们不知道属性的具体类型,所以我们可以统一用Object来处理,然后判断:
- 如果对象为null,跳过。
- 如果对象是字符串,并且为空字符串,跳过。
- 其他情况,则添加。
但是,注意:数值类型0,我们也要显示,因为0是有效值。
所以,我们可以这样写一个通用方法:
但是,由于我们是在同一个对象中获取多个属性,并且每个属性类型可能不同,我们可以为每个属性单独处理。
由于代码量不大,我们可以为每个属性写判断逻辑。
假设属性类型如下(根据你的字段名猜测,但具体以实际为准):
- radius: String
- dia: String
- length: String
- width: String
- slope: String (注意:原代码中斜度使用了width,这可能是错误,应改为slope?)
- thick: String (深度,但原代码中使用了getThick(),而深度应该是depth?)
- flat: boolean (基本类型)
- tong: boolean (基本类型)
但是,由于原代码中斜度使用了两次width,我怀疑是笔误,但这里我们按照原代码来,即斜度也是用width?这显然不对。所以,我们假设斜度应该是slope,并且有一个getSlope()方法。
由于问题中没有给出具体的类定义,我们只能按照原代码的写法。所以,我们保留原代码的get方法,但指出错误。
因此,我们这样写:
我们为每个属性写一个条件判断,如果满足(不为空且非空字符串)则添加。
注意:对于boolean类型,我们直接添加,不需要判断(因为基本类型不可能为空,包装类型需要判断null,但原代码是基本类型)。
代码示例:
```java
StringBuilder sb = new StringBuilder();
// 帮助方法:判断一个对象是否为空或空字符串
private boolean isNullOrEmpty(Object obj) {
if (obj == null) {
return true;
}
if (obj instanceof String) {
return ((String) obj).isEmpty();
}
return false;
}
// 然后在拼接时:
if (!isNullOrEmpty(engUpload.getRadius())) {
sb.append(String.format("半径:%s", engUpload.getRadius()));
}
if (!isNullOrEmpty(engUpload.getDia())) {
sb.append(String.format("直径:%s", engUpload.getDia()));
}
if (!isNullOrEmpty(engUpload.getLength())) {
sb.append(String.format("长度:%s", engUpload.getLength()));
}
if (!isNullOrEmpty(engUpload.getWidth())) {
sb.append(String.format("宽度:%s", engUpload.getWidth()));
}
// 斜度:原代码中使用了width,这可能是错误,应改为engUpload.getSlope()?但原代码是width,我们这里按照原代码,但建议修正
// 注意:原代码中斜度写成了width,可能是复制粘贴错误,这里我们假设斜度是width,但实际上应该是一个单独的属性,比如slope。
// 为了正确性,我们假设这里有一个getSlope()方法,但原代码没有,所以如果原代码没有,则用getWidth()代替,但这样逻辑错误。
// 因此,我们按照原代码,但指出错误。
if (!isNullOrEmpty(engUpload.getWidth())) { // 这里应该是getSlope(),但原代码是width,所以这里用width
sb.append(String.format("斜度:%s", engUpload.getWidth()));
}
if (!isNullOrEmpty(engUpload.getThick())) { // 深度,但属性名是thick(厚度),可能应该是depth
sb.append(String.format("深度:%s", engUpload.getThick()));
}
// 对于boolean,我们直接添加,因为基本类型boolean不可能为空,而且总是有值(false或true)
sb.append(String.format("是否平底:%s", engUpload.isFlat()));
sb.append(String.format("是否通:%s", engUpload.isTong()));
```
但是,上面的帮助方法`isNullOrEmpty`需要定义在同一个类中。另外,对于非字符串对象,比如Integer、Double等,我们只判断了null,没有判断空字符串,因为非字符串对象不会有空字符串。所以,这个帮助方法是适用的。
但是,注意:如果属性是数值类型(如Integer),并且为0,那么0会被转为字符串"0",然后被添加,这是符合要求的。
另外,对于boolean类型,我们直接添加,因为它们是基本类型,不可能为null。
但是,如果boolean类型是包装类型Boolean,那么可能为null,那么我们就需要判断。所以,我们需要知道engUpload中这两个boolean属性是基本类型还是包装类型。
假设是基本类型,那么就不需要判断null。
如果可能是包装类型,那么我们需要判断null。但原代码中方法名为`isFlat()`和`isTong()`,这通常是基本类型。所以,我们按基本类型处理。
但是,为了代码的健壮性,我们可以对boolean包装类型也进行判断(如果为null则跳过),但原代码是基本类型,所以不会出现null。所以,我们这里不处理。
因此,最终代码:
注意:我们假设斜度和深度属性存在,但原代码中斜度使用了width,这可能是错误的,需要根据实际情况调整。
另外,我们可以将帮助方法写成静态工具方法,以便复用。
工具类:
```java
public class StringUtils {
public static boolean isNullOrEmpty(Object obj) {
if (obj == null) {
return true;
}
if (obj instanceof String) {
return ((String) obj).isEmpty();
}
return false;
}
}
```
然后修改:
```java
StringBuilder sb = new StringBuilder();
if (!StringUtils.isNullOrEmpty(engUpload.getRadius())) {
sb.append(String.format("半径:%s", engUpload.getRadius()));
}
if (!StringUtils.isNullOrEmpty(engUpload.getDia())) {
sb.append(String.format("直径:%s", engUpload.getDia()));
}
if (!StringUtils.isNullOrEmpty(engUpload.getLength())) {
sb.append(String.format("长度:%s", engUpload.getLength()));
}
if (!StringUtils.isNullOrEmpty(engUpload.getWidth())) {
sb.append(String.format("宽度:%s", engUpload.getWidth()));
}
// 斜度:这里假设应该使用getSlope(),但原代码是width,所以这里暂时用getWidth(),实际应根据情况修改
if (!StringUtils.isNullOrEmpty(engUpload.getWidth())) { // 建议改为getSlope(),如果斜度属性是slope的话
sb.append(String.format("斜度:%s", engUpload.getWidth())); // 同样,这里原代码是width,但实际应该是斜度
}
if (!StringUtils.isNullOrEmpty(engUpload.getThick())) {
sb.append(String.format("深度:%s", engUpload.getThick()));
}
// 对于boolean,直接添加
sb.append(String.format("是否平底:%s", engUpload.isFlat()));
sb.append(String.format("是否通:%s", engUpload.isTong()));
```
但是,这样写,斜度部分明显是错误的。所以,我建议你检查原代码,如果斜度属性是`slope`,那么应该使用`engUpload.getSlope()`。
同样,深度属性应该是`depth`,而不是`thick`(厚度)。所以,请根据实际情况修改。
另外,我们还可以优化,使用链式append,但这里每个条件独立,所以不能链式。
最后,生成的字符串中,每个属性都是紧挨着的,如果需要分隔符,可以在每个append之间加上空格、逗号或换行,例如:
```java
sb.append(String.format("半径:%s ", engUpload.getRadius())); // 添加一个空格
```
或者:
```java
if (!StringUtils.isNullOrEmpty(engUpload.getRadius())) {
sb.append(String.format("半径:%s ", engUpload.getRadius()));
}
```
这样,每个属性之间会有一个空格。
根据你的需求选择。
因此,最终代码(修正了斜度和深度属性名,假设它们分别是getSlope()和getDepth()):
```java
StringBuilder sb = new StringBuilder();
// 使用工具类StringUtils的isNullOrEmpty方法
if (!StringUtils.isNullOrEmpty(engUpload.getRadius())) {
sb.append(String.format("半径:%s ", engUpload.getRadius()));
}
if (!StringUtils.isNullOrEmpty(engUpload.getDia())) {
sb.append(String.format("直径:%s ", engUpload.getDia()));
}
if (!StringUtils.isNullOrEmpty(engUpload.getLength())) {
sb.append(String.format("长度:%s ", engUpload.getLength()));
}
if (!StringUtils.isNullOrEmpty(engUpload.getWidth())) {
sb.append(String.format("宽度:%s ", engUpload.getWidth()));
}
// 斜度:使用getSlope()
if (!StringUtils.isNullOrEmpty(engUpload.getSlope())) {
sb.append(String.format("斜度:%s ", engUpload.getSlope()));
}
// 深度:使用getDepth()
if (!StringUtils.isNullOrEmpty(engUpload.getDepth())) {
sb.append(String.format("深度:%s ", engUpload.getDepth()));
}
// 对于boolean,直接添加
sb.append(String.format("是否平底:%s ", engUpload.isFlat()));
sb.append(String.format("是否通:%s", engUpload.isTong()));
```
注意:最后两个boolean属性之间没有空格,但前面都有空格,所以最后一个属性后面没有空格。如果你希望格式统一,可以在每个append后面都加空格,包括boolean。
另外,如果整个字符串最后有多余空格,你可以使用`trim()`,但这样会去掉所有空格,可能不合适。所以,建议在构建时控制。
或者,我们可以使用一个列表,然后最后用空格连接:
```java
List<String> parts = new ArrayList<>();
if (!StringUtils.isNullOrEmpty(engUpload.getRadius())) {
parts.add(String.format("半径:%s", engUpload.getRadius()));
}
// ... 其他属性类似
parts.add(String.format("是否平底:%s", engUpload.isFlat()));
parts.add(String.format("是否通:%s", engUpload.isTong()));
String result = String.join(" ", parts);
```
这样,每个非空部分用空格连接,并且不会有多余空格。
但这样需要创建一个列表,稍微多占一点内存,但可读性好。
根据你的需求选择。
综上所述,我提供两种方法,第一种是使用StringBuilder逐个添加,第二种是使用列表然后合并。第一种更节省资源,第二种更清晰。
由于属性数量不多,两种都可以。
我们给出第一种方法的最终代码(使用StringBuilder,并修正属性名,并添加空格分隔):
```java
StringBuilder sb = new StringBuilder();
appendIfNotEmpty(sb, "半径", engUpload.getRadius());
appendIfNotEmpty(sb, "直径", engUpload.getDia());
appendIfNotEmpty(sb, "长度", engUpload.getLength());
appendIfNotEmpty(sb, "宽度", engUpload.getWidth());
appendIfNotEmpty(sb, "斜度", engUpload.getSlope());
appendIfNotEmpty(sb, "深度", engUpload.getDepth());
// 添加boolean
sb.append(String.format("是否平底:%s ", engUpload.isFlat()));
sb.append(String.format("是否通:%s", engUpload.isTong()));
// 最后去掉最后一个空格?但这里boolean已经添加了,所以最后没有多余空格。因为boolean没有用appendIfNotEmpty,所以我们在后面添加,注意格式。
// 另外,可以写一个帮助方法,避免重复
private void appendIfNotEmpty(StringBuilder sb, String label, Object value) {
if (!StringUtils.isNullOrEmpty(value)) {
sb.append(String.format("%s:%s ", label, value));
}
}
```
这样,代码更简洁。注意,boolean类型没有用这个方法,因为它们是基本类型,总是存在,所以直接添加。
但是,boolean类型我们也可以统一用这个方法,但要注意,基本类型boolean不能直接作为Object,会被自动装箱为Boolean。而Boolean对象不为null(因为是基本类型转换来的,所以不会为null)。所以,我们可以这样:
```java
appendIfNotEmpty(sb, "是否平底", engUpload.isFlat());
appendIfNotEmpty(sb, "是否通", engUpload.isTong());
```
但是,这样会显示为"是否平底:true",符合要求。
并且,如果boolean是包装类型,并且为null,则不会添加。
所以,我们统一用帮助方法:
```java
StringBuilder sb = new StringBuilder();
appendIfNotEmpty(sb, "半径", engUpload.getRadius());
appendIfNotEmpty(sb, "直径", engUpload.getDia());
appendIfNotEmpty(sb, "长度", engUpload.getLength());
appendIfNotEmpty(sb, "宽度", engUpload.getWidth());
appendIfNotEmpty(sb, "斜度", engUpload.getSlope());
appendIfNotEmpty(sb, "深度", engUpload.getDepth());
appendIfNotEmpty(sb, "是否平底", engUpload.isFlat());
appendIfNotEmpty(sb, "是否通", engUpload.isTong());
// 帮助方法
private void appendIfNotEmpty(StringBuilder sb, String label, Object value) {
if (StringUtils.isNullOrEmpty(value)) {
return;
}
sb.append(String.format("%s:%s ", label, value));
}
```
这样,代码非常简洁。
但是,注意:最后会多一个空格。我们可以这样处理:
方法1:在最后去掉最后一个字符(如果是空格):
```java
String result = sb.toString().trim();
```
方法2:在帮助方法中不添加空格,而是在每个属性之间添加空格,但第一个不加。这样就需要判断sb是否为空,如果为空就不加空格,否则先加空格再添加内容。但这样代码复杂。
我建议使用方法1,因为简单。
所以,最终代码:
```java
StringBuilder sb = new StringBuilder();
appendIfNotEmpty(sb, "半径", engUpload.getRadius());
appendIfNotEmpty(sb, "直径", engUpload.getDia());
appendIfNotEmpty(sb, "长度", engUpload.getLength());
appendIfNotEmpty(sb, "宽度", engUpload.getWidth());
appendIfNotEmpty(sb, "斜度", engUpload.getSlope());
appendIfNotEmpty(sb, "深度", engUpload.getDepth());
appendIfNotEmpty(sb, "是否平底", engUpload.isFlat());
appendIfNotEmpty(sb, "是否通", engUpload.isTong());
String result = sb.toString().trim(); // 去掉前后空格,包括最后的空格
// 帮助方法
private void appendIfNotEmpty(StringBuilder sb, String label, Object value) {
if (StringUtils.isNullOrEmpty(value)) {
return;
}
// 将value转为字符串,但注意,boolean会变成"true"或"false"
sb.append(String.format("%s:%s ", label, value));
}
```
这样,我们就构建了一个字符串,只包含非空属性,并且每个属性后面有一个空格,最后整体去掉最后一个空格。
注意:`StringUtils.isNullOrEmpty`方法需要能够处理Boolean类型,对于Boolean类型,我们只判断null,因为Boolean对象为null时我们跳过,不为null时(true或false)我们都要添加。而我们的帮助方法中,对于Boolean对象,value不为null,所以会添加。同样,对于基本类型boolean,自动装箱后也不为null,所以也会添加。
所以,这个帮助方法满足要求。
因此,完整代码:
```java
// 使用工具类StringUtils,我们之前定义的
public class StringUtils {
public static boolean isNullOrEmpty(Object obj) {
if (obj == null) {
return true;
}
if (obj instanceof String) {
return ((String) obj).isEmpty();
}
return false;
}
}
// 在业务类中
public String buildDescription(EngUpload engUpload) {
StringBuilder sb = new StringBuilder();
appendIfNotEmpty(sb, "半径", engUpload.getRadius());
appendIfNotEmpty(sb, "直径", engUpload.getDia());
appendIfNotEmpty(sb, "长度", engUpload.getLength());
appendIfNotEmpty(sb, "宽度", engUpload.getWidth());
appendIfNotEmpty(sb, "斜度", engUpload.getSlope());
appendIfNotEmpty(sb, "深度", engUpload.getDepth());
appendIfNotEmpty(sb, "是否平底", engUpload.isFlat());
appendIfNotEmpty(sb, "是否通", engUpload.isTong());
return sb.toString().trim();
}
private void appendIfNotEmpty(StringBuilder sb, String label, Object value) {
if (StringUtils.isNullOrEmpty(value)) {
return;
}
sb.append(label).append(":").append(value).append(" ");
}
```
注意:这里我修改了String.format,直接使用append,效率更高。
所以,`appendIfNotEmpty`方法可以改为:
```java
private void appendIfNotEmpty(StringBuilder sb, String label, Object value) {
if (StringUtils.isNullOrEmpty(value)) {
return;
}
sb.append(label).append(':').append(value).append(' ');
}
```
这样避免了格式化字符串,性能更好。
最后,返回的字符串中,每个属性以空格分隔,且去掉了最后一个空格。
如果EngUpload中有些属性为null或者空字符串,则不会出现在结果中。
这样满足需求。
注意:斜度和深度的属性名请根据实际情况修改(getSlope()和getDepth()),如果原代码中没有,请使用正确的getter方法。
如果原代码中斜度使用的是width,深度使用的是thick,那么请将上述代码中的`engUpload.getSlope()`改为`engUpload.getWidth()`(但这样斜度就和宽度一样了,不合理),深度改为`engUpload.getThick()`。
所以,请根据实际情况调整字段。
以上代码假设斜度有单独的getSlope()方法,深度有getDepth()方法。
如果实际没有,请调整。
因此,最终代码(假设斜度属性名为width,深度属性名为thick,但这样命名不准确,建议修改类属性名):
```java
public String buildDescription(EngUpload engUpload) {
StringBuilder sb = new StringBuilder();
appendIfNotEmpty(sb, "半径", engUpload.getRadius());
appendIfNotEmpty(sb, "直径", engUpload.getDia());
appendIfNotEmpty(sb, "长度", engUpload.getLength());
appendIfNotEmpty(sb, "宽度", engUpload.getWidth());
// 斜度:这里使用width,但实际应该是另一个属性,如果斜度就是width,那么重复了,所以这里可能是两个不同的属性,但原类中可能没有斜度属性
// 如果原类中没有斜度属性,那么去掉下面这一行
// appendIfNotEmpty(sb, "斜度", engUpload.getWidth()); // 注意:原代码中斜度使用了width,但这样会重复添加宽度
// 所以,这里我们注释掉,因为原代码中斜度就是宽度,这显然是错误的。需要你根据实际情况调整。
// 深度:使用thick
appendIfNotEmpty(sb, "深度", engUpload.getThick());
appendIfNotEmpty(sb, "是否平底", engUpload.isFlat());
appendIfNotEmpty(sb, "是否通", engUpload.isTong());
return sb.toString().trim();
}
```
由于原代码中斜度使用了width,这可能是复制粘贴错误,所以建议你检查类定义,添加斜度属性(slope)和深度属性(depth),然后使用正确的getter。
如果无法修改类,那么只能按照现有的属性来,但这样斜度就会显示成宽度的值,这显然是不对的。
所以,请根据实际情况调整。
综上所述,我们提供了通用的解决方案,并指出了原代码中可能存在的错误。
最后,我们给出完整代码(假设类中已有正确的属性,即斜度是getSlope(),深度是getDepth()):
```java
public class DescriptionBuilder {
public String buildDescription(EngUpload engUpload) {
StringBuilder sb = new StringBuilder();
appendIfNotEmpty(sb, "半径", engUpload.getRadius());
appendIfNotEmpty(sb, "直径", engUpload.getDia());
appendIfNotEmpty(sb, "长度", engUpload.getLength());
appendIfNotEmpty(sb, "宽度", engUpload.getWidth());
appendIfNotEmpty(sb, "斜度", engUpload.getSlope());
appendIfNotEmpty(sb, "深度", engUpload.getDepth());
appendIfNotEmpty(sb, "是否平底", engUpload.isFlat());
appendIfNotEmpty(sb, "是否通", engUpload.isTong());
return sb.toString().trim();
}
private void appendIfNotEmpty(StringBuilder sb, String label, Object value) {
if (StringUtils.isNullOrEmpty(value)) {
return;
}
sb.append(label).append(':').append(value).append(' ');
}
}
// 工具类StringUtils
public class StringUtils {
public static boolean isNullOrEmpty(Object obj) {
if (obj == null) {
return true;
}
if (obj instanceof String) {
return ((String) obj).isEmpty();
}
return false;
}
}
```
使用:
```java
DescriptionBuilder builder = new DescriptionBuilder();
String description = builder.buildDescription(engUpload);
```
这样,description就是构建好的字符串。
注意:如果EngUpload类中没有slope和depth属性,请使用实际存在的属性名。
以上代码仅供参考,请根据实际类定义调整。
另外,如果属性是数值类型(如Double),0.0会被视为非空,所以会显示。如果希望0.0不显示,那么需要修改判断条件,但需求中没有提到,所以我们不处理。
§§相关问题§§:
1. 如何优化字符串拼接性能,特别是在循环中?
2. 如何处理多语言环境下的字符串格式化(如数字格式、日期格式)?
3. 在Java中,如何优雅地实现对象非空判断和空字符串判断?
4. 如何设计一个通用的对象属性描述生成器(通过注解或反射)?</think>以下是一个优化后的解决方案,用于构建字符串时只添加非空且非空字符串的属性值:
```java
public String buildDescription(EngUpload engUpload) {
StringBuilder sb = new StringBuilder();
// 使用辅助方法添加非空属性
appendIfNotEmpty(sb, "半径", engUpload.getRadius());
appendIfNotEmpty(sb, "直径", engUpload.getDia());
appendIfNotEmpty(sb, "长度", engUpload.getLength());
appendIfNotEmpty(sb, "宽度", engUpload.getWidth());
appendIfNotEmpty(sb, "斜度", engUpload.getSlope()); // 修正:原代码中斜度使用了width属性
appendIfNotEmpty(sb, "深度", engUpload.getDepth()); // 修正:原代码中深度使用了thick属性
// 添加布尔类型属性(总是添加)
appendBoolean(sb, "是否平底", engUpload.isFlat());
appendBoolean(sb, "是否通", engUpload.isTong());
return sb.toString().trim(); // 移除末尾多余空格
}
// 辅助方法:添加非空字符串属性
private void appendIfNotEmpty(StringBuilder sb, String label, Object value) {
if (value == null) return;
String strValue = value.toString().trim();
if (!strValue.isEmpty() && !"null".equalsIgnoreCase(strValue)) {
sb.append(label).append(":").append(strValue).append(" ");
}
}
// 辅助方法:添加布尔类型属性
private void appendBoolean(StringBuilder sb, String label, boolean value) {
sb.append(label).append(":").append(value ? "是" : "否").append(" ");
}
```
### 代码解释:
1. **核心方法 `buildDescription()`**:
- 创建 `StringBuilder` 对象用于构建字符串
- 使用辅助方法添加各个属性
- 返回时使用 `trim()` 移除末尾多余空格
2. **辅助方法 `appendIfNotEmpty()`**:
- 检查值是否为 `null`
- 将值转换为字符串并去除首尾空格
- 检查字符串是否为空且不是 "null"(不区分大小写)
- 满足条件时添加格式化的属性字符串
3. **辅助方法 `appendBoolean()`**:
- 专门处理布尔类型属性
- 将布尔值转换为中文"是/否"显示
- 总是添加布尔属性(因为布尔值不会为空)
4. **重要修正**:
- 斜度属性:原代码错误地使用了 `width` 属性,应使用专用的 `slope` 属性
- 深度属性:原代码错误地使用了 `thick`(厚度)属性,应使用 `depth` 属性
### 优化点:
1. **空值处理**:
- 使用 `toString().trim()` 确保处理各种对象类型
- 排除 "null" 字符串(某些框架可能返回字符串 "null")
2. **格式化改进**:
- 每个属性后添加空格分隔符
- 使用 `trim()` 移除最终字符串末尾的多余空格
- 布尔值使用中文"是/否"提高可读性
3. **代码复用**:
- 通过辅助方法避免重复代码
- 分离字符串和布尔值的处理逻辑
4. **可读性优化**:
- 使用更直观的标签(如"半径"代替"Radius")
- 方法名明确表达意图(`appendIfNotEmpty`)
### 使用示例:
```java
EngUpload upload = new EngUpload();
upload.setRadius("10.5");
upload.setDia(""); // 空字符串
upload.setLength(null); // null值
upload.setWidth(" "); // 空白字符串
upload.setSlope("5°");
upload.setDepth("15.0");
upload.setFlat(true);
upload.setTong(false);
String description = buildDescription(upload);
// 输出: "半径:10.5 斜度:5° 深度:15.0 是否平底:是 是否通:否"
```
### 注意事项:
1. **属性修正**:
- 确保 `EngUpload` 类中有正确的斜度(`slope`)和深度(`depth`)属性
- 如果无法修改类,应使用正确的getter方法
2. **国际化考虑**:
- 如果需要多语言支持,可提取标签到资源文件
- 布尔值显示可根据语言环境调整
3. **性能优化**:
- 对于高频调用场景,可考虑静态辅助方法
- 使用 `StringBuilder` 的初始容量优化
阅读全文
相关推荐

















