Estoy escribiendo una explicación de algún código para un curso, y he estado usando las palabras accidentalmente method
e function
indistintamente. Decidí volver y arreglar la redacción, pero me encontré con un agujero.
Por lo que entiendo, una subrutina es function
si no actúa en una instancia de una clase (su efecto está restringido a su entrada / salida explícita), y es method
si opera en una instancia de una clase (puede llevar fuera de los efectos secundarios en la instancia que lo hacen impuro).
Aquí hay una buena discusión sobre el tema. Tenga en cuenta que, según las definiciones de la respuesta aceptada, una estática method
debería ser una función porque una instancia nunca se pasa implícitamente y no tiene acceso a los miembros de ninguna instancia.
Con esto en mente, ¿no debería ser estática methods
realmente funciones?
Por su definición, no actúan en instancias particulares de una clase; solo están "atados" a la clase debido a su relación. Sin embargo , he visto algunos sitios atractivos que se refieren a las subrutinas estáticas como "métodos" ( Oracle , Fredosaurus , ProgrammingSimplified ), por lo que o todos pasan por alto la terminología o me falta algo (supongo que es lo último) .
Me gustaría asegurarme de que estoy usando la redacción correcta.
¿Alguien puede aclarar esto?
fuente
Respuestas:
Esta cita de 8.4.3.2 puede ayudar:
Java solo quiere que "pienses orientado a objetos". Además, los métodos estáticos tienen acceso a un alcance circundante que puede incluir el estado. En cierto modo, la clase es como un objeto en sí mismo.
fuente
@FunctionalInterface
anotación y con 1 método bajo el capó. Una lambda es simplemente azúcar sintáctica y, en ese sentido, no hay nada nuevo.La respuesta simple es que cuando Java decidió llamar a todo "método", no les importó la distinción entre una función y un método en informática teórica.
fuente
Los métodos estáticos no son exactamente funciones, la diferencia es sutil, pero importante.
Un método estático que usa solo parámetros de entrada dados es esencialmente una función.
Pero los métodos estáticos pueden acceder a variables estáticas y otras funciones estáticas (también usando variables estáticas), por lo que los métodos estáticos pueden tener un estado que es fundamentalmente diferente a una función que, por definición, no tiene estado . (ADENDA: Si bien los programadores a menudo no son tan estrictos con el uso de "función" como definición, una función estricta en informática solo puede acceder a los parámetros de entrada). Por lo tanto, definir este caso de acceso a campos estáticos no es válido decir que los métodos estáticos son siempre funciones.
Otra diferencia que justifica el uso del "método estático" es que puede definir en derivadas de C funciones globales y variables globales a las que se puede acceder desde cualquier lugar. Si no puede acceder a la clase que contiene métodos estáticos, los métodos también son inaccesibles. Por lo tanto, los "métodos estáticos" están limitados en su alcance por diseño en contraste con las funciones globales.
fuente
En Java, una clase definida por el usuario es en realidad una instancia de una subclase de java.lang.Class.
En este sentido, los métodos estáticos se adjuntan a una instancia de una clase conceptual: se adjuntan a una instancia de una subclase de java.lang.Class.
Con esto en mente, el término "método de clase" (un nombre alternativo para los métodos estáticos de Java) comienza a tener sentido. Y el término "método de clase" se puede encontrar en muchos lugares: Objetivo C, Smalltalk y JLS, por nombrar solo algunos.
fuente
En informática, la función se asigna claramente a un método estático. Pero el "método" de una clase es un poco genérico, como "miembro" (miembro de campo, miembro de método). Hay palabras como
Entonces, la razón es que, como dijo el filósofo Ludwig Wittgenstein, el lenguaje es una herramienta con diferentes contextos. "Método" es un buen apodo en la cita anterior para clasificar a un "miembro".
fuente
Tu pensamiento es correcto y tiene sentido. Simplemente no es una terminología establecida en la comunidad Java. Permítanme explicar algunos aspectos internos que pueden ayudar a entender por qué subsiste la terminología.
Java es un lenguaje orientado a objetos basado en clases. Un método siempre es miembro de una clase o instancia (esta es una declaración general válida para otros lenguajes de programación también). Pensamos que clase e instancia son ambos objetos.
Método de instancia (dinámico)
No puede invocar este método directamente desde una clase, debe crear una instancia. Cada instancia hace referencia a ese método. Puede sobrescribir una definición de método con exactamente la misma firma de método (cuando se subclasifican), es decir, los puntos de referencia a un método diferente (que tiene la misma firma, pero puede tener un cuerpo de método diferente). El método es dinámico.
Método de clase (estático)
Solo puede invocar este método directamente desde la clase, es decir, no necesita crear una instancia de esa clase. Solo hay una definición global de ese método en todo el programa. No puede sobrescribir exactamente la misma firma de método cuando el método se declara estático, porque solo hay una definición válida para todo el programa. Tenga en cuenta que el método es miembro del propio objeto de clase, las instancias tienen la misma referencia única (y fija) a ese método.
fuente
Aquí hay otra versión de la terminología, usando Scala como mnemónico:
en Scala tiene
object
s, que son instancias únicas de una clase definida implícitamente1 .Según su definición, podemos llamar a estas subrutinas que pertenecen a los
object
métodos , ya que operan en una sola instancia de la clase.Además, el objeto también definirá la clase A y creará todos los métodos en el objeto A como métodos estáticos en la clase A (para interactuar con Java) [2] .
Por lo tanto, podemos decir que los métodos estáticos de la clase A de Java acceden a los mismos miembros que la instancia Singleton de Scala, que según su definición merecen llamarse métodos (estáticos) de la clase A.
fuente
object
referencia tiene mucho sentido. Gracias.Por supuesto, la principal diferencia es que el método puede usar campos estáticos, no solo parámetros del método. Pero hay uno adicional: ¡polimorfismo! Los resultados de la evaluación Clase A.doTheSameStaticMethod () y ClassB.doTheSameStaticMehod () dependerán de la clase. En este caso la función es impotente.
fuente
Cada clase tiene un objeto para representarlo que es una instancia de una subclase de la
Class
clase. Los métodos estáticos son realmente métodos de instancia en estos objetos que son instancias de una subclase de Clase. Tienen acceso al estado en forma de campos estáticos, por lo que no se limitan a ser solo funciones (sin estado). Son métodos.fuente