多类型对象属性转%分隔格式字符串的技术实现需求
解决对象转特定%分隔格式字符串的方案
嘿,我来帮你搞定这个把Employee和Address对象转换成指定格式字符串的需求!咱们一步步来:
核心思路
我们需要把每个对象的属性按照「属性标识%属性值」的片段拼接,最后把所有对象的片段用%连接起来,形成最终的目标字符串。
前置准备:补充类的必要方法
因为原类的属性都是private修饰的,我们需要添加Getter方法来访问这些属性,同时补充构造方法方便快速创建对象:
public class Employee { private String name; private int age; // 构造方法 public Employee(String name, int age) { this.name = name; this.age = age; } // Getter方法 public String getName() { return name; } public int getAge() { return age; } } public class Address { private String houseNo; private String street; private String pin; // 构造方法 public Address(String houseNo, String street, String pin) { this.houseNo = houseNo; this.street = street; this.pin = pin; } // Getter方法 public String getHouseNo() { return houseNo; } public String getStreet() { return street; } public String getPin() { return pin; } }
方案一:硬编码实现(简单直接,适合属性固定场景)
这种方式代码直观、性能好,适合属性不会频繁变动的情况:
public class ObjectToStringConverter { // 把Employee转成对应格式片段 private static String convertEmployee(Employee emp) { return "NA%" + emp.getName() + "%AG%" + emp.getAge(); } // 把Address转成对应格式片段 private static String convertAddress(Address adr) { return "HN%" + adr.getHouseNo() + "%ST%" + adr.getStreet() + "%PN%" + adr.getPin(); } // 合并两个对象的片段得到最终字符串 public static String combine(Employee emp, Address adr) { return convertEmployee(emp) + "%" + convertAddress(adr); } // 测试示例 public static void main(String[] args) { Employee emp = new Employee("Vidhya", 30); Address adr = new Address("80", "1st cross", "100100"); String result = combine(emp, adr); System.out.println(result); // 输出:NA%Vidhya%AG%30%HN%80%ST%1st cross%PN%100100 } }
方案二:反射实现(灵活扩展,适合属性可能变动场景)
如果后续可能新增属性,用反射可以避免修改转换逻辑,只需要更新属性标识映射表即可:
import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; public class FlexibleObjectConverter { // 定义属性名到标识的映射表 private static final Map<String, String> PROPERTY_TO_ID = new HashMap<>(); static { PROPERTY_TO_ID.put("name", "NA"); PROPERTY_TO_ID.put("age", "AG"); PROPERTY_TO_ID.put("houseNo", "HN"); PROPERTY_TO_ID.put("street", "ST"); PROPERTY_TO_ID.put("pin", "PN"); } // 单个对象转格式片段 private static String convertObject(Object obj) throws IllegalAccessException { StringBuilder segment = new StringBuilder(); Field[] fields = obj.getClass().getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); // 允许访问私有属性 String fieldName = field.getName(); String id = PROPERTY_TO_ID.get(fieldName); if (id != null) { Object value = field.get(obj); segment.append(id).append("%").append(value).append("%"); } } // 移除最后多余的% if (segment.length() > 0) { segment.deleteCharAt(segment.length() - 1); } return segment.toString(); } // 合并多个对象的片段 public static String combineObjects(Object... objects) throws IllegalAccessException { StringBuilder result = new StringBuilder(); for (Object obj : objects) { String segment = convertObject(obj); if (result.length() > 0) { result.append("%"); } result.append(segment); } return result.toString(); } // 测试示例 public static void main(String[] args) throws IllegalAccessException { Employee emp = new Employee("Vidhya", 30); Address adr = new Address("80", "1st cross", "100100"); String result = combineObjects(emp, adr); System.out.println(result); // 输出同样符合要求的字符串 } }
两种方案对比
- 硬编码:代码易读、性能高,适合属性固定的场景,但新增属性时需要修改转换方法。
- 反射:扩展性强,新增属性只需要更新映射表,但性能略低,且需要处理反射相关的异常。
内容的提问来源于stack exchange,提问作者Saumya
相关产品推荐
相关产品推荐

