编辑:我重写了这个问题,希望能让它更容易理解。
我不想超载!
如果您有以下代码:
ImmutableObject mutableReference = new ImuttableObject();
mutableReference = mutableReference.doStuff(args);
编译时间或预编译时间过程可以替换定义的文本格式吗?例如:
DEFINE X.=Y AS X = X.Y
可以取代
mutableReference .= doStuff(args)
与mutableReference = mutableReference.doStuff(args);
因此,一些进程知道".=“之前的代码是X,后面是Y。类似于语法糖,编译前或编译期间,只需将X.=Y替换为X= X.Y。
下面的是这个问题的旧版本.
我有以下的“形式”的代码,因为没有一个更好的词。
turnStates = turnStates.add(currentState); // log end of turn state.
//turnStates.=add(currentState);
//turnStates=.add(currentState);
其中turnStates可以是对任何不可变对象的引用。我希望它看起来像代码注释掉或类似。就像有++和+=的整数一样,我想要一种为我的不变值编写自己的方法。
我想我还记得C++中的一些预处理器内容,我认为这些东西可以代替预定义的代码片段文本。我想知道在java中是否有一种方法可以在编译时为工作代码定义一个进程来替换我想要的代码。
我相信你可以让IDE来做这件事,但是你不能和其他没有运行预先配置好的IDE的人共享代码。
编辑:
turnStates是不可变的,在要添加的调用中返回一个不同的对象。这是测试代码,我有我的理由,为什么一个列表,或者现在的行为更像一个堆栈,是不可变的。与问题无关,因为我可以简单地用player = player.doSomething(args)
替换它,其中doSomething(args)
返回一个Player实例。玩家只是模型的一小部分,是不需要花费的不可变的。
我知道在Java中重载和语法是不能改变的。正如我最初试图描绘的那样,如果没有遇到这样的情况,很抱歉:
我希望我没有意识到语法可能与@符号有关,它可以在编译之前取代文本。例如:
DEFINE X.=Y AS X = X.Y
,其中X= turnStates和Y= add()在我的示例中。
但正如我投票时所说的那样。我将查看Scala,因为答案似乎是否定的。
发布于 2017-04-11 17:58:40
与C++不同,overloading.But不支持运算符overloading.But Scala或Groovy。Scala可以集成到Java中,但Java仍然不直接支持操作符重载集成部分,因为您将无法使用操作符本身,而只能使用@eq(.)对于"=“操作符。如果您想了解Scala与java的集成,请查看此链接以获得更多细节。
底线: Java不支持操作符重载
如果您的项目需要大量的向量加法、减法等,即许多自定义操作符,那么一个很好的建议是使用C#作为您选择的语言,这是一种类似Java的语言。
https://stackoverflow.com/questions/43358204
复制相似问题