SKU处理程序解析方法分离需求及现有实现问题咨询
嘿,这个需求很合理啊——把文件解析的逻辑从SKU类里抽出来,完全符合单一职责原则,SKU类就该专注于自身的属性和业务行为,解析这种通用操作交给专门的组件来做才对。我给你分享几个实用的实现方案,你可以根据自己的场景选:
方案1:创建独立的SKU解析器类(推荐)
这是最符合面向对象设计的方式,把解析逻辑封装到一个专门的SKUParser类里,职责单一,也方便后续扩展和测试。
步骤拆解:
- 精简SKU类:只保留SKU的属性、构造方法、getter/setter,以及和SKU自身相关的业务方法(比如库存计算、价格校验等),把解析代码完全移除。
public class SKU { private String skuId; private String productName; private double price; // 其他你需要的属性 // 构造方法 public SKU(String skuId, String productName, double price) { this.skuId = skuId; this.productName = productName; this.price = price; } // Getter/Setter方法 public String getSkuId() { return skuId; } public void setSkuId(String skuId) { this.skuId = skuId; } // 其他属性的getter/setter... // SKU自身的业务方法示例 public boolean isPriceValid() { return this.price > 0; } }
- 保留Store类的存储职责:Store类继续负责管理SKU的集合,不用做太大改动,只需要保留添加SKU的方法即可。
import java.util.ArrayList; public class Store { private ArrayList<SKU> skuInventory = new ArrayList<>(); public void addSKU(SKU sku) { skuInventory.add(sku); } // 其他和SKU集合相关的方法,比如查询、删除等 }
- 创建SKUParser类封装解析逻辑:把原来在SKU类里的文件读取、StringTokenizer解析逻辑全部移到这里,还可以拆分出解析单行数据的方法,方便复用和单元测试。
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.StringTokenizer; public class SKUParser { // 假设你的文件每行用逗号分隔SKU数据,比如:SKU001,手机,2999.99 public ArrayList<SKU> parseSKUFile(String filePath) throws IOException { ArrayList<SKU> parsedSkus = new ArrayList<>(); try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { String line; // 跳过表头(如果你的文件有表头的话) reader.readLine(); while ((line = reader.readLine()) != null) { SKU sku = parseSingleSKULine(line); if (sku != null) { parsedSkus.add(sku); } } } return parsedSkus; } // 单独解析一行数据为SKU对象,方便单独测试 private SKU parseSingleSKULine(String line) { StringTokenizer tokenizer = new StringTokenizer(line, ","); // 检查字段数量是否符合预期,避免解析出错 if (tokenizer.countTokens() != 3) { System.out.println("无效的SKU数据行:" + line); return null; } String skuId = tokenizer.nextToken().trim(); String productName = tokenizer.nextToken().trim(); double price = Double.parseDouble(tokenizer.nextToken().trim()); return new SKU(skuId, productName, price); } }
- 业务代码中调用解析器并添加到Store:在你的主逻辑或者业务服务类里,实例化解析器和Store,完成解析和存储的流程。
public class InventoryManager { public static void main(String[] args) { Store store = new Store(); SKUParser parser = new SKUParser(); try { ArrayList<SKU> skus = parser.parseSKUFile("sku_data.txt"); for (SKU sku : skus) { if (sku.isPriceValid()) { // 用SKU自身的业务方法校验 store.addSKU(sku); } } System.out.println("成功导入" + skus.size() + "个SKU"); } catch (IOException e) { System.err.println("读取SKU文件失败:" + e.getMessage()); } } }
方案2:使用静态工具类(适合简单场景)
如果你的解析逻辑比较简单,不需要后续扩展不同的解析方式(比如从CSV转成JSON),也可以用静态工具类来实现,代码更简洁。
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.StringTokenizer; public class SKUParseUtils { public static ArrayList<SKU> parseSKUFile(String filePath) throws IOException { ArrayList<SKU> parsedSkus = new ArrayList<>(); try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { String line; reader.readLine(); // 跳过表头 while ((line = reader.readLine()) != null) { StringTokenizer tokenizer = new StringTokenizer(line, ","); if (tokenizer.countTokens() != 3) { continue; } String skuId = tokenizer.nextToken().trim(); String productName = tokenizer.nextToken().trim(); double price = Double.parseDouble(tokenizer.nextToken().trim()); parsedSkus.add(new SKU(skuId, productName, price)); } } return parsedSkus; } }
调用的时候直接用静态方法:
ArrayList<SKU> skus = SKUParseUtils.parseSKUFile("sku_data.txt"); for (SKU sku : skus) { store.addSKU(sku); }
额外建议
如果以后需要支持多种数据源(比如从数据库读取、从API获取)或者多种数据格式(JSON、XML),可以进一步抽象出一个SKUDataSource接口,然后分别实现FileSKUDataSource、DatabaseSKUDataSource等,这样扩展性会更强。
内容的提问来源于stack exchange,提问作者Spartan123
相关产品推荐
相关产品推荐

