Jak wspomniano, final
jest używany z metodą Java, aby zaznaczyć, że metody nie można przesłonić (w przypadku zakresu obiektu) ani ukryć (w przypadku statycznego). Pozwala to pierwotnemu programiście tworzyć funkcje, których nie można zmienić za pomocą podklas i to jest cała gwarancja, jaką zapewnia.
Oznacza to, że jeśli metoda opiera się na innych konfigurowalnych składnikach, takich jak niepubliczne pola / metody, funkcjonalność ostatecznej metody może nadal być dostosowywana. Jest to jednak dobre, ponieważ (w przypadku polimorfizmu) umożliwia częściowe dostosowanie.
Istnieje wiele powodów, dla których nie można dostosowywać czegoś, w tym:
Wydajność - niektóre kompilatory mogą analizować i optymalizować działanie, zwłaszcza bez skutków ubocznych.
Uzyskaj hermetyzowane dane - spójrz na niezmienne obiekty, w których ich atrybuty są ustawione w czasie budowy i nigdy nie powinny być zmieniane. Lub obliczona wartość uzyskana z tych atrybutów. Dobrym przykładem jest String
klasa Java .
Niezawodność zamówienia i - przedmioty składają się z pierwotnych ( int
, char
, double
, etc.) i / lub inne obiekty. Nie wszystkie operacje mające zastosowanie do tych komponentów powinny być możliwe do zastosowania, a nawet logiczne, gdy są używane w większym obiekcie. final
Aby to zapewnić, można użyć metod z modyfikatorem. Klasa Counter jest dobrym przykładem.
public class Counter {
private int counter = 0;
public final int count() {
return counter++;
}
public final int reset() {
return (counter = 0);
}
}
Jeśli public final int count()
metoda nie jest final
, możemy zrobić coś takiego:
Counter c = new Counter() {
public int count() {
super.count();
return super.count();
}
}
c.count(); // now count 2
Lub coś w tym stylu:
Counter c = new Counter() {
public int count() {
int lastCount = 0;
for (int i = super.count(); --i >= 0; ) {
lastCount = super.count();
}
return lastCount;
}
}
c.count(); // Now double count
Przede wszystkim możesz oznaczyć nieabstrakcyjne klasy
final
oraz pola i metody. W ten sposób cała klasa nie może być podklasą. Zatem zachowanie klasy zostanie naprawione.Zgadzam się, że metody oznaczania
final
nie gwarantują, że ich zachowanie będzie takie samo w podklasach, jeśli te metody wywołują metody nieostateczne. Jeśli zachowanie rzeczywiście wymaga naprawy, należy to osiągnąć poprzez konwencję i staranny projekt. I nie zapomnij o tym w javadoc! (Dokumentacja java)Wreszcie,
final
słowo kluczowe odgrywa bardzo ważną rolę w Java Memory Model (JMM). JMM gwarantuje, że do uzyskania widocznościfinal
pól nie jest wymagana odpowiednia synchronizacja. Na przykład:źródło
String
, ale w klasach zdefiniowanych przez użytkownika). Ale to, co powiedziałeś o „finale nie gwarantuje zachowania”, jest dokładnie moim celem. Zgadzam się, dokumentacja i projekt są ważne.final
co nie zapewni widoczności zmian wprowadzonych w obiektach złożonych, takich jakMap
.Nie jestem pewien, czy możesz poczynić jakiekolwiek zapewnienia na temat użycia terminu „wersja ostateczna” i jaki ma to wpływ na ogólną umowę projektową oprogramowania. Masz gwarancję, że żaden programista nie może zastąpić tej metody i unieważnić w ten sposób swojej umowy. Z drugiej strony, ostatnia metoda może polegać na zmiennych klasowych lub instancji, których wartości są ustawiane przez podklasy, i może wywoływać inne metody klas, które są nadpisywane. Tak więc finał jest co najwyżej bardzo słabą gwarancją.
źródło
const
. Jak wchar const * const = "Hello"
lubchar const * const addName(char const * const name) const
...Nie, to nie jest poza wpływem autora zajęć. Nie możesz go przesłonić w swojej klasie pochodnej, dlatego zrobi to, co zamierzał autor klasy bazowej.
http://download.oracle.com/javase/tutorial/java/IandI/final.html
Warto zwrócić uwagę na część, w której sugeruje, że powinny być metody wywoływane z konstruktorów
final
.źródło