java - 除了覆盖算术运算符之外,还有其他方法可以在 Java 中实现 "overflow safe"算术运算吗?

标签 java overloading integer-overflow integer-arithmetic

所以这是我的问题。自从我学了Java,我就知道算术上溢和下溢是可以存在的,java编译器不会报错给你的。现在我提出了一个 Operation 类,其中包含“溢出安全”整数 +、-、* 方法。这样如果计算确实溢出,就会抛出算术异常。

public final class Operation{

    public static int aDD (int a, int b) {
    //do something
    if (overflow) {
    throw ArithmeticException("Integer Addition Overflow");
    }
    return a + b;
    }

    public static int sUB (int a, int b) {
    //do something
    if (overflow) {
    throw ArithmeticException("Integer Subtraction Overflow");
    }
    return a - b;
    }

    public static int mUL (int a, int b) {
    //do something
    if (overflow) {
    throw ArithmeticException("Integer Multiplication Overflow");
    }
    return a * b;
    }

    public static long aDD (long a, long b) {
    //do something
    if (overflow) {
    throw ArithmeticException("Long Addition Overflow");
    }
    return a + b;
    }

    public static long sUB (long a, long b) {
    //do something
    if (overflow) {
    throw ArithmeticException("Long Subtraction Overflow");
    }
    return a - b;
    }

    public static long mUL (long a, long b) {
    //do something
    if (overflow) {
    throw ArithmeticException("Long Multiplication Overflow");
    }
    return a * b;
    }
}

我想覆盖 Java 中原有的算术运算符。这样我就不需要键入 int c = Operation.aDD(a, b); 来使用“溢出安全”算术运算。相反,我只需要输入 int c = a + b;

但是,有人告诉我,用户定义的运算符覆盖在 Java 中是不可能的。那么,是否可以在不覆盖 Java 中的运算符的情况下获得相同的结果。无论如何这样做都是可以接受的,包括混合 Java 和 C++ 代码。(请注意,我所有的代码目前都是用 Java 编写的。但我认为我可以使用转换器将其转换为其他语言。虽然不能保证是错误-免费。)我唯一的目标是让我的旧程序使用“溢出安全”算术运算,而不必将所有 a + b 重构为 Operation.aDD(a, b )

非常感谢!

最佳答案

您可以使用 Xtend .您可以将 Xtend 视为 Java 语言预处理器。它生成纯的、人类可读的 Java 代码。

关于operator overloading的章节在 Xtend。以下是为整数运算符“+”重载方法定义的示例:

def static operator_add(IntVar a, IntVar b) {
    return Operation.add(a, b)
}

缺点

Xtend 也是一种语言,有一些小的学习曲线。它与 Java 非常相似,但也结合了 Groovy 和 Scala 语法的一些位,比如方法由关键字 'def' 定义,变量由 'var' 或 'val' 定义,否则你可以编写与 Java 相同的代码。您可以选择使用 lambda 方法、扩展方法(如在 C# 中)、多行文本文字和更多好东西。 Xtend 有优秀的 Eclipse 插件,比 Scala 好得多,但不如 vanilla Java 完全好。在调试器中评估变量有一些怪癖。使用 Xtend 插件,您可以实时查看 Xtend 代码转换成哪些纯 Java 代码。没有适用于 Idea 的插件。与 Maven 良好集成。

备选

Xtend 本身基于 Xtext ,一个用于轻松创建新语言的框架。使用它和 Xbase您可以相对轻松地创建一种与 Java 完全相同的新语言,只是运算符“+”会转换为您想要的任何内容。学习曲线要​​陡峭得多,那时您将不得不阅读大部分 Xtext 文档。

关于java - 除了覆盖算术运算符之外,还有其他方法可以在 Java 中实现 "overflow safe"算术运算吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25730554/

相关文章:

java - 使用 CrudRepository.save(Entity) 使用 spring-data-jdbc 插入具有预定义 @ID 字段的实体

c++ - 访问数据成员(本身是对象)的数据成员,就好像它们是类成员一样

c++ - 函数重载和模板

java - 如何模拟正在测试的类的某些对象?

java - 使用 HQL 执行搜索/用户使用哪种连接类型?

java - 任何单例模式早期实例化的问题

c++11 - 从可变参数类模板为每种类型生成一个方法

java - 为什么 Integer.MAX_VALUE + 1 == Integer.MIN_VALUE?

c++ - 无符号算术和整数溢出

c# - 如何在 C# 中检查 Interlocked.Increment 后是否溢出?