Por qué declarar una función como argumento a ser la final?

Actualmente estoy trabajando mi camino a través del libro «Enseñar a Ti mismo Desarrollo de Aplicaciones para Android en 24 Horas», publicado por Sams. Soy relativamente nuevo en Java, Android o de otro tipo. Tengo una sólida experiencia en ActionScript 3, que tiene bastantes similitudes con Java que el lenguaje en sí no es difícil de comprender, pero yo todavía tiene algunas preguntas acerca de los fundamentos detrás de algunos de los ejemplos de código en el libro. Por ejemplo, aquí es una función que viene con el código de ejemplo para la Hora 9:

private void processScores(final TableLayout scoreTable, 
      XmlResourceParser scores) throws IOException, XmlPullParserException{

En esta función de la firma, los autores han declarado la scoreTable argumento final. Estoy un poco confundido en cuanto a por qué hizo esto. No cruzar mi mente ni el intento de asignar un nuevo valor para el argumento de la función scoreTable (se considera una mala práctica en ActionScript). Además, realmente no he visto a nadie hacer esto en cualquier del mundo real de Java he examinado o migrar a AS3.

Hay algo específico acerca de desarrollo de Android que hace que sea una necesidad a veces de declarar ciertos los argumentos de la función como la final?

¿Por qué es el TableLayout objeto declarado de final, pero no el XmlResourceParser?

1 Kommentar

  1. 89

    Hay dos principales razones es posible que desee marcar un argumento final. En primer lugar, si usted está planeando sobre el uso del argumento en una clase interna anónima, entonces usted debe marcar final así que puede ser que se hace referencia en esa clase. Esto es en realidad bastante común de casos de uso para el marcado de los argumentos finales.

    La otra razón común para marcar argumentos final es para evitar que se sobrescriba accidentalmente ellos. Si usted realmente no quiere cambiar los argumentos, entonces tal vez usted debe marca final así que si usted realmente hacer, obtendrá el error en tiempo de compilación en lugar de encontrar a cabo en tiempo de ejecución que el código tiene un error.

    • Gracias, definitivamente yo no sabía que este requisito en lo que respecta a las clases internas anónimas. Así entonces sería seguro para inferir basa en el hecho de que sólo TableLayout objeto se declara final que esta función está utilizando estrictamente como un resguardo contra la descuidado de codificación? ¿Por qué iba a ser más especial en este caso de la XmlResourceParser? O son las únicas preguntas que los autores del libro podría conocer la respuesta?
    • Sabes, no estoy seguro. Me imagino que es para la clase interna anónima caso, ya que de lo contrario usted está a la derecha y tiene más sentido para marcar el tanto definitivo. No puedo hablar por los autores, a pesar de que, tal vez usted podría ponerse en contacto con ellos o con el editor?
    • En realidad el anonymous inner class case en sí es una muy buena razón. En Android me encuentro a menudo utilizando OnClickListener y AsyncTask clases y la capacidad de reutilización de estas variables directamente dentro de ellos viene muy bien. Otro enlace para revisar: developer.android.com/guide/practices/design/….
    • Cómo acerca de la optimización? ¿El final de la palabra clave ayuda con eso? ¿Y qué acerca de Objeto de argumentos marcado como final? Usted todavía puede editar cambiar sus campos, si mal no recuerdo.
    • es curioso que lo pregunte acerca de la optimización. He leído en un par de lugares que final referencias tener un acceso más rápido tiempo de no-final de las referencias en el contexto de una aplicación Android. No he punto de referencia de todo esto, sin embargo.
    • Tengo apestaba por esto, y me llevó un día a la figura que estaba asignar null a sí misma.
    • Tenga en cuenta que parece que final argumentos no están impedidos de ser modificado internamente, a diferencia de C++ const argumentos.
    • Está usted seguro de eso? Puede proporcionar una referencia para que?
    • En C++ se pueden usar const de muchas maneras: const object * ptr_to_const_obj, object const * const_ptr_to_obj (es lo que Java final de las referencias son similar), o incluso const object const * const_ptr_to_const_obj.
    • sí, yo sabía que; no sé por qué usted ha señalado estas cosas.
    • Yo creo que él la señaló debido a que se observó que los argumentos finales no están impedidos de ser modificado internamente, lo que hizo que sonara como si estuviera sorprendido de que Java final de las referencias son como un puntero const a un no-const objeto en C++, en lugar de un puntero a un objeto const. También dijo que «a diferencia de C++ const argumentos» sin embargo, el notable comportamiento es, de hecho, al igual que algunos C++ const argumentos, como Krzysztof Jabłoński señaló.
    • Cuando un objeto es «const» en C++, a continuación, sólo se puede llamar «const» métodos y «const» métodos. Que es diferente a la de Java, donde se puede llamar a un setter en el objeto final.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea