objeto - tipos primitivos java
Métodos nativos de Java Público vs. privado (2)
Entonces, mi pregunta es: ¿alguna de las alternativas mencionadas tiene algunas ventajas técnicas o de rendimiento o mantenibilidad, que debería alentar el uso de una sola variante?
La ventaja de la conservación es la clave aquí. Como se afirma en los comentarios, el objeto expone su comportamiento. Cómo se implementa no es asunto del usuario. Esto te da más flexibilidad.
Supongamos que en el futuro (ver: mantenibilidad ) encuentra que quiere / necesita ajustar el método de forma que haga algo antes y / o después de la llamada nativa. En el primer enfoque, deberá desaprobar el método y crear uno nuevo. En el segundo segundo enfoque, solo agrega lo que necesites en el método y al usuario no le importa.
En cuanto a rendimiento, en teoría, el primer enfoque es más rápido porque es 1 llamada menos. En la práctica, es completamente insignificante.
Supongamos que tenemos que implementar algún método de Java en el código nativo y exponerlo al usuario. Sabemos que todo el trabajo se realiza por el lado nativo, es decir, la única responsabilidad del código Java es pasar los argumentos proporcionados por el usuario al código nativo y devolver el resultado. De acuerdo con esto, la capa Java puede implementarse de dos maneras:
Al usar métodos nativos que están directamente expuestos al usuario:
public native Object doSmth(Object arg0, Object arg1);
Mediante el uso de envoltura pública delgada alrededor de método nativo privado:
public Object doSmth(Object arg0, Object arg1) { return nativeDoSmth(arg0, arg1); } private native Object nativeDoSmth(Object arg0, Object arg1);
He visto ambos enfoques en proyectos reales e incluso tanto antiguos como últimos en el mismo proyecto.
Entonces, mi pregunta es: ¿alguna de las alternativas mencionadas tiene algunas ventajas técnicas o de rendimiento o mantenibilidad, que debería alentar el uso de una sola variante? ¿O tal vez todo es solo una cuestión de gusto?
Creo que es principalmente una elección de estilo personal. Si considera el siguiente código:
rattias-macbookpro: tst rattias $ diff Test1.cl Test1.class rattias-macbookpro: tst rattias $ vi Test1.java
public class Test1 {
public static void main(String[] args) {
Test2 t = new Test2();
t.m();
}
}
public class Test2 {
public native void m();
}
Compilar esto produce una Test1.class
que es idéntica a la producida cuando Test2
se define de la siguiente manera:
public class Test2 {
public void m() {
}
}
Esto significa que puede cambiar la implementación para que sea nativa, Java pura, una envoltura Java pura a un método privado nativo, en cualquier momento sin afectar a los usuarios. Puede haber una pregunta sobre si una función de API pública completa debe ser nativa, frente a solo una parte del cálculo, pero nuevamente puede cambiarse en cualquier momento.