是否有其他方法来实施“计划”;溢流保险箱“;Java中的算术运算,而不是重写算术运算符?

是否有其他方法来实施“计划”;溢流保险箱“;Java中的算术运算,而不是重写算术运算符?,java,overloading,integer-overflow,integer-arithmetic,Java,Overloading,Integer Overflow,Integer Arithmetic,这是我的问题。自从我学习Java以来,我就知道算术溢出和下溢是存在的,Java编译器不会向你们抱怨的。现在我提出了一个操作类,其中包含“溢出安全”的整数+,-,*方法。因此,如果计算溢出,它将抛出算术异常 public final class Operation{ public static int aDD (int a, int b) { //do something if (overflow) { throw ArithmeticException("Int

这是我的问题。自从我学习Java以来,我就知道算术溢出和下溢是存在的,Java编译器不会向你们抱怨的。现在我提出了一个操作类,其中包含“溢出安全”的整数+,-,*方法。因此,如果计算溢出,它将抛出算术异常

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中的原始算术运算符。这样我就不需要输入
intc=Operation.aDD(a,b)
使用“溢出安全”算术运算。相反,我只需要输入
intc=a+b

然而,有人告诉我,在Java中,用户定义的运算符重写是不可能的。那么,在Java中,是否仍然可以在不重写运算符的情况下实现相同的结果呢。无论如何,这样做是可以接受的,包括混合java和C++代码。(注意我现在的代码是用java编写的。但是我想我可以用转换器把它转换成其他语言。虽然它不能保证是无bug的。)我唯一的目标是允许我的旧程序使用“溢出安全”。无需将所有
a+b
重新因子化为
运算的算术运算。添加(a,b)


非常感谢

正如您已经发现的,java中没有可以使用的运算符重载

从这一点可以看出,改变表达式
inta=b+c的语义是不可能的

既然你已经提到C++代码,那就要看它的结构如何,你可能想从它构建一个本地库(DLL,so),并使用JNI调用C++代码。如果C++代码由许多小函数/类组成,那么本机调用的杂波将超过代码重用的实用性。不用说,对于要部署到的每个platfrom,您都需要一个适当的二进制文件

对于纯java实现,您需要将逻辑重写为执行检查的显式实用程序方法调用,正如您已经了解的那样


核心java库(例如BigInteger、BigDecimal)更进一步,将它们的类型封装到(通常是不可变的)值对象中,这些值对象(仍然)作为标准方法调用进行操作。这使得使用更紧凑/更短,因为编译器将提供更多的类型检查,并且您不需要使用类名
BigDecimal sum=a.add(b)限定方法名。虽然不是很漂亮,但这是一个公认的习惯用法。

正如您已经发现的,java中没有可以使用的运算符重载

从这一点可以看出,改变表达式
inta=b+c的语义是不可能的

既然你已经提到C++代码,那就要看它的结构如何,你可能想从它构建一个本地库(DLL,so),并使用JNI调用C++代码。如果C++代码由许多小函数/类组成,那么本机调用的杂波将超过代码重用的实用性。不用说,对于要部署到的每个platfrom,您都需要一个适当的二进制文件

对于纯java实现,您需要将逻辑重写为执行检查的显式实用程序方法调用,正如您已经了解的那样


核心java库(例如BigInteger、BigDecimal)更进一步,将它们的类型封装到(通常是不可变的)值对象中,这些值对象(仍然)作为标准方法调用进行操作。这使得使用更紧凑/更短,因为编译器将提供更多的类型检查,并且您不需要使用类名
BigDecimal sum=a.add(b)限定方法名。虽然不是很漂亮,但这是一个公认的习惯用法。

另一个选择是混合使用Java和Scala。有了Scala,你可以说什么就做什么(我没有Scala的实际经验,但这应该很容易),另外,将两者混合在一起很简单

例如,见


然后,如果编写重载算术函数库,只需导入Scala包即可从Java调用它们,就像在Java中一样。

另一种选择是混合使用Java和Scala。有了Scala,你可以说什么就做什么(我没有Scala的实际经验,但这应该很容易),另外,将两者混合在一起很简单

例如,见

然后,如果编写重载算术函数库,只需导入Scala包即可从Java调用它们,就像在Java中一样。

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

关于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代码。没有插件的想法。与Maven整合良好

备选方案

Xtend本身就是基于一个易于创建新语言的框架。使用它,您可以相对轻松地创建一种与Java完全相同的新语言,只是运算符“+”将转换为您想要的任何语言。还有更陡峭的学习曲线,您必须阅读大部分Xtext文档<