Java创建伪原生类型:自定义Quantity类的技术困境咨询
封装交易数量逻辑的Java实现方案
嘿,针对你想封装交易数量Quantity类的需求,我来给你拆解下Java特性限制的解决思路,毕竟股票和加密货币的数量规则确实差异不小:
首先先明确你的核心需求:
在股票交易中,数量通常为整数(如5股、10张期权等);在加密货币交易中,数量多为小数(如0.01比特币)。两种场景均存在最小单位要求(如股票以100股为倍数)。
你提到的几个Java特性限制确实是痛点,咱们逐个解决:
一、绕开原生类型无法继承的限制:用包装类封装核心属性
Java原生类型(比如double)确实是final不能继承,但咱们不需要继承它——而是把数量值、交易类型、最小单位作为Quantity类的私有成员,通过组合的方式实现封装。这里特别提醒:金融场景别用double,一定要用BigDecimal避免浮点精度误差,比如0.1+0.2的问题在交易中绝对不能出现。
示例代码如下:
import java.math.BigDecimal; public class Quantity { private final BigDecimal value; private final TransactionType type; private final BigDecimal minUnit; // 枚举区分交易类型 public enum TransactionType { STOCK, CRYPTO } // 构造方法:自动校验最小单位合规性 public Quantity(BigDecimal value, TransactionType type) { this.type = type; // 初始化对应交易类型的最小单位(股票按100股倍数,加密货币按比特币最小单位聪举例) this.minUnit = switch (type) { case STOCK -> new BigDecimal("100"); case CRYPTO -> new BigDecimal("0.00000001"); }; // 验证数量是否符合最小单位要求 if (value.remainder(minUnit).compareTo(BigDecimal.ZERO) != 0) { throw new IllegalArgumentException( String.format("%s数量不符合最小单位%s的要求", type, minUnit) ); } this.value = value; } // Getter方法 public BigDecimal getValue() { return value; } public TransactionType getType() { return type; } public BigDecimal getMinUnit() { return minUnit; } }
二、解决运算符缺失导致的代码冗余:封装算术操作方法
Java确实不支持运算符重载,但咱们可以给Quantity类封装对应的算术方法(比如add、subtract、multiply),同时加入类型校验,避免不同交易类型的数量乱操作:
在上面的Quantity类中补充这些方法:
// 加法操作 public Quantity add(Quantity other) { validateSameType(other); BigDecimal newValue = this.value.add(other.value); return new Quantity(newValue, this.type); } // 减法操作 public Quantity subtract(Quantity other) { validateSameType(other); BigDecimal newValue = this.value.subtract(other.value); // 交易数量不能为负,这里可以根据需求调整校验逻辑 if (newValue.compareTo(BigDecimal.ZERO) < 0) { throw new IllegalArgumentException("交易数量不能为负数"); } return new Quantity(newValue, this.type); } // 类型校验工具方法 private void validateSameType(Quantity other) { if (this.type != other.type) { throw new IllegalArgumentException("不同交易类型的数量无法进行算术操作"); } }
使用时可以通过链式调用让代码更简洁:
// 创建股票数量 Quantity stock1 = new Quantity(new BigDecimal("200"), Quantity.TransactionType.STOCK); Quantity stock2 = new Quantity(new BigDecimal("300"), Quantity.TransactionType.STOCK); // 计算总股票数量 Quantity totalStock = stock1.add(stock2);
三、替代typedef的方案:用工厂方法实现语义化区分
Java没有typedef,但咱们可以通过静态工厂方法给不同场景的数量起“别名”,让代码可读性更强:
在Quantity类中添加静态工厂方法:
// 创建合规的股票数量 public static Quantity ofStock(BigDecimal value) { return new Quantity(value, TransactionType.STOCK); } // 创建合规的加密货币数量 public static Quantity ofCrypto(BigDecimal value) { return new Quantity(value, TransactionType.CRYPTO); }
使用时就非常清晰:
Quantity appleStock = Quantity.ofStock(new BigDecimal("500")); Quantity bitcoin = Quantity.ofCrypto(new BigDecimal("0.5"));
这样一套下来,既满足了股票和加密货币的数量规则,又完美绕开了Java的那几个特性限制,代码还兼具可读性和安全性。
内容的提问来源于stack exchange,提问作者mils
相关产品推荐
相关产品推荐

