Użycie keyword final w metodzie

0

Chciał bym poznać wasze zdanie na temat użycia final w metodzie zarówno jako zmienna w bloku metody jak i parametr w sygnaturze. Google pozostawia kwestie otwartą. Z jednej strony final w dłuższej metodzie dla zmiennej jest wskazaniem dla użytkownika i nie zmusza go do chodzenia po kodzie i sprawdzania. Z drugiej nie ciekawie wygląda. Jak wybierzemy opcję, że w długich metodach piszemy, a w krótkich nie to narażamy się na opinie bycia niekonsekwentnym. Z kolei jako parametr, sam nie wiem. Raczej należy unikać inicjowania w bloku metody parametru nowymi wartościami, więc po co final w ogóle. Pomijam fakt, iż są wyjątkowe sytuacje wpływające dość wyraźnie na performancę (jak np konkatenacja stringów z final jako zmienna), kod optymalizowany i tak jest brzydki.
https://stackoverflow.com/questions/4279420/does-use-of-final-keyword-in-java-improve-the-performance
Kiedyś czytałem że Doug Lea miał zwyczaj walenia wszędzie gdzie się da final - ale były to czasy mniej inteligentnych kompilatorów.
dla przykładu:

private void write(final FileObject file,
                   final Map.Entry<Boolean, List<String[]>> perFileData,
                   final List<String[]> elementData,
                   final int[] index) throws IOException {

    try (final BufferedWriter bufferedWriter = new BufferedWriter(file.openWriter())) {
        final boolean defaultBranching = perFileData.getKey();
        final BranchWritingProcedure<List<String[]>> procedure = getProcedures(bufferedWriter, elementData, index);

        if (defaultBranching) {
            procedure.proceedWithDefaultBranching(elementData);
        } else {
            procedure.proceedWithCustomBranching(elementData);
        }
    }
}

i bez

private void write(FileObject file,
                   Map.Entry<Boolean, List<String[]>> perFileData,
                   List<String[]> elementData,
                   int[] index) throws IOException {

      try (BufferedWriter bufferedWriter = new BufferedWriter(file.openWriter())) {
          boolean defaultBranching = perFileData.getKey();
          BranchWritingProcedure<List<String[]>> procedure = getProcedures(bufferedWriter, elementData, index);

          if (defaultBranching) {
              procedure.proceedWithDefaultBranching(elementData);
          } else {
              procedure.proceedWithCustomBranching(elementData);
          }
      }
  }
}

Jak wy to robicie? Gdzie leży złoty środek?

4
  1. ta dyskusja już była - użyj opcji szukaj
  2. final w javie w zasadzie gdziekolwiek ma dokładnie zerowy wpływ na optymalizację (na typowych jvmach)
  3. w czasach kiedy w ogóle używałem zmiennych to używałem też nagminnie final, żeby jednak podkreślić, że mam jakieś "stałe" (referencje)
  4. na szczęśćie obecnie nie piszę w javie, ale pewnie by już mi zwisało - po prostu przyjmuje, że wszyscy wiedzą, że jak mam jakiś var czy inną deklarację to jest to efektywnie final.
0

Rozumiem że efektywnie final dla Twojego zespołu.
https://openjdk.org/projects/amber/guides/lvti-faq#Q3
Wyszukałem, przeczytałem...zostanę przy Goetz i Blochu

1

Głównie to wykorzystuje przy zmiennych by było wiadome co jest mutowalne a co nie, ale nigdy chyba nie robiłem final parametrów, bo to w sumie nie ma sensu większego skoro nadpisywanie ich samo w sobie jest bez sensu

0

NIestety znajda się tacy co nadpisują.... (niestety widziałem, ciężko potem się tłumaczy że to złe podejście) :(

0

Temat poruszany wielokrotnie: Wszechobecny final na zmiennych

1 użytkowników online, w tym zalogowanych: 0, gości: 1