You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SKU处理程序解析方法分离需求及现有实现问题咨询

嘿,这个需求很合理啊——把文件解析的逻辑从SKU类里抽出来,完全符合单一职责原则,SKU类就该专注于自身的属性和业务行为,解析这种通用操作交给专门的组件来做才对。我给你分享几个实用的实现方案,你可以根据自己的场景选:

方案1:创建独立的SKU解析器类(推荐)

这是最符合面向对象设计的方式,把解析逻辑封装到一个专门的SKUParser类里,职责单一,也方便后续扩展和测试。

步骤拆解:

  1. 精简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;
    }
}
  1. 保留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集合相关的方法,比如查询、删除等
}
  1. 创建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);
    }
}
  1. 业务代码中调用解析器并添加到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:37:43