sirve salto que para metodo linea imprimir formas ejemplos clase archivos java inline-code

salto - ¿Hay funciones en línea en Java?



metodo para imprimir en java (8)

¿Hay un concepto de funciones en línea en Java, o se reemplazó algo más? Si hay, ¿cómo se usa? Escuché que public métodos public , static y final son las funciones en línea. ¿Podemos crear nuestra propia función en línea?


Bueno, hay métodos que podrían llamarse métodos "en línea" en Java, pero dependiendo de jvm. Después de compilar, si el código máquina del método es inferior a 35 bytes, se transferirá a un método en línea de inmediato, si el código máquina del método es inferior a 325 bytes, podría transferirse a un método en línea, según el jvm.


Ejemplo de vida real:

public class Control { public static final long EXPIRED_ON = 1386082988202l; public static final boolean isExpired() { return (System.currentTimeMillis() > EXPIRED_ON); } }

Luego, en otras clases, puedo salir si el código ha expirado. Si hago referencia a la variable EXPIRED_ON de otra clase, la constante está en línea con el código de bytes, por lo que es muy difícil rastrear todos los lugares en el código que verifica la fecha de caducidad. Sin embargo, si las otras clases invocan el método isExpired (), se llama al método real, lo que significa que un pirata informático podría reemplazar el método isExpired por otro que siempre devuelve falso.

Estoy de acuerdo en que sería muy agradable obligar a un compilador a incorporar el método estático final a todas las clases que lo mencionan. En ese caso, ni siquiera necesita incluir la clase Control, ya que no sería necesaria en el tiempo de ejecución.

De mi investigación, esto no se puede hacer. Quizás algunas herramientas de Obfuscator puedan hacer esto, o bien, podrías modificar tu proceso de compilación para editar las fuentes antes de compilarlas.

En cuanto a probar si el método de la clase de control se coloca en línea con otra clase durante la compilación, intente ejecutar la otra clase sin la clase Control en el classpath.


En Java, las optimizaciones generalmente se realizan a nivel de JVM. En tiempo de ejecución, la JVM realiza algunos análisis "complicados" para determinar qué métodos aplicar en línea. Puede ser agresivo en la creación de líneas, y la JVM de Hotspot en realidad puede alinear métodos no finales.

Los compiladores de Java casi nunca incluyen ninguna llamada a método (la JVM hace todo eso en tiempo de ejecución). Hacen constantes de tiempo de compilación en línea (por ejemplo, valores primitivos estáticos finales). Pero no métodos

Para más recursos:

  1. Artículo: El motor de rendimiento de Java HotSpot: ejemplo de alineación de métodos

  2. Wiki: Inlinear en OpenJDK , no completamente poblado pero contiene enlaces a discusiones útiles.


Java no proporciona una forma de sugerir manualmente que un método debe estar en línea. Como dice @notnoop en los comentarios, la JVM generalmente hace la alineación en el momento de la ejecución.


Java9 tiene un compilador de "anticipación de tiempo" que realiza varias optimizaciones en tiempo de compilación, en lugar de tiempo de ejecución, que se puede ver como en línea.


Lo que dijiste arriba es correcto. A veces los métodos finales se crean como en línea, pero no hay otra manera de crear explícitamente una función en línea en java.


No, no hay una en.wikipedia.org/wiki/Inline_function en en.wikipedia.org/wiki/Inline_function en Java. Sí, puede utilizar un método público estático en cualquier lugar del código cuando se lo coloca en una clase pública. El compilador de Java puede hacer una expansión en línea en un método estático o final, pero eso no está garantizado.

Normalmente, el compilador realiza estas optimizaciones de código en combinación con JVM / JIT / HotSpot para los segmentos de código que se utilizan con mucha frecuencia. También otros conceptos de optimización como la declaración de registro de parámetros no se conocen en Java.

Las optimizaciones no pueden ser forzadas por declaración en java, sino hechas por compilador y JIT. En muchos otros idiomas, estas declaraciones a menudo son solo sugerencias del compilador (puede declarar más parámetros de registro que el procesador, el resto se ignora).

La declaración de los métodos Java estáticos, finales o privados también son sugerencias para el compilador. Deberías usarlo, pero no hay garantías. El rendimiento de Java es dinámico, no estático. La primera llamada a un sistema siempre es lenta debido a la carga de clase. Las siguientes llamadas son más rápidas, pero dependiendo de la memoria y el tiempo de ejecución, las llamadas más comunes se optimizan con el sistema en ejecución, ¡de modo que un servidor puede volverse más rápido durante el tiempo de ejecución!


por lo tanto, parece que no hay, pero puede usar esta solución alternativa usando guava o una implementación de clase de función equivalente, porque esa clase es extremadamente simple, por ejemplo:

assert false : new com.google.common.base.Function<Void,String>(){ @Override public String apply(Void input) { //your complex code go here return "weird message"; }}.apply(null);

sí, esto es código muerto solo para ejemplificar cómo crear un bloque de código complejo (dentro de {}) para hacer algo tan específico que no debería molestarnos en crear ningún método para él, ¡AKA inline!