Necesito devolver 2 valores de un método. Mi enfoque es el siguiente:
- crear una clase interna con 2 campos que se usarán para mantener esos 2 valores
- poner el método dentro de esa clase
- instanciar la clase y llamar al método
Lo único que cambiará en el método es que al final asignará esos 2 valores a los campos de la instancia. Entonces puedo abordar esos valores haciendo referencia a los campos de ese objeto.
¿Es un buen diseño y por qué?
java
design-patterns
dhblah
fuente
fuente
BitInteger[] java.math.BigInteger.divideAndRemainder(BitInteger val)
. Devuelve 2 enteros como sus valores de retorno en una matriz.Respuestas:
Yo diría esto en las siguientes líneas:
Para resumir, vería si puedo convertir este "objeto de datos" en una clase completa con datos y comportamiento. Como comentario adicional, es posible que desee hacer que la clase sea inmutable, ya que su estado se establece una vez. Hacerlo inmutable ayudará a evitar que se configure incorrectamente o se modifique más tarde (por ejemplo, alguien que configura uno de los campos como nulo y lo pasa).
Editar: como Patkos Csaba señala correctamente, el principio que se aplica aquí es el Principio de responsabilidad única ( SRP ): la clase que está tratando de crear realmente debería tener una responsabilidad (definida como una razón para cambiar ). Esta guía de diseño debería ayudarlo a determinar si sus dos campos pertenecen o no a una sola clase. Para seguir con el ejemplo de Wikipedia, su clase podría verse como un tipo de informe, en cuyo caso se ajusta a SRP, pero es difícil comentar sin más información.
fuente
Pair<OneClass, AnotherClass>
. Algunas personas estarían en desacuerdo . En cualquier caso,Pair
debe ser un detalle de implementación y nunca aparecer en un método de API público.Existe el concepto de una tupla que se presenta en otros lenguajes, como Python.
Se podría devolver una instancia de esta clase genérica que es fácilmente reutilizable:
fuente
create()
, para evitar tener que especificar los parámetros de tipo en el constructor. Además, nombraría esta clase enPair
lugar deTuple
, dado que solo puede representar 2-tuplas de valores.Parece que esta clase le quita la responsabilidad a otra clase, y esto me hace pensar que este diseño no es excelente.
Para un método que devuelve valores multibles, prefiero
o
Ejemplo para la segunda opción:
fuente
Poner múltiples valores de retorno de un método en su propia clase / estructura a menudo se usa en sistemas basados en mensajes que tienen una clase para Solicitud y respuesta . Un ejemplo de esto es el Protocolo simple de acceso a objetos (SOAP) .
Al menos es bastante común. Si esto es bueno o malo depende de su caso de uso especial.
fuente
Respuesta corta: puede devolver una matriz o una Lista con los dos valores.
Yo personalmente escribiría dos métodos distintos, como
fuente