【问题标题】:Java - Creating a Pseudo Native TypeJava - 创建伪本机类型
【发布时间】:2018-02-22 22:29:20
【问题描述】:

在股票交易中,数量通常是整数(例如 5 倍股票、10 倍期权等)。对于加密货币,数量是分数(例如 0.01 比特币)。在这两种情况下,通常都有一个最小单位(例如 100 倍股份的倍数)。

我想将此逻辑包装在 Quantity 类中。然而:

  • Java 原生类型(例如 double)是 final,所以我无法扩展它们
  • Java 不支持运算符重载,所以算术会很丑
  • Java 不支持 typedef,所以我不能用 Quantity 类型包装 double

所以我想我的问题是,如果我想创建类似于原生类型的东西(大量实例、按值传递、大量算术),是否有“经典”Java 解决方案?根据记忆,C# 有一个 struct 类型,它是按值传递的,Java 中是否有类似的东西?

谢谢,

编辑:是否可以从 C++ 代码中导入本机类型,并有效地绕过 Java?

【问题讨论】:

  • 没有。但是你可以使用 scala,编写自己的 dsl 并与 Java 交互就好了。
  • 谢谢 Elliott,这是否意味着重写 scala 中的现有代码库,或者某种互操作?
  • 是的。至于你的编辑,当然。您可以使用 JNA。准备编写更多代码。而且您仍然不会有运算符重载或 typedef。
  • 无论如何你都不应该使用double作为货币,你应该使用BigDecimal,它已经有你在谈论的问题,这是一个内置类型。向BigDecimal 学习,并以类似的方式实现您的Quantity 类。
  • BigDecimal 是朝着正确方向迈出的一步,但对于我的目的来说还不够。我需要更详细的逻辑。由于我需要对其进行扩展,因此我正在寻找一种能够同时处理上述问题的解决方案。

标签: java inheritance operator-overloading typedef pass-by-value


【解决方案1】:

是的,可以在 Java 中声明 typedef,保证类型正确,但没有声明新 Java 类的语法复杂性和运行时开销。

作为用户,您可以通过编写类型注释并在编译时使用注释处理器来做到这一点。例如,你可以写@Quantity int 来表示数量,你可以用javac -processor QuantityProcessor MyFile.java 编译。您可以对@Quantity int 使用任何算术运算,如果您将常规ints 与@Quantity ints 混合使用,或者如果存在其他错误(例如值不在正确范围内),编译器会发出警告是 100 的倍数。

有人需要定义类型注解和注解处理器,并且由于您的要求是独一无二的,您可能需要创建自己的。 Checker Framework 是一种可以轻松创建类型注释和注释处理器的框架。 (披露:我是一名开发人员。)

Checker Framework manual 的以下部分可能特别有用。

【讨论】:

  • 我认为这已经接近我们要找到的解决方案了 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 2013-03-09
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
相关资源
最近更新 更多