Thursday, December 06, 2007

SCJP

Sun Certified Programmer for the Java Platform, Standard Edition 6 (CX-310-065)

[6 = Mustang]

¿Qué Estudiar? y ¿Como estudiarlo?

Muy sencillo, miramos los objetivos del examen que estan originalmente en la pagina de Sun.
(podemos verlos haciendo clic aqui)

Que dicen lo siguiente:

Objetivos del Examen

Sección 1: Declaración, Inicialización y Alcance.

  • Desarrollar codigo que declare clases (incluyendo clases abstractas y todas las formas de clases anidadas), interfaces, y enumeraciones, e incluir el uso apropiado de sentencias de paquetes e importaciones (incluyendo importaciones estaticas)
  • Desarrollar codigo que declare una interface. Desarrollar codigo que implemente o extienda una o mas interfaces. Desarrollar codigo que declare una clase abstracta. Desarrollar codigo que extienda una clase abstracta.
  • Desarrollar codigo que declare, inicialice y use datos primitivos, arreglos, enumeraciones y objetos, de las formas estaticas, de instancia y variables locales. Ademas, usar identificadores legales para el nombre de variables.
  • Desarrollar codigo que declare metodos estaticos y no estaticos, y si es apropiado, usar nombres para metodos que usen el standar para el nombrado de los JavaBeans. Ademas desarrollar codigo que declare y use una lista de argumentos variables.
  • Dado un codigo de ejemplo, determinar si un metodo esta correctamente sobre-escrito o sobre-cargando a otro metodo, e identificar valores de retorno legales (incluyendo covariantes de retorno), para un metodo.
  • Dado un conjunto de clases y superclases, desarrollar constructores para uno o mas de esas clases. Dado una declaracion de clase, determinar si un constructor por defecto sera creado, y si es asi, determinar el comportamiento de ese constructor. Dado un listado de clases anidadas y no anidadas, escribir codigo que inicialice esas clases.

Sección 2: Control de Flujo

  • Desarrollar codigo que implemente una sentencia if o switch, e identificar los tipos de argumentos legales para estas sentencias.
  • Desarrollar codigo que implemente todas las formas de ciclos e itereaciones, incluyendo el uso del for, el enhaced for (for-each), do, while, labels, break y continue; y explicar el valor tomado por el las variables contadoras durante y despues de la ejecucion del ciclo.
  • Desarrollar codigo que haga uso de asserciones, y distinguir el uso apropiado de las asserciones.
  • Desarrollar codigo que haga uso de excepciones y clausulas de maneno de excepciones (try, catch, finally). y declarar metodos y sobre-escribir metodos que lancen excepciones.
  • Reconocer el efecto de una expcetion arising en un punto especifico de un fragmento de codigo. Note que las excepciones pueden ser del tipo runtime exception, checked exception o un error.
  • Reconocer situaciones que resultara alguna de las siguientes lanzamientos: ArrayIndexOutOfBoundsException, ClassCastException, IllegalArgumentException, IllegalStateException, NullPointerException, NumberFormatException, AssertionError, ExceptionInInitializerError,StackOverflorError o NoClassDefFoundError. Entender cual de estas son lanzadas por la maquina virtual y reconocer situaciones en cual otras deberian ser lanzadas programaticamente.

Sección 3: Contenido de API

  • Desarrollar codigo que use clases envolvente de primitivos (como Boolean, Character, Double, Integer, etc.) y/o autoboxing & unboxing. Discutir las diferencias entre las clases String, StringBuilder y StringBuffer.
  • Dado un escenario donde se involucra navegacion por el sistema de archivos, leectura de archivos, escritura de archivos, o interaccion con el usuario, desarrollar la correcta solucion para el uso de las siguientes clases (algunas veces en combinacion), del paquete java.io: BufferedReader, BufferedWriter, File, FileReader, FileWriter, PrintWriter y Console.
  • Desarrollar codigo que serialize y/o des-serealize objetos usando las siguientes APIs del paquete java.io: DataInputStream, DataOutputStream, FileInputStream y Serializable.
  • Usar la API estandar de J2SE en el paquete java.text para formatear correctamente o parsear fechas, numeros y valores de moneda para localidades especificas; y, dado un escenario, determinar los metodos apropiados para usar si se desea usar una localidad por defecto o un localidad especifica. Describir el proposito y uso de la clase java.util.Locale.
  • Escribir codigo que use la API estandar de J2SE de los paquetes java.util y java.util.regex, para formatear o parsear cadenas o flujos. Para cadenas, escribir codigo que use las clases Pattern y Matcher y el metodo String.split. Reconocer y usar patrones de expresiones regulares para el matching (limitado a: . (punto), * (estrella), + (más), ?, \d, \s,\w, [], () ). El uso de *, +, y ? sera limitado a cualificadores greedy, y el operador de parentecis sera solo usado como meganismo de agrupacion y no para capturar contenido durante el matching. Para flujos, escribir codigo usando las clases Formatter y Scanner, y los metodos PrintWritter.format/printf. Reconocer y usar parametros de formateo (limitado a: %b, %c, %d, %f, %s) en formato de cadenas.

Sección 4: Concurrencia

  • Escribir codigo que defina, instancie, e inicie nuevos hilos usando java.lang.Thread y java.lang.Runnable.
  • Reconocer el estado en el cual un hilo puede existir, e identificar las maneras en la cual un hilo puede pasar de un estado a otro.
  • Dado un escenario, escribir codigo que haga el uso apropiado del bloqueo de objetos para protejer variables estaticas o de instancia de los problemas de acceso concurrente.
  • Dado un escenario, escribir codigo que haga el uso apropiado de wait. notify, o notifyAll.

Sección 5: Conceptos OO

  • Desarrollar codigo que implemente tight encapsulation, loose coupling, y high cohesion en clases, y describir sus beneficios.
  • Dado un escenario, desarrollar codigo que demuestre el uso del polimorfismo. Ademas, determinar cuando el casteo sera necesario y reconocer errores de compilacion vs runtime realacionados al casteo de referencia de objetos.
  • Explicar el efecto de modificadores sobre la herencia con respecto a constructores, variables de instancia o estaticas, y metodos de instancia o estaticos.
  • Dado un escenario, desarrollar codigo que declare y/o invoque metodos sobre-cargados y codigo que declare y/o invoque la superclase, o constructores sobre-cargagos.
  • Desarrollar codigo que implemente relaciones "is-a" y/o "has-a".

Sección 6: Colecciones / Genericos

  • Dado un escenario, determinar cuales clases de colecciones y/o interfaces deberian ser usadas para implementar apropiadamente ese diseño, incluyendo el uso de la interface Comparable.
  • Discutir entre el correcto e incorrecto sobre-cargado de los correspondientes metodos hashCode y equals, y explicar la diferencia entre == y el metodo equals.
  • Escribir codigo que use versiones genericas de la API Collections, en particular las interfaces Set, List, y Map, y su implementaicon de clases. Reconocer la limitacion de las API no genericas Collection y como refactorear codigo para usar versoines genericas. Escribir codigo que use las interfaces NavigableSet y NavigableMap.
  • Desarrollar codigo que haga el uso apropiado del tipo de parametros en la declaracion de classes/interfaces, variables de instancia, argumentos de metodos, y tipos de retorno; y escribir metodos genericos o metodos que usen tipos wildcards y entender la similitudes y diferencias entre estas dos aproximaciones.
  • Usar capacidades del paquete java.util para escribir codigo que manipule una lista: ordenandola, realizar una busqueda binaria, o convertir la lista a un arreglo Usar capacidades del paquete java.util para escribir codigo que manipule un arreglo: ordenandolo realizar una busqueda binaria, o convertir un arreglo a una lista. Usar las interfaces java.util.Comparator y java.lang.Comparable para afectar el ordenamiento de listas y arreglos. Ademas, reconocer el efecto de "la organizacion natural" de clases envolvente de primitivos y java.lang.String sobre un ordenamiento.

Sección 7: Fundamentos

  • Dado un codigo de ejemplo y un escenario, escribir codigo que use el apropiado uso de los modificadores de acceso, declaracion de paquetes, y sentencias de importanciones para interactuar con (a traves del acceso o herencia) el codigo de ejemplo.
  • Dado un ejemplo de una clase y una linea de comando, determinar el comportamiento esperado at runtime.
  • Determinar el efecto sobre referencias de objetos y valores primitivos cuando ellos son pasados a los metodos que realizan asignaciones o otros operadores de modificacion sobre los paremetros.
  • Dado un codigo de ejemplo, reconocer el punto en el cual un objeto se vuelve eligible para el recolector de basura, determinar que esta y no esta garantizado por el sistema de recoleccion de basura, y reconocer el comportamiento del metodo Object.finalize().
  • Dado el nombre fully-qualified de una clase que esta desplegada dentro y/o fuera de un archivo JAR, construir la apropiada estructra de directorio para esa clase. Dado un codigo de ejemplo y un classpath, determinar si el classpath permitira que el codigo compile exitosamente.
  • Escribir codigo que correctamente aplique el usoapropiado de operadores incluyendo operadores de asignacion (limitado a: =, +=, -=), operadores aritmeticos (limitados a: +, -, *, /, %, ++, --), operadores de relacion (limitados a: <, <=, >, >=, ==, !=), el operador instaceof, operadores logicos(limitados a: &, |, ^,!, &&, ||), y el operador condicional ( ? : ), para producir el resultaod deseado. Escribir codigo que determine la igualdad de dos objetos o dos primitivos.

Sabiendo esto, ya estaremos mentalizados que puede salir en ese examen. (bastante, pero sabemos que nada fuera de este limite nos podran preguntar.)

Ahora nos queda, ¿que estudiar? Pues, recomendaria lo que muchas personas recomiendan, leer muchos libros de certificación (en especial el de Kathy Sierra) y realizar la cantidad de mock Exams posibles. Lastimosamente, todo el material que he visto esta todo en ingles, y muchas personas me han comentado que realize algo asi como una version en español. Pues es eso exactamente la idea que intento hacer aqui.

No comments: