new icon example borderfactory java

example - my icon java



¿Cuáles son las trampas de un noob de Java? (23)

Algunos errores que he visto a personas que tienen experiencia en programación pero no en Java:

  1. Las clases extienden implícitamente el Object
  2. Las clases importan implícitamente java.lang.*
  3. instanceof no requiere un chequeo no nulo
  4. La conversión ascendente, por ejemplo, ((Object)new Integer(1)).toString() , casi nunca es útil ya que no afecta la selección dinámica de métodos.
  5. Las cuerdas son inmutables. No hay necesidad de copiarlos o clonarlos.
  6. No confíe en el recolector de basura o finalize() para realizar la administración de recursos (en lugar de la memoria). Los recursos, por ejemplo, los archivos, deben cerrarse explícitamente.
  7. Los componentes de Swing, una vez mostrados, solo deben ser accedidos desde el hilo del evento AWT (normalmente utilizando SwingUtilities.invokeLater() ).
  8. En general, tenga mucho cuidado cuando varios subprocesos comparten los mismos objetos mutables / con estado. Copie sus objetos primero o prepárese para usar un montón de bloques synchronized , wait() y notify() .

He pasado por algunas preguntas de Java sobre SO. Y debo decir que el contenido aquí está bastante bien escrito y que los chicos de Java en SO realmente pueden sacar las respuestas.

Pero lo que siempre encontré fueron las respuestas de Java para la gente de Java. Lo cual es genial por sí solo, pero soy un noob de Java. Así que realmente no me importa el funcionamiento de "Unión conjunta en la variación de parámetros de tipo" . Probablemente sea práctico en la línea pero por ahora ... no lo es.

Así que Java para un noob (procedente de PHP y Python) ¿cuáles son los cheatcodes?

Si pudiera vincularse a una respuesta SO (que probablemente esté disponible pero no pude encontrar) o escribir, ¿qué hacen las cosas de Java de manera diferente a otros idiomas? (en un nivel básico)

Algunos podrían llamar a estos Java Gotchas (aunque no pude encontrar el oficial)


Asegúrate de que entiendes la POO en lugar de hacer que todo esté estático. Y averigua sobre el desbordamiento de pila para hacer preguntas :-).


Combinar equals() con autoboxing puede volverse realmente loco:

Integer X = 9000; Integer Z = 9000; short y = 9000; boolean b1 = (X == Z); boolean b2 = (X == y); boolean b3 = (X.equals(Z)); boolean b4 = (X.equals(y)); System.out.println(b1 + " " + b2 + " " + b3 + " " + b4);

salidas:

false true true false


Creo que el mejor "código de trampa" es "No seas inteligente, escribe código tonto".

Los términos están algo cargados, pero básicamente quieres que las cosas sean simples cuando las escribas, porque entonces serán fáciles de leer cuando vuelvas a leerlas más tarde. También en estos días, la JVM es MUCHO más inteligente que usted, y el código no tonto generalmente intenta hacer algo "más eficientemente", lo que puede prohibir que la JVM haga algo aún más inteligente.

Eche un vistazo a http://java.sun.com/developer/technicalArticles/Interviews/devinsight_1/

Tenga en cuenta: está bien escribir código inteligente, solo necesita probar primero que es necesario :)

EDITAR: Algunas cosas más.

  • Escribe mucho código. La práctica hace la perfección: siempre esfuércese por hacer esto de la mejor manera posible. Si regresa a su código más tarde, es posible que haya aprendido una o dos cosas, ya que le permite analizar sus elecciones anteriores, lo que le permite tomar una mejor decisión la próxima vez que tenga que elegir. ¡ESTO INCLUYE DOCUMENTACIÓN ! La documentación es lo que permite a otros usar su código sin entenderlo en detalle.

  • Lee mucho código. Configure su IDE para que le permita ver la mayor cantidad de fuentes posibles para lo que trabaja. Al usar un JDK como JVM en Eclipse, las fuentes se adjuntan automáticamente para que pueda VER la fuente de cualquier cosa que golpee en un punto de interrupción. Cuando incluya un jar de, por ejemplo, Apache en su código, incluya las fuentes para que pueda ver lo que hace. Algún día le ayudará a descubrir por qué sucede una determinada cosa y cómo evitarla.

  • Trabajar con compañeros. Otros programadores en un nivel similar pueden proporcionar información para una situación, tal vez incluso escuchar su explicación aclara las cosas en su mente, y usted también puede ayudarlos. Al trabajar juntos y evaluar juntos, pueden aprovecharse mutuamente.

  • El Tutorial de Java de Sun cubre MUCHAS bibliotecas de Java, y aprender aquellas que cubren la parte esencial del tiempo de ejecución (java.lang, java.io) de memoria y haber leído el resto (solo para saber lo que existe) te hará un Programador más capacitado. ¡Sabrás lo que hay en tu caja de herramientas!

  • Participa en . Escribir buenas respuestas a las preguntas (incluso si han sido respondidas pero mal) le permitirá poner sus experiencias en palabras, lo cual es práctica para escribir documentación :)


Creo que otra trampa común para los principiantes es reinventar la rueda . Es decir, escribir un algoritmo (nivel bajo), estructura de datos o utilidad usted mismo, cuando habría (probablemente mucho mejor) la implementación ya ofrecida por las bibliotecas.

Para una explicación más detallada sobre este punto, lea el Artículo 47 en Java efectiva de Joshua Bloch (2ª ed.): Conozca y use las bibliotecas . (¡Lea el libro completo, ya!) ;-) Citaré algunos de los principales consejos que da:

Al usar una biblioteca estándar, aprovechas a los expertos que la escribieron y la experiencia de aquellos que la usaron antes que tú.

[...] todos los programadores deben estar familiarizados con los contenidos de java.lang , java.util y, en menor medida, java.io

Específicamente el Java Collections Framework , en java.util , será inmensamente útil para cualquier programador de Java, novato o no; definitivamente "reduce el esfuerzo de programación al tiempo que aumenta el rendimiento" como dice el Sr. Bloch.

Junto con las bibliotecas que vienen con la plataforma Java, una familia de bibliotecas de Java que vale la pena mencionar es Apache Commons . Cubre mucho terreno, se usa ampliamente y, a menudo, continúa justo donde las bibliotecas estándar dejan de funcionar. Además, aunque todavía no los he usado, parece que Google ha estado publicando recientemente algunas bibliotecas de Java de alta calidad que complementan la plataforma Java, como Google Collections ( artículo interesante al respecto ). Edición : ahora que me he familiarizado mejor con Google Collections, puedo decir que definitivamente vale la pena estudiar la biblioteca después de aprender el marco de Java Collections; ¡Parece la extensión perfecta! Comience con el artículo de Javalobby al que he vinculado y también vea esta presentación de Kevin Bourrillion, el desarrollador principal: parte 1 y parte 2 .


Desde mi experiencia, las personas nuevas en Java nunca anulan los métodos equals , hashCode y toString , sin hashCode cuál sea el propósito de los objetos. Además, nadie se molesta en configurar un sencillo sistema de registro . Cuando veo System.out.println siento que estoy listo para romper los dedos! Pero muchos de los programadores experimentados están poniendo pin en miles de tareas también.

En una nota más avanzada, acostúmbrese a codificar donde las Specs vienen primero seguidas de cerca por las unit testing , pero esto es más genérico no solo para Java. Pero otra vez mucha gente pone pin en esto.



Este puede ser un consejo demasiado básico, así que perdóneme si lo ofendo por mencionarlo, pero he visto demasiado el principio del código Java que lanza la palabra clave static libremente, aparentemente sin tener en cuenta para qué sirve. . Entonces, si ve una advertencia que se queja sobre la "referencia estática a un valor no estático" o algo así, no intente resolverlo colocando aleatoriamente la static en una cosa que no sea estática, a menos que tenga sentido hacerlo.

Aquí hay un pequeño consejo que podría tener problemas para buscar hasta que sepa el término: "paquete-privado". En Java, existen los mismos ámbitos públicos, protegidos y privados que existen en otros lugares como C ++. Puedes leer para qué sirven, si aún no lo sabes. Sin embargo, tenga en cuenta que si no especifica si algo es público, protegido o privado, no es nada de eso. Es un paquete privado, y no hay ninguna palabra clave que lo especifique, excepto la falta de una palabra clave. Las cosas privadas del paquete actúan como valores privados para cualquier cosa en otro paquete y públicas para las cosas que están en el mismo paquete.

Un consejo más al azar: usar paquetes. Es posible no comenzar sus archivos .java con un package com.whatever.foo; y si usa javac en la línea de comandos, verá que es bueno que los archivos que carecen de esa línea aparezcan en su directorio de trabajo, pero casi siempre terminará siendo un problema más tarde. Y deja de usar javac de línea de comandos de todos modos. Utilice Eclipse.


Evite ser más específico de lo que necesita. Podría sentirse tentado a pensar que su objeto de almacenamiento es un HashMap:

HashMap myStore = new HashMap();

Pero recomendaría pensarlo solo como un mapa (interfaz):

Map myStore = new Hashtable();

El resto de su código no necesita saber cómo implementamos myStore, solo necesita saber que myStore es algún tipo de mapa. De esta manera podemos cambiar el tipo de implementación más adelante (HashMap, Hashtable, ...), y solo una línea de código se verá afectada.

Y elegí Hashtable como ejemplo, sobre HashMap, porque Hashtable es seguro para subprocesos. En una aplicación de subprocesos múltiples, esto evita el problema de que dos subprocesos que leen y cambien el mismo HashMap al mismo tiempo pueden comenzar a lanzar Excepciones.


Hay una colección de "errores" semi-oficiales, conocidos como los Puzzlers de Java, y documentados en un libro del mismo nombre ; También puede encontrar algunos screencasts en la web. Periódicamente, a Joshua Bloch y Neal Gafter les gusta presentar un montón de desafíos de apariencia inocua y proceder a eliminar sistemáticamente cualquier idea que tengas de que comprendías incluso los conceptos más vagos del lenguaje Java.

En una nota un poco menos cínica, si está buscando evitar muchos de los problemas comunes de diseño e implementación, puede echar un vistazo a Effective Java , del citado Joshua Bloch, que tiene una gran cantidad de consejos decentes sobre cómo vaya diseñando varios de los aspectos importantes, pero con frecuencia mal escritos, de la escritura de componentes en Java, incluida una explicación completa de cómo implementar correctamente el contrato de equals() y hashCode() , y por qué debería evitar la clone() como la Plaga.

Ah, y no compares cadenas con el operador == .


Java es un lenguaje muy sencillo para empezar, si ya está familiarizado con un lenguaje imperativo de C sytle. Los problemas profundos no están específicamente relacionados con el lenguaje, sino que se relacionan más ampliamente con la herencia única, estática, tipificada de forma estática (o fuertemente).

También estoy en desacuerdo humildemente con mis hermanos de Java y te recomiendo que aprendas lo básico usando un editor de texto y la línea de comandos. Es decir, donde las consecuencias específicas de la JVM son las más destacadas.

Recuerde la distinción más importante entre Java y otros lenguajes: Java es tanto un lenguaje como una plataforma.

Tendrás que entender la noción de classpath; la relación entre la estructura del paquete lógico y su realización (análoga) en el sistema de archivos.

¿Qué hará al escribir ''java'', ''javac'', etc. cuando se escribe en la línea de comandos? Aprender los fundamentos.

Los IDE eliminarán completamente estos problemas fundamentales de la plataforma Java.

También recomiendo, si lo desea, leer la especificación del lenguaje Java y (sí) la especificación JVM. Asegúrese de asimilar los cargadores de clases y los problemas relacionados cuando comience su viaje en Java si Mastery es lo que está buscando.


La diferencia entre el tipo escalar int y el tipo de caja Integer es sorprendente para alguien nuevo en Java.

Java siempre ha hecho una distinción entre los tipos "escalares", que no son clases: boolean (verdadero / falso), char (sin signo de 16 bits), short (con signo de 16 bits), int (con signo de 32 bits) y long (con signo de 64 bits); y todo lo demás que es una clase y, en última instancia, se deriva de la clase Object .

El problema surge cuando se quiere usar algo como una colección genérica como una List . Una List puede contener cualquier cosa que se derive de Object , pero no valores escalares. Por lo tanto, para almacenar los valores de int en una List , debe envolverlos en una instancia de una clase llamada Integer que se deriva de Object .

En versiones anteriores de Java, también necesitaba obtener explícitamente el valor de la clase Integer utilizando una llamada al método .intValue() . En las versiones más nuevas de Java, esta conversión se llama "unboxing" y es automática en algunas situaciones.

Sun tiene una página corta sobre autoboxing que está dirigida a un programador más experimentado, pero puede ser informativa.


Las finales estáticas pueden ser horneadas en la clase.

es decir

public class Foo { public static final String A_STRING="A_STRING"; } public class Bar { public void printString() { System.out.println(Foo.A_STRING);} }

Ahora compile ambos, luego cambia "Foo" y recompila Foo pero no Bar. La barra todavía imprimirá el valor antiguo de A_STRING. Para experimentar esto por ti mismo, ejecútalo localmente en eclipse, que recompila silenciosamente todas tus clases y luego realiza una actualización incremental en un servidor. Oye, ¿a dónde fueron mis cambios?



Otro escollo: descubrir que un depurador es un depurador y usar el depurador Eclipse sin perder tiempo aprendiendo todo sobre él.

Como dijo que está utilizando Eclipse, aquí hay una serie de 7 excelentes tutoriales en video sobre el depurador. Recomiendo pasar el tiempo (7 * 15 minutos) observándolos.


Piense en ejecutar FindBugs en su código ( disponible como un complemento de Eclipse ). Puede marcar muchos errores comunes. Como herramientas de inspección, creo que es una buena opción para principiantes, ya que no se trata de detalles intrascendentes.


Regístrese en JavaBlackBelt y comience a hacer pruebas allí. Como puede ver rápidamente con solo navegar por la página principal, cubren casi cualquier cosa, desde las cosas más simples hasta los temas increíblemente avanzados.

Y no se avergüence de fallar en ninguna de las pruebas, el hecho de fallar simplemente le informa sobre lo que debe aprender más antes de continuar :)


Siempre hay:

String a = "wow, not the same"; String b = "wow, not the same"; String c = new String("wow, not the same"); if (a == b) { //happens to evaluate to true, but you shouldn''t do this ... } if (a == c) { //evaluates to false, which is why you shouldn''t do it ... } //This is how you *should* do this if (a.equals(b)) { //evaluates to true ... } if (a.equals(c)) { //evaluates to true ... }


Una pequeña: busca una clase de Java en Google y espera encontrar información actualizada. Consejo: siempre incluya el número de versión, es decir, busque "inputstream 6" no "inputstream". Del mismo modo, tenga cuidado con los tutoriales en la red, muchos de ellos están desactualizados.


Utilice Eclipse para la edición / desarrollo / depuración de Java. O quizás algún otro IDE, pero por el amor de Dios, no use el Bloc de notas y la línea de comandos.


Yo debería decir.

Una de las frases de errores noob más comunes como "los parámetros en los métodos siempre se pasan como referencia, porque las variables de objetos son referencias, ¿no?"

así que cuando veas algo como:

public void foo(String str){ str="yeah, this should work!"; } String str = ""; foo (str); System.out.println(str);

Puedes escuchar un "¡Espera, WTF!" viniendo de un noob.

En mi experiencia, java noobs no sabe acerca de StringBuffer / StringBuilder. Ni en objetos inmutables.


¿Cuáles son las cosas que hace Java de manera diferente a otros lenguajes? (en un nivel básico)

En un nivel básico no es diferente a otro lenguaje OOP. Sin embargo, en comparación con la programación procesal simple, es un mundo completamente nuevo ... o uno evolucionado.


¡Obsesionando los patrones de diseño! No me preocuparía demasiado por los patrones de diseño para empezar. Es bueno que esté al tanto de su existencia para que sepa de qué hablan otros miembros de su equipo, pero lo importante ahora es explorar las API Core Java. Cuando te sientes cómodo con ellos, realmente me esfuerzo por aprender a escribir código limpio y auto-documentado. Esto le ahorrará mucho tiempo y esfuerzo en el futuro cuando regrese y necesite recordar lo que estaba haciendo.