在Java中对原始类型实现类型安全的最有效方法?

A S*_* Sz 7 java boxing type-safety java-8 type-alias

假设我想确保Java在原始类型上的类型安全。举个例子,让我们想区分a Ratio和an AbsoluteValue,两者都由a表示double

就我所知,Java不支持类型同义词

因此,我很有信心会涉及一些开销。

从我的脑海中,我可以想到定义新的包裹double(很多样板)或子类化Double……或者甚至还有其他选择?

哪种方法给我带来最少的性能开销?

编辑:我仅限于Java 8,所以这是问题的隐式基础;但是,如果在该语言的较新版本中有替代解决方案,我仍然很想听听它们。

Mic*_*ael 2

我能想到的最高效的方法是编写自己的包装类,其中有一些标记注释:

@PrimitiveTypeAlias(double.class)
public class Milliseconds
{
    double value() { ... } 
}
Run Code Online (Sandbox Code Playgroud)

然后在编译时连接到注释处理器,并用原始对应物物理替换包装类(使用 Lombok 之类的东西)。

...但我怀疑你可能是在暗示“最高效且省力”:)

  • @Holger 您链接到的该策略的根本问题是,如果注释存在**,它只会导致编译时失败。没有什么可以强制您添加它们。您需要记住对*每个*方法返回、参数、字段进行注释...如果您在复杂的调用层次结构中错过了其中一个,您的“NavigationMode”将从严格执行的类型返回到普通的旧int。如果你有一个*正确的*类型系统,这种情况就不会发生。您不能像使用注释一样忘记类型,因为类型是必需的,而注释则不需要。 (3认同)
  • 如前所述,这些工具确实已经存在。已经提供的功能(如“@NonNull”)没有什么不同。他们不需要分析堆栈,因为他们只需检查每个分配。当每个分配都正确时,正确性就会传递到整个代码。我已经链接到之前评论中的一个示例,尽管它是针对用作枚举的“int”值定制的。但原理是一样的。 (2认同)