JavaRush /Blog Java /Random-ES /métodos y clases finales de Java
articles
Nivel 15

métodos y clases finales de Java

Publicado en el grupo Random-ES
Al denotar un método de clase con un modificador final, queremos decir que ninguna clase derivada puede anular este método cambiando su implementación interna. Es decir, estamos hablando de la versión final del método. La clase en su conjunto también se puede marcar como final. métodos y clases finales de Java - 1
final class NoExtending {
// …
}
Una clase marcada como finalno se puede heredar y todos sus métodos adquieren indirectamente la propiedad final. El uso de una característica finalen declaraciones de clases y métodos puede aumentar el nivel de seguridad del código. Si una clase está equipada con un modificador final, nadie puede extender la clase y probablemente romper su contrato en el proceso. Si un signo finaldenota un método, se puede confiar plenamente en su implementación interna en todas las situaciones sin temor a "falsificación". Es apropiado utilizar final, por ejemplo, en la declaración de un método que requiere verificación de la contraseña ingresada por el usuario para garantizar la ejecución exacta de lo que el método pretendía originalmente. Un posible atacante no podrá cambiar la implementación original de dicho método "introduciendo" en el programa una versión anulada del mismo, que, por ejemplo, siempre devuelve el valor verdadero, lo que indica un registro exitoso del usuario, independientemente de la contraseña. en realidad entró. Tiene derecho, si la situación específica lo permite, a ir más allá y declarar finaltoda la clase como clase; el método ValidatePasswordadquirirá la misma propiedad indirectamente. El uso de un modificador finalen un método o declaración de clase impone serias restricciones a la posibilidad de un mayor uso y desarrollo del código. El uso de finalun método en una declaración es un indicador seguro de que la implementación del método es autónoma y completamente completa. Otros programadores que quieran utilizar su clase, ampliando sus funciones para satisfacer sus propias necesidades, se verán limitados en la elección de los medios para lograr su objetivo o se verán completamente privados de ellos. Al marcar finaluna clase como un todo, desactivará su capacidad de ser heredada y probablemente reducirá significativamente su utilidad para los demás. Cuando esté a punto de utilizar el modificador final, asegúrese de si USTED está preparado para tales sacrificios y si vale la pena hacerlos. En muchos casos, para lograr un nivel suficiente de seguridad del código, no es necesario designar toda la clase como final; es muy posible preservar la extensibilidad de la clase marcando finalsólo sus elementos estructurales "críticos" con un modificador. En este caso dejarás intactas las funciones principales de la clase y al mismo tiempo permitirás su herencia con la adición de nuevos miembros, pero sin redefinir los “antiguos”. Por supuesto, los campos a los que accede el código de los métodos finaldeben ser designados a su vez como finalcualquiera de los dos private, ya que de lo contrario cualquier clase derivada podrá cambiar su contenido, afectando el comportamiento de los métodos correspondientes. Otro efecto del uso de modificadores finalestá relacionado con la simplificación del problema de optimización del código resuelto por el compilador. Esto es lo que sucede cuando se llama a un método que no está marcado comofinal, el sistema de ejecución determina la clase real del objeto, asocia la llamada con el código más apropiado del grupo de métodos sobrecargados y transfiere el control a ese código. Pero si, por ejemplo, el método getNameen el ejemplo de clase Attrdiscutido anteriormente se hubiera designado como final, la operación de llamarlo podría haberse simplificado notablemente. En el caso más trivial, como el relacionado con getName, el compilador puede simplemente reemplazar la llamada al método con su código corporal. Este mecanismo se llama incrustación de código (inlining). Cuando se utiliza la versión en línea del método, getNamelas dos expresiones siguientes se ejecutan exactamente igual:
system.out.println("id = " + rose.name);
system.out.println("id = " + rose.getName());
Aunque las expresiones anteriores son equivalentes, la segunda todavía tiene una ventaja, ya que el método getNamele permite darle al campo de nombre una propiedad de solo lectura y al código de clase tener un cierto grado de abstracción, lo que le permite cambiar más libremente el implementación de clase. El compilador puede aplicar el mismo esquema de optimización a los métodos privatey statiс, ya que tampoco permiten anulación. El uso de un modificador finalen las declaraciones de clase también hace que algunas operaciones de verificación de tipos sean más eficientes. En este caso, muchas de estas operaciones ya se pueden realizar en la etapa de compilación y, por lo tanto, los posibles errores se detectan mucho antes. Si el compilador encuentra una referencia a una clase en el texto fuente final, puede estar "seguro" de que el objeto correspondiente es del tipo especificado. El compilador puede determinar inmediatamente el lugar que ocupa una clase en la jerarquía general de clases y comprobar si se utiliza correctamente o no. Si no se aplica el modificador final, las comprobaciones correspondientes se realizan únicamente en la etapa de ejecución del programa. Ejercicio 3.4. ¿Es aconsejable incluir el modificador final en las declaraciones de métodos (y, de ser así, cuáles) de las clases de vehículos y vehículos de pasajeros ? Enlace a la fuente original: http://src-code.net/metody-i-klassy-final-java
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION