¿Cómo determinar programáticamente si la clase dada es una clase de caso o una clase simple?¿Cómo determinar programáticamente si la clase es una clase de caso o una clase simple?
Respuesta
Actualmente (2011), se puede utilizar la reflexión para averiguar si la clase implementa la interfaz scala.Product
:
scala> def isCaseClass(o: AnyRef) = o.getClass.getInterfaces.find(_ == classOf[scala.Product]) != None
isCaseClass: (o: AnyRef)Boolean
scala> isCaseClass(Some(1))
res3: Boolean = true
scala> isCaseClass("")
res4: Boolean = false
Esto es sólo una aproximación - que podría ir más allá y comprobar si se dispone de un método copy
, si implementa Serializable
, si tiene un objeto complementario con un método apropiado apply
o unapply
- en esencia, verifique todas las cosas esperadas de una clase de caso mediante reflexión.
El paquete de reflexión scala que viene en uno de los próximos lanzamientos debe hacer que la detección de clases de casos sea más fácil y más precisa.
EDIT:
Ahora puede hacerlo utilizando la nueva biblioteca Reflexión Scala - ver otra respuesta.
Si quiere decir: ¿Puedo determinar si una clase es una clase de caso o una clase sin caso mediante programación, la respuesta es no, pero puede hacer una aproximación. Las clases de casos son solo un truco de compilación, le dicen al compilador que cree ciertos métodos, etc. En el código de bytes final, no hay diferencia entre clases normales y clases de casos.
De How does a case class differ from a normal class?
- Puede hacer comparación de patrones en él,
- puede construir instancias de estas clases sin necesidad de utilizar el nuevo palabra clave,
- Todos los argumentos del constructor son accesibles desde el exterior utilizando funciones de acceso generadas automáticamente,
- El método toString se redefine automáticamente para imprimir el nombre de la clase de caso y todos sus argumentos,
- El método equals se redefine automáticamente para comparar dos instancias de de la misma clase de caso estructuralmente que por identidad.
- El método hashCode se redefine automáticamente para utilizar los hashCodes de los argumentos del constructor.
Así que en realidad se puede crear una clase de caso con sólo definir los métodos correctos & compañero yourself.
Para una idea sobre cómo averiguar si una clase podría ser una clase de caso, consulte la respuesta de axel22.
Utilizando la nueva Scala reflexión API:
scala> class B(v: Int)
defined class B
scala> case class A(v: Int)
defined class A
scala> def isCaseClassOrWhat_?(v: Any): Boolean = {
| import reflect.runtime.universe._
| val typeMirror = runtimeMirror(v.getClass.getClassLoader)
| val instanceMirror = typeMirror.reflect(v)
| val symbol = instanceMirror.symbol
| symbol.isCaseClass
| }
isCaseClassOrWhat_$qmark: (v: Any)Boolean
scala> class CaseClassWannabe extends Product with Serializable {
| def canEqual(that: Any): Boolean = ???
| def productArity: Int = ???
| def productElement(n: Int): Any = ???
| }
defined class CaseClassWannabe
scala> isCaseClassOrWhat_?("abc")
res0: Boolean = false
scala> isCaseClassOrWhat_?(1)
res1: Boolean = false
scala> isCaseClassOrWhat_?(new B(123))
res2: Boolean = false
scala> isCaseClassOrWhat_?(A(321))
res3: Boolean = true
scala> isCaseClassOrWhat_?(new CaseClassWannabe)
res4: Boolean = false
- 1. ¿Cómo determinar si una clase es una subclase de otra clase?
- 2. Comprobación de si una clase es java.lang.Enum
- 3. AS3 - ¿Puedo saber si una clase implementa una interfaz (o es una subclase de otra clase)?
- 4. Django: cómo determinar si la clase de modelo es abstracta
- 5. ¿Cómo determinar si T es un tipo de valor o una clase de referencia en genérico?
- 6. Determinar si una clase implementa una interfaz muy específica
- 7. Cómo saber si una clase desciende de otra clase
- 8. Determinar si una clase derivada anula un método de una clase base
- 9. ¿Puede una clase base determinar si una clase derivada ha reemplazado a un miembro virtual?
- 10. ¿Cómo puedo determinar si un objeto Delphi es de una clase específica y no de una clase descendiente?
- 11. ¿La forma más simple de determinar si la clase x se deriva de la clase y? (C#)
- 12. Heredar de una clase o una clase abstracta
- 13. ¿Cómo usar la reflexión para determinar si una clase es interna?
- 14. ¿Cómo escribir una clase simple en C++?
- 15. ¿Cómo puedo determinar si una clase amplía otra clase en Java?
- 16. Pruebe si una clase es polimórfica
- 17. ¿Cómo identificar si la referencia de clase es una interfaz?
- 18. ¿Cómo comprobar si una clase hereda otra clase sin instanciarla?
- 19. ¿Cómo puedo convertir una clase de caso en una clase de proyecto de levantamiento-json?
- 20. ¿Es apropiado definir una clase de caso Scala no trivial?
- 21. ¿Cómo uso hasClass para detectar si una clase NO es la clase que quiero?
- 22. comparando imágenes programáticamente - lib o clase
- 23. Comprueba si una clase es una subclase de otra clase en Java
- 24. Reflexión sobre una clase caso Scala
- 25. ¿Cómo se puede agregar programáticamente una variable de clase a una clase en Pharo?
- 26. C++ determine si la clase es comparable
- 27. ¿Existe una heurística para determinar si un método o campo pertenece a una clase?
- 28. Prueba si una clase es una subclase de otra clase en lisp común
- 29. Diferencia entre clase simple y clase estática?
- 30. ¿Cómo verifico si una clase está definida?
Gracias, axel22. Esta es una solución a mi problema. Espero que los desarrolladores agreguen este método de Scala lo antes posible. Сlass implementa la interfaz scala.Product - ¿esta es una condición suficiente para ello? – DimParf
No, no hay condiciones suficientes para verificar esto (afaik).No se puede verificar la existencia de un modificador 'case' en el código original, solo para los métodos que se generan debido al modificador' case '. Como escribí anteriormente, todo es solo una aproximación. – axel22