Skip to content

Commit e0eabf0

Browse files
committed
Corrige Factory<I>
1 parent 58c9c75 commit e0eabf0

File tree

6 files changed

+260
-180
lines changed

6 files changed

+260
-180
lines changed

source/03.xml/01.jaxp.rst

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,11 +227,11 @@ original.
227227

228228
.. admonition:: Advertencia
229229

230-
El código incluye una variable ``ruta``, que es un objeto ``Path`` que
230+
El código incluye una variable ``ruta``, que es un objeto |Path| que
231231
contiene la ruta del archivo |XML| en consonancia con :ref:`el ejemplo
232232
ilustrativo que escribimos sobre lectura <jaxp-read>`.
233233

234-
Si en cambio, ``ruta`` fuera una objeto ``URI`` podríamos obtener la cadena
234+
Si en cambio, ``ruta`` fuera una objeto :java-net:`URI <URI>` podríamos obtener la cadena
235235
con la ruta del |DTD| de este otro modo:
236236

237237
.. code-block:: java
@@ -365,13 +365,13 @@ si nuestra intención es usarla una sola vez:
365365

366366
.. code-block:: java
367367
368-
Element profesor = (Element) xPath.evaluate("//profesor[@id='p81']", xml, XPathConstants.NODE);
368+
Element profesor = (Element) xPath.evaluate("//profesor[@id='p81']", xml, XPathConstants.NODE); // Mejor que NODESET, porque sabemos que es único
369369
System.out.println(profesor.getTagName()); // profesor
370370
371371
String apelativo = (String) xPath.evaluate("//profesor[@id='p81']/apelativo", xml, XPathConstants.STRING);
372372
System.out.println(apelativo); // Verónica
373373
374-
int cantidad = ((Double) xPath.evaluate("count(//profesor)", xml, XPathConstants.STRING)).intValue();
374+
int cantidad = ((Double) xPath.evaluate("count(//profesor)", xml, XPathConstants.NUMBER)).intValue();
375375
System.out.println(cantidad);
376376
377377
.. rubric:: Notas al pie
@@ -394,3 +394,4 @@ si nuestra intención es usarla una sola vez:
394394
.. |NodeList| replace:: :java-jaxp:`NodeList`
395395
.. |NamedNodeMap| replace:: :java-jaxp:`NamedNodeMap`
396396
.. |Document| replace:: :java-jaxp:`Document`
397+
.. |Path| replace:: :java-nio:`Path`

source/98.apendices/01.funcional/01.function.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,14 +161,14 @@ definidas que podemos usar:
161161
(los genéricos ``T`` y ``U``).
162162

163163
:java-function:`BinaryOperator<T> <BinaryOperator>`
164-
Como el anterior, pero los tres tipos deben iguales (el genérico ``T``).
164+
Como el anterior, pero los tres tipos deben ser iguales (el genérico ``T``).
165165

166166
:java-function:`Predicate<T> <Predicate>`
167167
Toma un argumento de entrada (el genérico ``T``) y devuelve un valor
168168
booleano. Para aplicarla debe ejecutarse el método ``test`` (no ``apply``).
169169

170170
:java-function:`BiPredicate<T, U> <BiPredicate>`
171-
Como el anterior, pero toma dos argumento de entrada.
171+
Como el anterior, pero toma dos argumentos de entrada.
172172

173173
:java-function:`Consumer<T> <Consumer>`
174174
Toma un argumento de entrada (el genérico ``T``) y no devuelve ningún valor.

source/98.apendices/01.funcional/05.collection.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ Collection
3232
==========
3333
:java-util:`Collection` es una interfaz que representa un grupo de objetos, cada
3434
uno de los cuales se llama "elemento". Dependiendo de implementaciones más
35-
específicas los elementos podrán estar ordenador (:java-util:`List`) o
35+
específicas los elementos podrán estar ordenados (:java-util:`List`) o
3636
desordenados (:java-util:`Set`).
3737

3838
.. image:: files/Collection.png

source/98.apendices/05.pattern.rst

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -121,29 +121,35 @@ sirva en cualquier aplicación:
121121
:language: java
122122
:class: toggle
123123
:caption: Clase Factory
124-
:start-at: public class
124+
:start-at: public class Factory
125125

126126
La principal diferencia (además de ser mucho más complicado que el anterior) es
127-
que esta clase sí se instancia con el constructor ``Factory(String packageName,
128-
Class<I> interfaceClass)`` para indicar en qué paquete se encuentran las clases
129-
que implementan la interfaz y cuál es esta. En el ejemplo de nuestros
130-
traductores:
127+
que esta clase sí se instancia con el constructor ``Factory(Class<I>, String)``
128+
para indicar cuál es la interfaz implementada y en qué paquete se encuentran las
129+
clases que la implementan. En el ejemplo de nuestros traductores:
131130

132131
.. code-block:: java
133132
134-
Factory<Traductor> trFactory = new Factory<>("edu.acceso.ejemplo.traductor", Traductor.class);
133+
Factory<Traductor> factory = new Factory<>(Traductor.class, "edu.acceso.ejemplo.traductor");
134+
135+
Ahora bien, si se coloca la interfaz en el mismo paquete que las clases, se
136+
puede omitir el segundo argumento:
137+
138+
.. code-block:: java
139+
140+
Factory<Traductor> factory = new Factory<>(Traductor.class);
135141
136142
La creación de este objeto *Factory* provoca que gracias a la reflexión se
137143
analice el paquete y se localicen las clases que implementan la interfaz
138144
(``Traductor`` en este caso). El objetivo es relacionar estas clases con su
139145
nombre y, en su caso, con los nombres alternativos contenidos en el atributo
140-
``aliases``. Por ejemplo:
146+
``alias``. Por ejemplo:
141147

142148
.. code-block:: java
143149
144150
public class TYaml implements Traductor {
145151
// También podría ser String si sólo hay una alternativa
146-
private static final String[] = {"yml", "yaml"};
152+
private static final String[] alias = {"yml", "yaml"};
147153
148154
// Implementación de la traducción para YAML...
149155
}
@@ -157,11 +163,34 @@ traducción, nos bastaría con hacer:
157163
158164
String formato = "yml"; // Por ejemplo.
159165
160-
Factory<Traductor> trFactory = new Factory<>("edu.acceso.ejemplo.traductor", Traductor.class);
161-
Traductor traductor = trFactory.getObject(formato);
166+
// Suponemos que Traductor y TYaml están en el mismo paquete.
167+
Factory<Traductor> factory = new Factory<>(Traductor.class);
168+
Class<? extends Traductor> traductorClass = factory.get(formato);
169+
170+
Y ya tendríamos disponible la clase que implementa |YAML| para instanciarla
171+
cuando nos sea necesario. También existe la posibilidad de pedir directamente la
172+
instancia:
173+
174+
.. code-block:: java
175+
176+
Traductor traductor = factory.getInstance(formato);
177+
178+
.. caution:: Este método sólo funcionará si el constructor de las clases no
179+
tiene argumentos y, además, la construcción no tiene dependencias cruzadas
180+
en el programa. Por ejemplo, si utilizamos :ref:`una clase para gestionar la
181+
configuración de usuario <cliargs>` es probable que echemos mano de esta
182+
clase ``Factory``. Si el constructor del traductor hace
183+
uso a su vez de la configuración entonces tendremos una dependencia circular:
184+
para construir el objeto de configuración necesitamos un objeto traductor,
185+
pero para construir un objeto traductor necesitamos la configuración.
186+
187+
Por lo general es más seguro obtener la clase del traductor e instanciar
188+
nosotros luego. Justamente en el caso anterior, podríamos obtener la clase
189+
del traductor para definir el atributo del objeto ``Config`` y en el *getter*
190+
de ese atributo, hacer la instanciación.
162191

163-
La clase tiene, además, dos métodos adicionales que sirven básicamente para
164-
brindar información:
192+
La clase tiene, además, otros dos métodos adicionales que sirven básicamente
193+
para brindar información:
165194

166195
``getClasses()``
167196
que devuelve un mapa en que las claves son las cadenas y los valores las
@@ -171,15 +200,4 @@ brindar información:
171200
que devuelve un mapa en que cada clave es una clase y los valores un array
172201
con todos los nombres con los que está relacionada.
173202

174-
.. warning:: El ćodigo tiene una limitación: el constructor de las clases no
175-
puede tener argumentos. En caso de que debiera tenerlos, no obstante, es
176-
fácil soslayar la limitación: bastaría con incluir en la interfaz un método
177-
inicializador. Por ejemplo:
178-
179-
.. code-block:: java
180-
181-
public interface Foobar {
182-
183-
public void initialize( /* Los argumentos que sea */ );
184-
// Resto de métodos que definen la interfaz.
185-
}
203+
.. |YAML| replace:: :abbr:`YAML (YAML Ain't Markup Language)`

0 commit comments

Comments
 (0)