<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mundo Geek &#187; Java</title>
	<atom:link href="http://mundogeek.net/etiqueta/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://mundogeek.net</link>
	<description>Mundo geek, bitácora sobre todo lo geek: software, gadgets, tecnología, internet, ...</description>
	<lastBuildDate>Wed, 08 Feb 2012 16:09:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Java 7</title>
		<link>http://mundogeek.net/archivos/2011/07/28/java-7/</link>
		<comments>http://mundogeek.net/archivos/2011/07/28/java-7/#comments</comments>
		<pubDate>Thu, 28 Jul 2011 17:39:27 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[Linklog]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[lenguajes]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=7134</guid>
		<description><![CDATA[Publicado Java 7, la primera gran versión del lenguaje de la mano de Oracle]]></description>
			<content:encoded><![CDATA[<p>Publicado <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" title="Java 7">Java 7</a>, la primera gran versión del lenguaje de la mano de Oracle</p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2011/07/28/java-7/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>El lenguaje de los grandes programadores</title>
		<link>http://mundogeek.net/archivos/2011/05/08/el-lenguaje-de-los-grandes-programadores/</link>
		<comments>http://mundogeek.net/archivos/2011/05/08/el-lenguaje-de-los-grandes-programadores/#comments</comments>
		<pubDate>Sun, 08 May 2011 12:42:22 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[lenguajes]]></category>
		<category><![CDATA[lenguajes de programacion]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=6738</guid>
		<description><![CDATA[Hace un par de días comenzaba una nueva edición del Code Jam de Google, la famosa competición de programación que la empresa viene organizando desde hace ya 8 años. A parte de proporcionar una gran selección de problemas con los que practicar nuestras habilidades, sus estadísticas también pueden servirnos para comprobar cuáles son los lenguajes [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un par de días comenzaba una nueva edición del <a href="http://code.google.com/codejam/" title="Google Code Jam">Code Jam</a> de Google, la famosa competición de programación que la empresa viene organizando desde hace ya 8 años. A parte de proporcionar una gran selección de problemas con los que <a href="http://mundogeek.net/archivos/2011/03/02/katas-de-codigo/" title="Katas de código">practicar nuestras habilidades</a>, sus <a href="http://www.go-hero.net/jam/11/languages" title="Estadísticas Google Code Jam">estadísticas</a> también pueden servirnos para comprobar cuáles son los lenguajes de programación preferidos por los desarrolladores, y qué lenguajes utilizan los mejores programadores (sobre una muestra de 12.200 participantes).<span id="more-6738"></span></p>
<p>Empecemos con los lenguajes más utilizados. Estos podrían ser los lenguajes cuyas sintaxis y características gustan más, o, simplemente, aquellos con los que están más familiarizados los participantes. Como vemos, C++ es, con mucha diferencia, el lenguaje más popular, seguido a larga distancia de Java y <a href="http://mundogeek.net/tutorial-python/" title="Python para todos, mi libro sobre programación en Python">Python</a>.</p>
<div style="text-align:center"><img src="http://mundogeek.net/wp-content/lenguajes-programacion-mas-utilizados.png" alt="Lenguajes de programación más utilizados"/></div>
<p>Pasamos a continuación a los lenguajes con mayor porcentaje de programadores capaces. Vemos que el porcentaje de programadores que consiguieron la puntuación suficiente para pasar de fase es altísimo en el caso de C++ y Haskell (90,8% y 90,68%), mientras que el porcentaje de programadores aprobados en el caso de <a href="http://mundogeek.net/archivos/2009/11/26/tutorial-rapido-de-php/" title="Tutorial rápido de PHP">PHP</a> (lenguaje con el que yo me gano las lentejas actualmente) es alarmantemente bajo en comparación (76,5%).</p>
<div style="text-align:center"><img src="http://mundogeek.net/wp-content/mejores-lenguajes-programacion.png" alt="Mejores lenguajes de programación"/></div>
<p>Por último, veamos el porcentaje de programadores que consiguieron la puntuación perfecta, agrupados por lenguaje de programación. Aquí Haskell se distancia bastante de C++, y mucho más del resto de lenguajes, quizás por la llamada <a href="http://mundogeek.net/archivos/2007/10/23/la-paradoja-python/">paradoja Python</a>. PHP, por su parte, se mantiene con el dudoso honor de ser el lenguaje con peor porcentaje de programadores con puntuaciones perfectas.</p>
<div style="text-align:center"><img src="http://mundogeek.net/wp-content/mejores-lenguajes.png" alt="Lenguajes de programación con los mejores programadores"/></div>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2011/05/08/el-lenguaje-de-los-grandes-programadores/feed/</wfw:commentRss>
		<slash:comments>43</slash:comments>
		</item>
		<item>
		<title>Un programa escrito en Haskell, que imprime un programa en Perl, que imprime&#8230;</title>
		<link>http://mundogeek.net/archivos/2011/03/15/un-programa-escrito-en-haskell-que-imprime-un-programa-en-perl-que-imprime/</link>
		<comments>http://mundogeek.net/archivos/2011/03/15/un-programa-escrito-en-haskell-que-imprime-un-programa-en-perl-que-imprime/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 16:37:51 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[curiosidades]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[quine]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=6522</guid>
		<description><![CDATA[¿Un programa escrito en Haskell, que al ejecutarse imprime un programa en Perl, que al ejecutarse imprime un programa en Python, que al ejecutarse imprime un programa en Ruby, que al ejecutarse imprime un programa en C, que al ejecutarse imprime un programa en Java, que al ejecutarse imprime el programa original? Sí, es como [...]]]></description>
			<content:encoded><![CDATA[<p>¿Un <a href="http://blog.sigfpe.com/2011/01/quine-central.html" title="Quine central">programa</a> escrito en Haskell, que al ejecutarse imprime un programa en Perl, que al ejecutarse imprime un programa en Python, que al ejecutarse imprime un programa en Ruby, que al ejecutarse imprime un programa en C, que al ejecutarse imprime un programa en Java, que al ejecutarse imprime el programa original? Sí, es como para que te duela la cabeza, aunque el código, que podéis ver después del salto, es de lo más sencillo.</p>
<p>Este tipo de programas que se imprimen a sí mismos como salida (aunque en este caso, con una peculiaridad extra) se conocen con el nombre de <em>quines</em>, en honor al filósofo estadounidense Willard Van Orman Quine.<span id="more-6522"></span></p>
<pre name="code" class="haskell">import Data.List

langs = [Haskell, Perl, Python, Ruby, C, Java]

data Languages = Haskell | Ruby | Perl | C | Python | Java

sequenceFromString Haskell s = "map toEnum[" ++ (intercalate "," $
    map (\c -> show (fromEnum c)) s) ++ "]"
sequenceFromString Perl s    = (intercalate "," $
    map (\c -> "chr(" ++ show (fromEnum c) ++ ")") s)
sequenceFromString Python s  = (intercalate "+" $
    map (\c -> "chr(" ++ show (fromEnum c) ++ ")") s)
sequenceFromString Ruby s    = (intercalate "+" $
    map (\c -> show (fromEnum c) ++ ".chr") s)
sequenceFromString C s       = concatMap
    (\c -> "putchar(" ++ show (fromEnum c) ++ ");") s
sequenceFromString Java s    = concatMap
    (\c -> "o.write(" ++ show (fromEnum c) ++ ");") s

paramList' Haskell = intercalate " " . map (\n -> "a" ++ show n)
paramList' C       = intercalate "," . map (\n -> "char *a" ++ show n)
paramList' Python  = intercalate "," . map (\n -> "a" ++ show n)
paramList' Ruby    = intercalate "," . map (\n -> "a" ++ show n)
paramList' Java    = intercalate "," . map (\n -> "String a" ++ show n)

paramList Perl    _ = ""
paramList lang n = paramList' lang [0..n-1]

driver l args = defn l ++ intercalate (divider l) args ++ endDefn l

divider C       = "\",\""
divider Perl    = "','"
divider Ruby    = "\",\""
divider Python  = "\",\""
divider Haskell = "\" \""
divider Java    = "\",\""

defn C       = "main(){q(\""
defn Perl    = "&#038;q('"
defn Python  = "q(\""
defn Ruby    = "q(\""
defn Haskell = "main=q \""
defn Java    = "public static void main(String[]args){q(\""

endDefn C       = "\");}"
endDefn Perl    = "')"
endDefn Python  = "\")"
endDefn Ruby    = "\")"
endDefn Haskell = "\""
endDefn Java    = "\");}}"

arg Haskell n = "a" ++ show n
arg Perl n    = "$_[" ++ show n ++ "]"
arg C n       = "printf(a" ++ show n ++ ");"
arg Python n  = "a" ++ show n
arg Ruby n    = "a" ++ show n
arg Java n    = "o.print(a" ++ show n ++ ");"

argDivide Haskell l = "++" ++ sequenceFromString Haskell (divider l) ++ "++"
argDivide Perl l    = ","    ++ sequenceFromString Perl (divider l) ++ ","
argDivide C l       = sequenceFromString C (divider l)
argDivide Python l  = "+" ++ sequenceFromString Python (divider l) ++ "+"
argDivide Ruby l    = "+" ++ sequenceFromString Ruby (divider l) ++ "+"
argDivide Java l    = sequenceFromString Java (divider l)

argList lang1 lang2 n = intercalate (argDivide lang1 lang2) $
    map (arg lang1) ([1..n-1] ++ [0])

fromTo Haskell l n = "q " ++ paramList Haskell n ++ "=putStrLn$a0++" ++
    sequenceFromString Haskell ("\n" ++ defn l) ++ "++" ++
    argList Haskell l n ++ "++" ++ sequenceFromString Haskell (endDefn l)
fromTo Perl    l n = "sub q {" ++ "print $_[0]," ++
    sequenceFromString Perl ("\n" ++ defn l) ++ "," ++ argList Perl l n ++ "," ++
    sequenceFromString Perl (endDefn l ++ "\n") ++ "}"
fromTo Python  l n = "def q(" ++ paramList Python n ++
    "): print a0+" ++ sequenceFromString Python ("\n" ++ defn l) ++
    "+" ++ argList Python l n ++ "+" ++ sequenceFromString Python (endDefn l)
fromTo Ruby    l n = "def q(" ++ paramList Ruby n ++
    ") print a0+" ++ sequenceFromString Ruby ("\n" ++ defn l) ++
    "+" ++ argList Ruby l n ++ "+" ++ sequenceFromString Ruby (endDefn l ++ "\n") ++ " end"
fromTo C       l n = "q(" ++ paramList C n ++ "){" ++ "printf(a0);" ++
    sequenceFromString C ("\n" ++ defn l) ++ argList C l n ++
    sequenceFromString C (endDefn l ++ "\n") ++ "}"
fromTo Java    l n = "public class quine{public static void q(" ++
    paramList Java n ++ "){java.io.PrintStream o=System.out;o.print(a0);" ++
    sequenceFromString Java ("\n" ++ defn l) ++ argList Java l n ++
    sequenceFromString Java (endDefn l ++ "\n") ++ "}"

main = do
    let n = length langs
    let langs' = cycle langs
    putStrLn $ fromTo (head langs') (head (tail langs')) n
    putStrLn $ driver (head langs') $ zipWith (\lang1 lang2 -> fromTo lang1 lang2 n)
        (take n (tail langs')) (tail (tail langs'))</pre>
<p><small><a href="http://news.ycombinator.com/item?id=2322145">Vía Hacker News</a></small></p>
<link type="text/css" rel="stylesheet" href="http://mundogeek.net/sh/css/SyntaxHighlighter.css"></link>
<script language="javascript" src="http://mundogeek.net/sh/js/shCore.js"></script><br />
<script language="javascript" src="http://mundogeek.net/sh/js/shBrushHaskell.js"></script><br />
<script language="javascript">dp.SyntaxHighlighter.ClipboardSwf = 'http://mundogeek.net/sh//flash/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');</script></p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2011/03/15/un-programa-escrito-en-haskell-que-imprime-un-programa-en-perl-que-imprime/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>James Gosling, el padre de Java, abandona Oracle</title>
		<link>http://mundogeek.net/archivos/2010/04/11/james-gosling-el-padre-de-java-abandona-oracle/</link>
		<comments>http://mundogeek.net/archivos/2010/04/11/james-gosling-el-padre-de-java-abandona-oracle/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 09:18:14 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[Linklog]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=5340</guid>
		<description><![CDATA[James Gosling abandona Oracle. ¿No te suena su nombre? Echa un vistazo a nuestra no tan breve historia de Java]]></description>
			<content:encoded><![CDATA[<p><a href="http://nighthacks.com/roller/jag/entry/time_to_move_on" title="Es hora de seguir adelante">James Gosling abandona Oracle</a>. ¿No te suena su nombre? Echa un vistazo a nuestra <a href="http://mundogeek.net/archivos/2004/10/04/una-no-tan-breve-historia-de-java/" title="Historia de Java">no tan breve historia de Java</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2010/04/11/james-gosling-el-padre-de-java-abandona-oracle/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Eclipse 3.5: Si Galileo programara en Java&#8230;</title>
		<link>http://mundogeek.net/archivos/2009/06/25/eclipse-3-5-si-galileo-programara-en-java/</link>
		<comments>http://mundogeek.net/archivos/2009/06/25/eclipse-3-5-si-galileo-programara-en-java/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 16:07:54 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=3479</guid>
		<description><![CDATA[Día grande para la comunidad Eclipse con el lanzamiento del nuevo Eclipse 3.5 (Eclipse Galileo) y 32 proyectos más relacionados. Las novedades, que son muchas, en Eclipse 3.5 &#8211; New and Noteworthy.]]></description>
			<content:encoded><![CDATA[<p>Día grande para la comunidad <a href="http://mundogeek.net/archivos/2009/05/07/configurando-eclipse/" title="Configurando Eclipse">Eclipse</a> con el lanzamiento del nuevo <a href="http://www.eclipse.org/downloads/" title="Eclipse 3.5, Galileo">Eclipse 3.5</a> (Eclipse Galileo) y <a href="http://www.eclipse.org/galileo/projects.php">32 proyectos más relacionados</a>. Las novedades, que son muchas, en <a href="http://download.eclipse.org/eclipse/downloads/drops/R-3.5-200906111540/eclipse-news-all.html" title="Novedades en Eclipse 3.5">Eclipse 3.5 &#8211; New and Noteworthy</a>.</p>
<p><img src="http://mundogeek.net/wp-content/eclipse-galileo.png" alt="Eclipse 3.5, Galileo"/></p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2009/06/25/eclipse-3-5-si-galileo-programara-en-java/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Java vs. Python</title>
		<link>http://mundogeek.net/archivos/2009/06/08/java-vs-python/</link>
		<comments>http://mundogeek.net/archivos/2009/06/08/java-vs-python/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 15:49:09 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[citas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=3394</guid>
		<description><![CDATA[Tengo la impresión de que Java fue diseñado para hacer que fuera difícil escribir mal código, mientras que Python está diseñado para hacer que sea sencillo escribir buen código. &#8211; Magnus Lycka]]></description>
			<content:encoded><![CDATA[<blockquote><p>Tengo la impresión de que Java fue diseñado para hacer que fuera difícil escribir mal código, mientras que Python está diseñado para hacer que sea sencillo escribir buen código.</p>
<p>&#8211; Magnus Lycka</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2009/06/08/java-vs-python/feed/</wfw:commentRss>
		<slash:comments>58</slash:comments>
		</item>
		<item>
		<title>Ofuscar código Java</title>
		<link>http://mundogeek.net/archivos/2009/06/08/ofuscar-codigo-java/</link>
		<comments>http://mundogeek.net/archivos/2009/06/08/ofuscar-codigo-java/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 10:11:18 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[ofuscar]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=3384</guid>
		<description><![CDATA[Asumámoslo: es imposible proteger al 100% nuestro código de miradas indiscretas. Pero eso no implica que no podamos dificultar un poco el proceso de decompilar nuestro código. Y este es el objetivo de los ofuscadores de código. Un ejemplo de este tipo de herramientas es la aplicación GPL ProGuard que permite, además de ofuscar nuestras [...]]]></description>
			<content:encoded><![CDATA[<p>Asumámoslo: es imposible proteger al 100% nuestro código de miradas indiscretas. Pero eso no implica que no podamos dificultar un poco el proceso de <a href="http://mundogeek.net/archivos/2009/03/28/decompilar-clases-java/" title="Decompilar clases Java">decompilar nuestro código</a>. Y este es el objetivo de los <strong>ofuscadores de código</strong>.</p>
<p>Un ejemplo de este tipo de herramientas es la aplicación GPL <a href="http://proguard.sourceforge.net/" title="Ofuscar código Java con ProGuard">ProGuard</a> que permite, además de <strong>ofuscar nuestras clases Java</strong>, optimizarlas, comprimirlas y añadirles información de preverificación, de forma que la carga de las clases en Java SE 6 y Java ME 6 sea más rápida y más eficiente.</p>
<p>La herramienta funciona buscando primeramente clases, campos, métodos y atributos no utilizados, los cuáles elimina; pasa entonces a optimizar el bytecode y eliminar instrucciones innecesarias; y, por último, elimina la información de depuración y renombra las clases, campos y métodos restantes utilizando nombres cortos y poco legibles.</p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2009/06/08/ofuscar-codigo-java/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Formateo de cadenas en Java</title>
		<link>http://mundogeek.net/archivos/2009/05/17/formateo-de-cadenas-en-java/</link>
		<comments>http://mundogeek.net/archivos/2009/05/17/formateo-de-cadenas-en-java/#comments</comments>
		<pubDate>Sun, 17 May 2009 08:51:16 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[cadenas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[printf]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=3226</guid>
		<description><![CDATA[Si has tenido algún contacto previo con C/C++ u otro lenguaje de programación puede que eches de menos un método que permita utilizar especificadores de conversión o máscaras para formatear cadenas en Java, al estilo de la función sprintf de C. Supongamos, por ejemplo, que quisiéramos mostrar en pantalla un número en coma flotante, con [...]]]></description>
			<content:encoded><![CDATA[<p>Si has tenido algún contacto previo con C/C++ u otro lenguaje de programación puede que eches de menos un método que permita utilizar especificadores de conversión o máscaras para formatear cadenas en Java, al estilo de la función <code>sprintf</code> de C.</p>
<p>Supongamos, por ejemplo, que quisiéramos mostrar en pantalla un número en coma flotante, con la peculiaridad de que necesitáramos que sólo se mostraran 2 decimales. Podríamos, por ejemplo, convertir el número en una cadena y manipularla para quedarnos con 2 caracteres después de la coma, pero existen mejores formas de lidiar con este problema.<span id="more-3226"></span></p>
<h2>String.format()</h2>
<p>La primera solución es hacer uso del método estático <code>format</code> de la clase <code>String</code> para crear una cadena que se adapte a nuestras necesidades y que más tarde imprimiremos con el consabido <code>System.out.println()</code> o <code>System.out.print()</code>.</p>
<p>Este método toma como parámetros una cadena con uno o más especificadores de conversión y una lista de argumentos. En el siguiente fragmento de código, por ejemplo, se sustituirían los especificadores <code>%s</code> por el valor de las variables <code>usuario</code> y <code>mensajes</code> respectivamente.</p>
<pre name="code" class="java">public class Ejemplo {
	public static void main(String[] args) {
		String usuario = "zootropo";
		int mensajes = 36;

		String s = String.format("%s escribió %s mensajes", usuario, mensajes);
		System.out.println(s);
	}
}</pre>
<p>Los distintos especificadores de conversión que podemos utilizar son los siguientes:</p>
<table border="1">
<tr>
<td><b>Especificador</b></td>
<td><b>Formato</b></td>
</tr>
<tr>
<td><code>%b</code></td>
<td>Booleano</td>
</tr>
<tr>
<td><code>%h</code></td>
<td>Hashcode</td>
</tr>
<tr>
<td><code>%s</code></td>
<td>Cadena</td>
</tr>
<tr>
<td><code>%c</code></td>
<td>Caracter unicode</td>
</tr>
<tr>
<td><code>%d</code></td>
<td>Entero decimal</td>
</tr>
<tr>
<td><code>%o</code></td>
<td>Entero octal</td>
</tr>
<tr>
<td><code>%x</code></td>
<td>Entero hexadecimal</td>
</tr>
<tr>
<td><code>%f</code></td>
<td>Real decimal</td>
</tr>
<tr>
<td><code>%e</code></td>
<td>Real notación científica</td>
</tr>
<tr>
<td><code>%g</code></td>
<td>Real notación científica o decimal</td>
</tr>
<tr>
<td><code>%a</code></td>
<td>Real hexadecimal con mantisa y exponente</td>
</tr>
<tr>
<td><code>%t</code></td>
<td>Fecha u hora</td>
</tr>
</table>
<p><br/></p>
<p>A estos caracteres que indican cómo se debe formatear los distintos valores de la lista de parámetros se les puede añadir caracteres opcionales siguiendo el siguiente formato:</p>
<blockquote><p>%[índice$][opciones][ancho][.precisión]conversión</p></blockquote>
<p>donde índice se puede utilizar para indicar especificamente el valor de la lista de valores por el que sustituirlo</p>
<pre name="code" class="java">public class Ejemplo {
	public static void main(String[] args) {
    int numero = 42;

    String s = String.format("%1$d en hexadecimal es %1$x", numero);
		System.out.println(s);
	}
}</pre>
<p>ancho es un entero no negativo que indica el número de caracteres mínimo que debe ocupar ese valor al mostrarse en pantalla. Si el valor tiene menos caracteres que los indicados se rellenará el vacío con espacios.</p>
<p>precisión es un entero no negativo que indica el número de decimales a utilizar para un número en coma flotante (la misma función se encarga de redondear) o el número de caracteres a mostrar para una cadena. </p>
<pre name="code" class="java">public class Ejemplo {
	public static void main(String[] args) {
		float numero = 3.14159f;

    String s = String.format("PI es %.3f", numero);
		System.out.println(s);
	}
}</pre>
<h2>System.out.printf()</h2>
<p>Pero como decíamos al principio del artículo existe otra forma más para mostrar cadenas formateadas en la consola, y es el método <code>System.out.printf()</code>. Este método funciona de forma similar a una combinación de <code>String.format()</code> y <code>System.out.print()</code> ya que podemos pasar directamente la cadena con los especificadores de conversión y la lista de argumentos para imprimirse, de forma similar a la función <code>sprintf</code> de C.</p>
<p>El fragmento de código anterior, por ejemplo, tendría este aspecto al reescribirlo con un <code>System.out.printf()</code>:</p>
<pre name="code" class="java">public class Ejemplo {
	public static void main(String[] args) {
		float numero = 3.14159f;

		System.out.printf("PI es %.3f", numero);
	}
}</pre>
<link type="text/css" rel="stylesheet" href="http://mundogeek.net/sh/css/SyntaxHighlighter.css"></link>
<script language="javascript" src="http://mundogeek.net/sh/js/shCore.js"></script><br />
<script language="javascript" src="http://mundogeek.net/sh/js/shBrushJava.js"></script><br />
<script language="javascript">dp.SyntaxHighlighter.ClipboardSwf = 'http://mundogeek.net/sh/flash/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');</script></p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2009/05/17/formateo-de-cadenas-en-java/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Introducción a C# para programadores Java</title>
		<link>http://mundogeek.net/archivos/2009/05/08/introduccion-a-c-para-programadores-java/</link>
		<comments>http://mundogeek.net/archivos/2009/05/08/introduccion-a-c-para-programadores-java/#comments</comments>
		<pubDate>Fri, 08 May 2009 09:36:10 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[c sharp]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=3185</guid>
		<description><![CDATA[Java y C# (pronunciado C sharp) son lenguajes de programación con muchas similitudes. No obstante .NET, y C# en particular, fueron la respuesta de Microsoft a la demanda de Sun en la que esta acusaba a la compañía de Redmond de intentar &#8220;secuestrar&#8221; el lenguaje Java con una implementación incompatible de la máquina virtual, la [...]]]></description>
			<content:encoded><![CDATA[<p>Java y C# (pronunciado C sharp) son lenguajes de programación con muchas similitudes. No obstante .NET, y C# en particular, fueron la respuesta de Microsoft a la demanda de Sun en la que esta acusaba a la compañía de Redmond de intentar &#8220;secuestrar&#8221; el lenguaje Java con una implementación incompatible de la máquina virtual, la MSJVM (Microsoft Java Virtual Machine). De no haberse producido esta demanda, quizás las cosas se hubieran desarrollado de forma totalmente distinta, y puede que C# ni si quiera hubiera nacido.</p>
<p>En todo caso C# y Java también tienen muchas e importantes diferencias. C# cuenta, por ejemplo, con características tan interesantes como closures, funciones lambda, generadores, preprocesador, punteros, etc. Este artículo tiene como objetivo servir a modo de pequeña introducción a C# a los programadores Java.<span id="more-3185"></span></p>
<p>La última versión disponible de C# es la 3.5, de Noviembre de 2007, aunque se está trabajando en importantes e interesantes mejoras para el próximo C# 4.0.</p>
<p>Para poder programar en C# necesitaremos instalar, al menos, el <a href="http://www.microsoft.com/net/Download.aspx" title="Framework .NET">framework .NET</a>, aunque es muy probable que ya lo tengas instalado. De ser así tendrás una carpeta C:\WINDOWS\Microsoft.NET\Framework\v3.5 donde podrás encontrar, entre otras cosas, el compilador de C#, csc.exe (de C Sharp Compiler).</p>
<p>Compilar una clase usando csc es de lo más sencillo. Funciona de forma similar a javac, pasando como argumento los archivos con las clases a compilar. En este caso, no obstante, la extensión de los ficheros es cs, de C Sharp. Para compilar un archivo de código fuente:</p>
<p class="code">csc Ejemplo.cs</p>
<p>Para compilar varios archivos:</p>
<p class="code">csc *.cs</p>
<p>Otra opción a la hora de programar y compilar nuestras aplicaciones es utilizar Visual Studio, el popular entorno de desarrollo de Microsoft. Es posible descargar una <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=es&#038;FamilyID=83c3a1ec-ed72-4a79-8961-25635db0192b" title="Microsoft Visual Studio 2008 Professional trial">versión trial de 90 días del entorno</a> desde la web de Microsoft, así como una versión gratuita recortada llamada <a href="http://www.microsoft.com/express/vcsharp/Default.aspx" title="Microsoft Visual C# 2008 Express Edition">Express Edition</a>, ideal para estudiantes y para personas que estén empezando con el lenguaje.</p>
<p>Por último también podemos recurrir a alternativas libres, como es el caso de <a href="http://www.icsharpcode.net/OpenSource/SD/">#develop</a> (SharpDevelop), un IDE muy similar a Visual Studio, salvando las distancias.</p>
<p>En todo caso una vez compilemos nuestro programa el resultado será un exe o una dll, que, como las clases de Java, no contendrá código máquina, sino un lenguaje intermedio para una máquina virtual llamado CIL (Common Intermediate Language). Este código intermedio se compilará a código máquina usando un compilador JIT cuando sea necesario.</p>
<p>El punto de entrada a una aplicación de consola en C# es el método <code>Main</code>. Por convención los nombres de los miembros, las clases, interfaces y espacios de nombres utilizan <em>pascal casing</em>, es decir, la primera letra de cada palabra en mayúsculas.</p>
<pre name="code" class="c-sharp">class Ejemplo {
  static void Main(string[] args) {
  }
}</pre>
<p><code>Main</code> puede devolver <code>void</code> o un <code>int</code> a modo de estado de retorno.</p>
<pre name="code" class="c-sharp">class Ejemplo {
  static void Main(string[] args) {
    return 0;
  }
}</pre>
<p>Podemos obviar los argumentos si no vamos a pasar ningún parámetro por línea de comandos, cosa que no podemos hacer en Java.</p>
<pre name="code" class="c-sharp">class Ejemplo {
  static void Main() {
  }
}</pre>
<p>Para imprimir un texto en la consola se utilizan los métodos <code>System.Console.Write()</code> y <code>System.Console.WriteLine()</code></p>
<pre name="code" class="c-sharp">class Ejemplo {
  static void Main() {
    System.Console.WriteLine("Hola mundo");
  }
}</pre>
<p>Estos métodos son más parecidos al <code>System.out.printf</code> de Java que a <code>System.out.print</code> y <code>System.out.println</code>, ya que permiten formatear las cadenas.</p>
<pre name="code" class="c-sharp">class Ejemplo {
  static void Main() {
    string usuario = "juan";
    System.Console.WriteLine("Bienvenido {0}", usuario);
  }
}</pre>
<p>Para ejecutar el programa en Visual Studio podemos utilizar la combinación de teclas Ctrl + F5, o bien F5 si queremos iniciar el programa con el depurador.</p>
<p>Dependiendo del IDE que utilices puede que te interese añadir una llamada a <code>System.Console.Read()</code> o <code>System.Console.ReadLine()</code> para leer un carácter o una línea de texto desde el teclado antes de terminar la ejecución del programa, y así poder ver el resultado tranquilamente.</p>
<pre name="code" class="c-sharp">class Ejemplo {
  static void Main() {
    System.Console.WriteLine("Hola mundo");
    System.Console.Read();
  }
}</pre>
<p>Los tipos predefinidos son similares a Java, a excepción de que existen tipos enteros sin signo, además de un tipo de punto flotante <code>decimal</code> que ofrece mayor precisión que <code>float</code> y <code>double</code> y es similar a la clase <code>BigDecimal</code> de Java. Es posible que en Java 7 <code>BigDecimal</code> soporte operadores, reduciendo así las diferencias con <code>decimal</code>.</p>
<table border="1" style="border-collapse:collapse;border-color:#ccc;" cellpadding="3" cellspacing="2">
<caption>Tipos enteros</caption>
<tr>
<th>Tipo</th>
<th>Tamaño</th>
<th>Significado</th>
<th>Equivalencia Java</th>
</tr>
<tr>
<td><code>sbyte</code></td>
<td>8 bits</td>
<td>Byte con signo</td>
<td><code>byte</code></td>
</tr>
<tr>
<td><code>byte</code></td>
<td>8 bits</td>
<td>Byte sin signo</td>
<td></td>
</tr>
<tr>
<td><code>short</code></td>
<td>16 bits</td>
<td>Entero corto con signo</td>
<td><code>short</code></td>
</tr>
<tr>
<td><code>ushort</code></td>
<td>16 bits</td>
<td>Entero corto sin signo</td>
<td></td>
</tr>
<tr>
<td><code>int</code></td>
<td>32 bits</td>
<td>Entero con signo</td>
<td><code>int</code></td>
</tr>
<tr>
<td><code>uint</code></td>
<td>32 bits</td>
<td>Entero sin signo</td>
<td></td>
</tr>
<tr>
<td><code>long</code></td>
<td>64 bits</td>
<td>Entero largo con signo</td>
<td><code>long</code></td>
</tr>
<tr>
<td><code>ulong</code></td>
<td>64 bits</td>
<td>Entero largo sin signo</td>
<td></td>
</tr>
</table>
<p><br/></p>
<table border="1" style="border-collapse:collapse;border-color:#ccc;" cellpadding="3" cellspacing="2">
<caption>Tipos punto flotante</caption>
<tr>
<th>Tipo</th>
<th>Tamaño</th>
<th>Significado</th>
<th>Equivalencia Java</th>
</tr>
<tr>
<td><code>float</code></td>
<td>32 bits</td>
<td>Flotante</td>
<td><code>float</code></td>
</tr>
<tr>
<td><code>double</code></td>
<td>64 bits</td>
<td>Flotante doble precisión</td>
<td><code>double</code></td>
</tr>
<tr>
<td><code>decimal</code></td>
<td>128 bits</td>
<td>Flotante alta precisión</td>
<td><code>BigDecimal</code></td>
</tr>
</table>
<p><br/></p>
<p>Todos los literales con punto se consideran valores de tipo <code>double</code>. Si queremos asignar un literal con coma a una variable de tipo <code>float</code> o <code>decimal</code> tendremos que añadir obligatoriamente el sufijo <code>F</code> o <code>M</code> respectivamente para indicar que el literal es de ese tipo. En caso contrario no compilará.</p>
<p>Esto no compilaría:</p>
<pre name="code" class="c-sharp">class Ejemplo {
  public static void Main() {
    float f = 1.23;
  }
}</pre>
<p>Esto si:</p>
<pre name="code" class="c-sharp">class Ejemplo {
  public static void Main() {
    float f = 1.23F;
  }
}</pre>
<table border="1" style="border-collapse:collapse;border-color:#ccc;" cellpadding="3" cellspacing="2">
<caption>Otros tipos</caption>
<tr>
<th>Tipo</th>
<th>Tamaño</th>
<th>Significado</th>
<th>Equivalencia Java</th>
</tr>
<tr>
<td><code>bool</code></td>
<td>8 bits</td>
<td>Booleano</td>
<td><code>boolean</code></td>
</tr>
<tr>
<td><code>char</code></td>
<td>16 bits</td>
<td>Caracter unicode</td>
<td><code>char</code></td>
</tr>
<tr>
<td><code>string</code></td>
<td></td>
<td>Cadena de caracteres unicode</td>
<td><code>String</code></td>
</tr>
</table>
<p><br/></p>
<p><code>string</code> es en realidad un simple alias de la clase <code>System.String</code>. No existe, por tanto, ninguna diferencia entre las siguientes formas de crear un objeto cadena. <code>string</code> se sustituye por <code>System.String</code> al compilar.</p>
<pre name="code" class="c-sharp">class Ejemplo {
  public static void Main() {
    string cadena1 = "hola";
    System.String cadena2 = "adios";
  }
}</pre>
<p>De igual forma <code>int</code>, <code>long</code>, <code>byte</code>, &#8230; son en realidad alias de las clases <code>System.Int32</code>, <code>System.Int64</code>, <code>System.Byte</code>, &#8230;</p>
<p>En C# todos los objetos derivan de <code>System.Object</code>, de forma análoga a los objetos de Java que derivan de <code>java.lang.Object</code>. también existe un alias de <code>System.Object</code> que es <code>object</code>.</p>
<p>Los operadores son similares a los de Java: +, -, *, /, %, ==, !=, &#038;, ^, &#8230;</p>
<p>La instrucción <code>if</code>-<code>else</code> funciona igual que en Java, así como los bucles <code>for</code>, <code>while</code> y <code>do</code>-<code>while</code>. Tenemos también sentencias <code>break</code> y <code>continue</code>, igual que en Java.</p>
<p>Un ejemplo del uso del bucle for:</p>
<pre name="code" class="c-sharp">class Ejemplo {
  public static void Main() {
    int[] numeros = new int[]{1, 2, 3, 4,};
    for (int i = 0; i < numeros.Length; i++)
      System.Console.WriteLine(numeros[i]);
  }
}</pre>
<p>Como vemos los arrays también son similares a los de Java.</p>
<p>El bucle <code>foreach</code> tiene una palabra clave propia, <a href="http://mundogeek.net/archivos/2009/02/19/bucles-for-each-en-java/" title="For each en Java">a diferencia de Java</a>, que utiliza <code>for</code>. La sintaxis es parecida, sustituyendo los dos puntos (<code>:</code>) de Java por la palabra clave <code>in</code>.</p>
<pre name="code" class="c-sharp">class Ejemplo {
  public static void Main() {
    int[] numeros = {1, 2, 3, 4};
    foreach (int numero in numeros)
      System.Console.WriteLine(numero);
  }
}</pre>
<p>Ambos lenguajes tienen en común varios <a href="http://mundogeek.net/archivos/2009/03/30/modificadores-en-java/" title="Modificadores en Java">modificadores</a>.</p>
<p>De entre los modificadores de acceso coinciden <code>public</code> (acceso no restringido), <code>private</code> (acceso restringido a la clase contenedora) y <code>protected</code> (acceso restringido a la clase contenedora y a las que la extienden). C# añade un par de modificadores nuevos: <code>internal</code> que indica que un miembro o tipo sólo se puede acceder desde tipos del mismo proyecto o <em>assembly</em> y <code>protected internal</code> que limita el acceso a las clases del proyecto actual y a las clases que extiendan la clase actual.</p>
<p>Por defecto las clases son <code>internal</code> y los miembros de las clases, <code>private</code>.</p>
<p>Otros modificadores en común son <code>abstract</code>, <code>volatile</code> y <code>static</code>. En C# <code>static</code> también se puede utilizar sobre clases para indicar que la clase se compone exclusivamente de miembros estáticos y que no se puede instanciar. En C# también existe un equivalente al <a href="http://mundogeek.net/archivos/2009/03/30/modificadores-en-java/" title="Modificadores en Java">inicializador o bloque estático de Java</a> en forma de constructor estático.</p>
<pre name="code" class="c-sharp">public class Reunion {
  public string Nombre;
  public static int ZonaHoraria;

  static Reunion() {
    System.Console.WriteLine("Constructor estático");
    ZonaHoraria = System.TimeZoneInfo.Local.BaseUtcOffset.Hours;
  }

  public Reunion(string nombre) {
    System.Console.WriteLine("Constructor");
    this.Nombre = nombre;
  }
}

class Ejemplo {
  static void Main() {
    Reunion r = new Reunion("Reunión de desarrollo");
    System.Console.WriteLine(r.Nombre);
    System.Console.WriteLine(Reunion.ZonaHoraria);
    System.Console.ReadLine();
  }
}</pre>
<p><code>const</code> se utiliza para crear constantes, convirtiendo una variable en estática e inmutable de forma similar a <code>static final</code> en Java. En Java <code>const</code> es, de hecho, una palabra clave, aunque no se utiliza, por lo que no podemos crear variables o métodos con dicho nombre.</p>
<p><code>sealed</code> es parecido al <code>final</code> de Java. Al aplicarse sobre una clase, indica que la clase no se puede extender. Al aplicarse a un método, indicada que no se puede sobreescribir. Sin embargo, a diferencia de <code>final</code>, <code>sealed</code> no se puede aplicar sobre variables y sólo es válido para métodos si este reemplaza un método de una clase padre a su vez. Para variables se puede utilizar <code>const</code> o <code>readonly</code> (sólo lectura), que se diferencia del primero en que se puede inicializar tanto en la declaración de la variable como en un constructor, además de no convertirse en estática.</p>
<p><code>extern</code> es parecido al <code>native</code> de Java. Indica que el método está implementado externamente, posiblemente en otro lenguaje.</p>
<p>El equivalente del modificador <code>transient</code> de Java sería el atributo <code>[NonSerialized]</code>. Los atributos son el equivalente en C# de las anotaciones Java.</p>
<pre name="code" class="c-sharp">[Serializable()]
class MiClase {
  public int Serializable1;
  public string Serializable2;

  [NonSerialized()]
  public int NoSerializable;
}</pre>
<p>C# cuenta con muchos otros modificadores que no tienen equivalente directo en Java como <code>override</code>, <code>partial</code>, <code>ref</code>, ...</p>
<p>El modificador <code>ref</code>, por ejemplo, hace que el parámetro indicado se pase por referencia en lugar de por valor, que es el comportamiento estándar de C#. De esta forma las modificaciones que se realicen dentro de la función afectarán a la variable y no serán locales al método. Esto, sin embargo, no es una buena práctica.</p>
<pre name="code" class="c-sharp">class Ejemplo {
  public static void Main() {
    int numero = 10;
    sumar(ref numero);
    System.Console.WriteLine(numero);
  }

  static void sumar(ref int num) {
    num = num + 1;
    System.Console.WriteLine(num);
  }
}</pre>
<p>El modificador <code>params</code> se utiliza para crear métodos con número de parámetros variable de forma similar a los <a href="">varargs en Java</a>.</p>
<pre name="code" class="c-sharp">class Ejemplo {
  public static void Main() {
    imprimir("Uno", "Dos", "Tres");
    System.Console.ReadLine();
  }

  public static void imprimir(params string[] cadenas) {
    foreach (string cadena in cadenas)
      System.Console.WriteLine(cadena);
  }
}</pre>
<p>En C# las clases se organizan en <em>namespaces</em> o espacios de nombre, un concepto similar al de los paquetes en Java.</p>
<pre name="code" class="c-sharp">namespace Aplicacion {
  namespace Interfaz {
    class VentanaPrincipal {
    }
  }
}</pre>
<p>Para importar un espacio de nombres se utiliza la palabra clave <code>using</code>, que sería algo parecido al <code>import</code> de Java. Comparemos el siguiente código:</p>
<pre name="code" class="c-sharp">class Ejemplo {
  public static void Main() {
    System.Console.WriteLine(System.Math.Sqrt(16));
  }
}</pre>
<p>con este otro en el que importamos el espacio de nombres <code>System</code>:</p>
<pre name="code" class="c-sharp">using System;

class Ejemplo {
  public static void Main() {
    Console.WriteLine(Math.Sqrt(16));
  }
}</pre>
<p>Las clases y las interfaces tienen el mismo aspecto que en Java.</p>
<pre name="code" class="c-sharp">class Ejemplo {
  int atributo = 10;

  public Ejemplo() {
    Console.WriteLine("Constructor");
  }

  public void saludar() {
    Console.WriteLine("Un método");
  }
}</pre>
<pre name="code" class="c-sharp">interface Instrumento {
  public void Tocar();
}</pre>
<p>Lo que no existe en Java, a pesar de que sea pan de cada día en muchos lenguajes modernos y no tan modernos, son las propiedades, que ofrecen una forma más elegante de trabajar con getters y setters y que se descartaron para Java 7.</p>
<p>Para utilizar las propiedades creamos por un lado un atributo privado al que se accederá a través de una propiedad, y por otro la propiedad en si misma, que tiene el aspecto de la definición de un atributo seguido de un bloque get y un bloque set (o bien sólo un bloque get si queremos una propiedad de sólo lectura, o sólo un bloque set si queremos una propiedad de sólo escritura).</p>
<pre name="code" class="c-sharp">class Usuario {
  private string nombre;

  public string Nombre {
    get { return nombre; }
    set { nombre = value; }
  }
}</pre>
<p>La única peculiaridad a tener en cuenta es el uso de la palabra clave <code>value</code> para referirnos al valor que se está intentando asignar al atributo.</p>
<p>Desde C# 3.0 existe una forma aún más sencilla de definir las propiedades, y es que si la funcionalidad del get o el set va a consistir tan solo en leer o modificar el valor, podemos ahorrarnos el código del bloque y escribir algo así:</p>
<pre name="code" class="c-sharp">class Usuario {
  private string nombre;

  public string Nombre {
    get;
    set;
  }
}</pre>
<p>Una vez definida nuestra propiedad podemos acceder o modificar el atributo como si de un atributo cualquiera se tratase, aunque sabemos que por debajo estamos utilizando un método, con todo lo que ello conlleva (podríamos haber hecho, por ejemplo, que se impidiera que se asignara un valor a <code>nombre</code> que tuviera más de 15 letras).</p>
<pre name="code" class="c-sharp">class Usuario {
  private string nombre;

  public string Nombre {
    get; set;
  }
}

class Ejemplo {
  static void Main() {
    Usuario u = new Usuario();
    u.Nombre = "Raúl";
    System.Console.WriteLine("Hola " + u.Nombre);
  }
}</pre>
<p>Otro mecanismo parecido a las propiedades del que también carece Java son los indizadores. Estos funcionan igual que las propiedades, con la excepción de que se acceden utilizando un índice en lugar del nombre de la propiedad. Son adecuados por tanto para colecciones.</p>
<pre name="code" class="c-sharp">class Departamento {
  private string[] trabajadores = new string[100];

  public string this[int indice] {
    get { return trabajadores[indice]; }
    set { trabajadores[indice] = value; }
  }
}

class Ejemplo {
  static void Main() {
    Departamento d = new Departamento();
    d[0] = "Raúl González";
    System.Console.WriteLine(d[0]);
  }
}</pre>
<p>Los indizadores no están limitados a índices de tipo <code>int</code>, ni a un solo índice.</p>
<p>Otro tipo de método interesante son los destructores, que se declaran de la misma forma que los constructores añadiendo un <code>~</code> antes del nombre de la clase.</p>
<pre name="code" class="c-sharp">class BaseDatos {
  ~BaseDatos() {
    System.Console.WriteLine("Cerrando conexión");
  }
}</pre>
<p>Como ya hemos comentado las clases pueden extender otras clases, pero en lugar de utilizar la palabra clave <code>extends</code> se utiliza el operador <code>:</code>.</p>
<pre name="code" class="c-sharp">class Persona {
  }

  class Usuario : Persona {
  }
}</pre>
<p>También se utiliza el mismo operador para indicar las interfaces que implementa una clase.</p>
<pre name="code" class="c-sharp">class Clase : Interfaz1, Interfaz2 {
}</pre>
<link type="text/css" rel="stylesheet" href="http://mundogeek.net/sh/css/SyntaxHighlighter.css"></link>
<script language="javascript" src="http://mundogeek.net/sh/js/shCore.js"></script><br />
<script language="javascript" src="http://mundogeek.net/sh/js/shBrushCSharp.js"></script><br />
<script language="javascript">dp.SyntaxHighlighter.ClipboardSwf = 'http://mundogeek.net/sh/flash/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');</script></p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2009/05/08/introduccion-a-c-para-programadores-java/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Configurando Eclipse</title>
		<link>http://mundogeek.net/archivos/2009/05/07/configurando-eclipse/</link>
		<comments>http://mundogeek.net/archivos/2009/05/07/configurando-eclipse/#comments</comments>
		<pubDate>Thu, 07 May 2009 19:44:42 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=3180</guid>
		<description><![CDATA[Eclipse es uno de los mejores entornos de desarrollo que existen, tanto para Java como para otros lenguajes como Python o C/C++, pero lo es mucho más si lo personalizamos para adaptarlo a nuestros gustos y necesidades. A continuación os dejo algunos de los cambios que me gusta realizar. En General marcar &#8220;Show heap status&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Eclipse es uno de los mejores entornos de desarrollo que existen, tanto para Java como para otros lenguajes como Python o C/C++, pero lo es mucho más si lo personalizamos para adaptarlo a nuestros gustos y necesidades. A continuación os dejo algunos de los cambios que me gusta realizar.<span id="more-3180"></span></p>
<ul>
<li>En General marcar &#8220;Show heap status&#8221; para mostrar un pequeño indicador en la esquina inferior derecha con el uso de Java de la memoria dinámica.</li>
<li>En General -> Appearance, marcamos &#8220;Override presentation settings&#8221; para poder modificar la posición de las pestañas y el selector de perspectivas. Desmarcamos &#8220;Show text on the perspective bar&#8221; para no mostrar el nombre de la perspectiva actual en la barra de perspectivas, para lograr más espacio. Marcamos &#8220;Show traditional style tabs&#8221; para usar pestañas normales y desmarcamos &#8220;Enable animations&#8221; para desactivar las animaciones y que el entorno vaya más fluido.</li>
<li>En General -> Appearance -> Colors and Fonts, expandimos Basic, seleccionamos Text Font, pulsamos Change, y seleccionamos la fuente que queramos utilizar para los editores. En mi caso <a href="http://mundogeek.net/archivos/2006/11/18/fuentes-para-programacion" title="Fuentes para programación">suelo utilizar Bitstream Vera Sans Mono o Consolas</a>.</li>
<li>En General -> Editors -> Structured Text Editors marcamos Enable folding para contar con la característica de code folding en los editores de HTML, JSP, XML, &#8230;</li>
<li>En General -> Editors -> Text Editors marcamos Insert spaces for tabs para que el editor introduzca espacios al pulsar la tecla de tabulación en lugar de caracteres de tabulación. Marcamos Show print margin para que el editor muestre una línea en la columna 80. Marcamos show line numbers para mostrar los números de línea.</li>
<li>En General -> Editors -> Text Editors -> Spelling desmarcamos &#8220;Enable spell checking&#8221; para que no compruebe la ortografía, cosa que en un editor de código molesta más de lo que ayuda.</li>
<li>En General -> Workspace seleccionamos Other, UTF-8 para Text file encoding para usar Unicode como juego de caracteres para los archivos que creemos y Other, Unix en New text file line delimiter para usar el caracter de fin de línea de Unix.</li>
<li>En Java -> Code Style -> Formatter pulsamos &#8220;Edit&#8230;&#8221; para modificar la forma de comportarse del formateo de código automático de Eclipse. En la pestaña &#8220;Identation&#8221; del nuevo diálogo seleccionamos &#8220;Spaces only&#8221; para &#8220;Tab policy&#8221; para que utilice siempre espacios y no tabuladores. Marcamos Statements within &#8216;switch&#8217; body para que indente las sentencias del switch. Cambiamos el nombre del perfil al que queramos en &#8220;Profile name&#8221; y pulsamos Ok.</li>
<li>En Java -> Editor -> Save Actions marcamos Perform the selected actions on save y marcamos Format source code para que use el formateo de código automático al guardar el archivo, Organize imports para que organice los imports según el paquete y Additional actions para otras acciones. Pulsamos Configure para configurar estas otras acciones y en Code Style marcamos Convert for loops to enhanced para que sustituya los bucles que recorren colecciones por la versión <a href="mundogeek.net/archivos/2009/02/19/bucles-for-each-en-java/" title="Bucles for each en Java">for-each</a> y desmarcamos Use modificer &#8216;final&#8217; where possible para que no declare las variables que no modificamos como final. En Unnecessary Code marcamos Remove unused imports para que se eliminen los imports que no utilizamos. En Code Organizing marcamos Correct indentation y Sort members.</li>
<li>Cerramos la vista de Outline, que podemos sustituir con el breadcumb, haciendo clic sobre el botón de la barra de herramientas Toggle Breadcumb, o con la vista de outline rápida, pulsando Ctrl + O.</li>
</ul>
<p>Eclipse guarda la configuración del entorno en una carpeta .metadata dentro del directorio del espacio de trabajo. Una vez configurado basta conservar esta carpeta.</p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2009/05/07/configurando-eclipse/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
	</channel>
</rss>

