¿Por qué me encanta Java NOT.

Ok, aquí están algunos de mis pensamientos acerca de Java como un idioma y una plataforma de desarrollo.

TL; DR: cuando todo lo que tienes es un martillo, todo parece un clavo. No trate de empujar java hasta cada tarea. . Aún mejor, no lo utilizan para nada

déjame advertirte: Soy plenamente consciente de que Java fue creado por los consultores de la empresa para permitir bullshit empresa edificio rápidamente y asegurarse de que usted no tiene a hacer esfuerzos para apoyar a su mierda de una vez escrito. Soy plenamente consciente de la importancia del lenguaje Java como tal, sino cualquier reclamo de utilizar Java como lenguaje de propósito general me hacen llorar

El lenguaje y la JVM:.
Ok, en primer lugar , Java idioma es muy aburrido y desagradable para programar pulg Y es una mierda duro como un lenguaje orientado a objetos.

1. Se ha objetivado tanto y no objetivado POD. Es decir, que tiene tanto int e Integer. Y esto conduce a varias consecuencias interesantes. Usted no puede llamar a un método toString () en un entero. como «1.toString ()». O, bueno, aquí hay un ejemplo mejor. Pruébelo usted mismo en java o BeanShell

$ cat Foo.java
clase Foo {

estática Entero a = 9,999;

estática Entero b = 9,999;


estática entero c = 9 ;

Entero estática d = 9;


public static void main (String args []) {

System.out.println (a == b);

System.out.println (c == d);

}

}

$ java Foo

true

¿Le resulta lógico? Bueno, si usted ha estado programando en Java por un tiempo, es posible que se descerebrados suficiente como para pensar que está bien, pero no es así. De hecho, el comportamiento de un sistema complejo debe ser predecible y sin lectura a través de todos los rincones oscuros de documentación. (Para aquellos que aún viven en la felicidad de la ignorancia: el comportamiento observado se debe a JVM mantiene copias en caché de enteros en el rango [-127, 128])

Bueno, usted puede argumentar que se trata de un buena idea en cuanto al rendimiento, pero no lo es. Proper VM y lenguas (CLR / C #, ocaml) han encontrado mejores formas de evitar este problema. Por ejemplo, CLR permite trabajar directamente con la memoria sin tipo crudo y todos los tipos numéricos realmente consumen la cantidad de bits necesarios para mantener la precisión, mientras que todos los métodos de «objeto» se implementan como azúcar sintáctico – es decir, el compilador vudú)

compatible 2. Los tipos genéricos sólo apestan. La razón es que a fin de mantener la compatibilidad con el antiguo mierda, los genéricos se introdujeron como un azúcar sintáctico. Una vez que se compila el código «genérico», escriba la información se borra. Por lo tanto, se pierde la seguridad de tipos cuando se utiliza la reflexión – no se puede determinar el tipo real de una variable de tipo genérico si el tipo de hormigón es una clase que hereda de múltiples interfaces. Por otra parte, el tipo de borrado es la misma razón precisa por qué no se puede crear una matriz de tipos genéricos.

3. El lenguaje no tiene cierres lambda. En realidad, la creación de interfaces de toneladas de una sola función, como Ejecutable es sólo un dolor. Incluso más dolor está declarando una interfaz sólo para pasar un único cierre.

4. No asignación de memoria en pila. Este es un problema para las aplicaciones que utilizan pequeñas cantidades de memoria, ya que toda la memoria, incluso para los locales, tiene que ser asignada montón. Esto plantea varios problemas de rendimiento (por supuesto, acaba de ser colocado en la pila o registros, pero no hay manera explícita al afirmar que).

5. No hay manera correcta de interactuar con código nativo y los datos sin tipo. Por ejemplo, el ya mencionado. Net tiene la interfaz P / Invoke que permite llamar convenientemente en bibliotecas nativas sin modificarlos, sin necesidad de escribir un esbozo C poner en la máquina virtual, sin sobrecarga de maniobra adicional. Y usted incluso tiene la misma flexibilidad al especificar la estructura de diseño que lo haría en C.

[ StructLayout ( LayoutKind explícita , Tamaño = 8 )]
públicos struct Foo
{
[» «style =» tip border: 0px; colores : # 2b91af; font-family: Consolas, Menlo, Mónaco, ‘Lucida Console’, ‘Liberation Mono’, ‘DejaVu Sans Mono’, ‘Bitstream Vera Sans Mono’, ‘Courier New’, espacio sencillo, serif; font-size: 12px; line-height: 15px; margen: 0px; padding: 0px; vertical-align: baseline; «> FieldOffset ( 0 )]
públicos byte A ;
[ FieldOffset ( 1 )]
públicos int B;
[» «style =» tip border: 0px; color: # 2b91af; font-family: Consolas , Menlo, Mónaco, ‘Lucida Console’, ‘Liberation Mono’, ‘DejaVu Sans Mono’, ‘Bitstream Vera Sans Mono’, ‘Courier New’, espacio sencillo, serif; font-size: 12px; line-height: 15px; margen : 0px; padding: 0px; vertical-align: baseline; «> FieldOffset ( 5 )]
públicos corto C ;
[ FieldOffset ( 7 )]
públicos byte D ;
}
[DllImport ( » Foo.dll » , EntryPoint = » TransmitToHell « )]
público estática extern int SendToLimbo ( struct Foo foo);

6. No aritmética de punteros. C # tiene eso. Si bien se puede argumentar que no es seguro, en un idioma de funcionamiento gestionado en un entorno con la memoria virtual, es posible comprobar cruce de fronteras y evitar el desbordamiento de búfer C típico y apilar rompiendo vulnerabilidades sin dejar de ofrecer la flexibilidad.

7. No inferencia de tipos. serio, ¿qué diablos es eso?
CoolFoo coolFoo = new CoolFoo ();
por qué no podía simplemente escribir
dejar coolFoo = new CoolFoo ();
El compilador puede deducir claramente el tipo de variable aquí. Y idiomas adecuados (ML, Haskell) en realidad puede escribir a revisar todo el programa sin especificar explícitamente los tipos en la mayoría de los casos debido al tipo de Hindley-Milner inferencia


8. Mal programada la biblioteca estándar de violar los principios OO. Javatards gusta reivindicar su lengua es completamente orientado a objetos, pero viola el principio varias veces. Los casos más evidentes:

  • interfaces de vacíos (como, Cloneable). Al igual, que no está haciendo nada. Bueno, ellos no deberían haber estado haciendo algo, pero entonces entra en juego la reflexión vudú
  • de datos mutables Unmutable. Todos ustedes saben que el modificador final hace una ubicación de memoria inmutable. Pero no todas las personas saben que el uso de la reflexión que se puede obtener acceso de escritura a la misma. Incluso los flujos estándares (System.out, System.in) pueden ser reasignados utilizando System.setOut, System.setIn llama. ? MAD RU

Los factores antes mencionados hacen que la programación en java un ejercicio de futilidad miserable en lo que se refiere a la integración con código nativo o escribir algoritmos que tienen que triturar grandes conjuntos de números (DSP ). Un ejemplo interesante es la plataforma Android, donde la mayoría del código Java de alto nivel es sólo un conjunto en torno a bibliotecas nativas escritas principalmente en C y DSP extensiones de montaje (neón, SSE, AVX). La falta de implementaciones incorporadas de muchas rutinas DSP (convolución, FFT) y la aplicación con errores de la biblioteca RenderScript hacer la escritura de aplicaciones de procesamiento de vídeo de alto rendimiento en una tarea muy desalentadora.

Arial, Helvetica, sans-serif;»> Empresa crap: