Eu preciso retornar 2 valores de um método. Minha abordagem é a seguinte:
- crie uma classe interna com 2 campos que serão usados para manter esses 2 valores
- coloque o método dentro dessa classe
- instanciar a classe e chamar o método
A única coisa que será alterada no método é que, no final, ele atribuirá esses 2 valores aos campos da instância. Então eu posso abordar esses valores fazendo referência aos campos desse objeto.
É um bom design e por quê?
java
design-patterns
dhblah
fonte
fonte
BitInteger[] java.math.BigInteger.divideAndRemainder(BitInteger val)
. Retorna 2 números inteiros como seus valores de retorno em uma matriz.Respostas:
Eu argumentaria isso da seguinte maneira:
Para resumir, eu verificaria se posso transformar esse "objeto de dados" em uma classe avançada com dados e comportamento. Como um comentário adicional, convém tornar a classe imutável, pois seu estado é definido uma vez. Torná-lo imutável ajudará a evitar que seja definido incorretamente ou modificado posteriormente (digamos, alguém configurando um dos campos para nulo e passando adiante).
Edit: Como Patkos Csaba salienta corretamente, o princípio a ser aplicado aqui é o Single Responsability Principle ( SRP ) - a classe que você está tentando criar deve realmente ter uma responsabilidade (definida como uma razão para mudar ). Esta diretriz de design deve ajudá-lo a descobrir se seus dois campos pertencem a uma única classe ou não. Para ficar com o exemplo da Wikipedia, sua classe pode ser vista como um tipo de relatório; nesse caso, está em conformidade com o SRP, mas é difícil comentar sem mais informações.
fonte
Pair<OneClass, AnotherClass>
. Algumas pessoas discordariam . Em qualquer caso,Pair
deve ser um detalhe de implementação e nunca aparecer em um método público de API.Existe o conceito de uma tupla que é destaque em outros idiomas, como Python.
Pode-se retornar uma instância dessa classe genérica que é facilmente reutilizável:
fonte
create()
, para evitar precisar especificar os parâmetros de tipo no construtor. Além disso, eu nomearia essa classe emPair
vez deTuple
, pois ela pode representar apenas duas tuplas de valores.Parece que esta classe está tirando a responsabilidade de outra classe, e isso me faz pensar que esse design não é ótimo.
Para um método que retorna valores multible, prefiro
ou
Exemplo para a segunda opção:
fonte
Colocar vários valores de retorno de um método em sua própria classe / estrutura é frequentemente usado em sistemas baseados em mensagens que possuem uma classe para Solicitação e resposta . Um exemplo disso é o SOAP (Simple Object Access Protocol) .
Pelo menos é bastante comum. Se isso é bom ou ruim, depende do seu caso de uso especial.
fonte
Resposta curta: você pode retornar uma matriz ou uma lista com os dois valores.
Eu pessoalmente escreveria dois métodos distintos, como
fonte