Estoy creando una interfaz en Java para el controlador de errores personalizado.
Quiero pasar un objeto de error de argumento pero necesito que sea hijo de Exception
clase.
¿Está bien usar mi nombre de clase definido en una interfaz?
¿No será menos una interfaz en términos de no depender de ninguna implementación?
Intento hacer algo como esto:
public class CustomException {
/* ... Implementation ... */
}
public interface Interface {
void onError(CustomException ex);
}
java
design
object-oriented
interfaces
nikachx
fuente
fuente
CustomException
parte de la implementación o parte de la interfaz?String
más seguro queCustomException
? ¿Por qué importa siCustomException
, a su vez, tiene otras dependencias?Respuestas:
Primero tengo que señalar el hecho de que
CustomException
no se extiende,Exception
por lo que no es realmente unException
.Eso dijo:
Si no le importa el Principio de inversión de dependencia , déjelo como está. Está perfectamente bien que una interfaz dependa de clases concretas, por ejemplo, muchas interfaces dependen
String
oObject
cuáles son clases concretas . La cuestión es que tendemos a creer que las clases que pertenecen al SDK de Java son más estables (menos propensas a cambios de descifrado de código) que las que escribimos.Por otra mano:
Si desea seguir el DIP (que tiene innumerables beneficios y es mi recomendación), debe hacer una de dos cosas:
Opción 1
CustomException
resumenvoid onError(CustomException ex)
como esopcion 2
CustomException
una interfazvoid onError(CustomException ex)
como esCon cualquiera de esas opciones, se conformaría con el DIP, ya que la interfaz no dependería de ninguna clase concreta, solo de abstracciones.
fuente
Interface
interfaz acepta aCustomException
y deja que la persona que llama proporcione una, la persona que llama es libre de proporcionar cualquier clase que se extienda,CustomException
incluso si seCustomException
trata de una clase concreta, lo que no hubiera sido posible si deInterface
alguna manera fuera responsable de crear eso. Esta inversión de control, más que trabajar con interfaces (aunque eso ciertamente ayuda), es de lo que creo que se trata DI.Tulains tiene razón: las interfaces dependen de clases concretas todo el tiempo. Solo tienen la intención de crear un contrato para sus propias preocupaciones. Ese contrato puede implicar tomar y devolver cualquier tipo de datos.
Recuerde que en los lenguajes de nivel superior, incluso los tipos primitivos no son tan primitivos. ¡Así que estás trabajando con tipos concretos de todos modos!
fuente
Supongo que por nombre te refieres a la clase en sí misma. Si está intentando especificar el nombre real de la clase de excepción para inicializar la excepción correspondiente a través de Reflection, este no es el camino correcto.
Si desea usar una clase personalizada en una interfaz, puede, por supuesto, usar sus propias clases en sus propias interfaces. Las clases se convierten en partes de la interfaz pública de su biblioteca / API. Las estructuras de datos y las excepciones son un buen ejemplo de las clases que suelen utilizar las interfaces.
Si necesita utilizar diferentes excepciones según el contexto, puede estar interesado en usar genéricos.
fuente