为什么一些Java库方法委托给具有几乎相同签名的本地方法?

在深入了解JRE库的源代码之后,我注意到了一个奇怪的通用代码结构,如下所示:

public int foo(double bar) { return foo0(bar); } private native int foo0(double bar); 

这个代码模式的目的是什么?为什么使用这个代码模式而不是简单地将底层本地方法公开为公共方法?

本地版本只是一个实现细节。

该模式将方法的公共接口与实际实现分开。

我看到至less有5个原因为什么这是有用的:

  • testing目的(你可以模拟java方法调用)
  • 替代实现:特定版本的java库可以在不调用本地实现(在swing代码中通用)的情况下以纯Javaforms实现该方法。
  • 向后兼容性:如果在新版本中,该方法接受一些额外的参数,原始的Java方法签名可以被保留并且本地实现被适配。
  • input/输出validation:大多数情况下,在调用本地版本之前,java代码将对input参数进行一些检查,并在需要时抛出exception。
  • 隔离:直接使用本地代码的方法数量有限,允许在内部代码结构中进行更多的更改。

你可能会发现更多的优势。

 private native int foo(double bar); 

所以,最终这必须调用一个C ++函数来实现它。 特别是,它最终会调用一个名字如下的函数:

 Java_MyClass_foo 

如果有多个本地foo方法具有不同的签名,会发生什么情况? 并发症。 如果你这样做,Java会将types信息添加到它所寻找的方法的名字中。 但是如果你坚持使用非重载的方法,那就简单多了。

 public int foo(double bar) { return foo0(bar); } private native int foo0(double bar); 

foo0已经被赋予了一个唯一的名字,永远不应该有添加另一个foo0的理由。 这使得C ++的实现变得简单,它永远不必处理错位的名字。 即使foo最终会导致重载,它将调用foo1而不是foo0 ,C ++ JNI实现将不必处理超载的额外复杂性。