Odpowiedzi:
final
Kluczowe ma kilka zwyczajów w Javie. Odpowiada zarówno słowom kluczowym, jak sealed
i readonly
słowom kluczowym w języku C #, w zależności od kontekstu, w którym jest używany.
Aby zapobiec podklasom (dziedziczeniu po zdefiniowanej klasie):
Jawa
public final class MyFinalClass {...}
DO#
public sealed class MyFinalClass {...}
Zapobiegaj zastąpieniu virtual
metody.
Jawa
public class MyClass
{
public final void myFinalMethod() {...}
}
DO#
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
Jak zauważa Joachim Sauer, zauważalną różnicą między tymi dwoma językami jest to, że Java domyślnie oznacza wszystkie metody niestatyczne jako virtual
, natomiast C # oznacza je jako sealed
. Dlatego też musisz użyć sealed
słowa kluczowego w języku C #, jeśli chcesz zatrzymać dalsze zastępowanie metody, która została wyraźnie oznaczona virtual
w klasie bazowej.
Aby umożliwić przypisanie zmiennej tylko raz:
Jawa
public final double pi = 3.14; // essentially a constant
DO#
public readonly double pi = 3.14; // essentially a constant
Na marginesie, efekt readonly
słowa kluczowego różni się od const
słowa kluczowego tym, że readonly
wyrażenie jest oceniane w czasie wykonywania, a nie w czasie kompilacji , co pozwala na dowolne wyrażenia.
readonly
zmienne składowe mogą być modyfikowane w konstruktorach: pastebin.com/AzqzYGiA
To zależy od kontekstu.
final
klasy lub metody odpowiednikiem C # jestsealed
.final
pola odpowiednikiem C # jestreadonly
.final
zmiennej lokalnej lub parametru metody nie ma bezpośredniego odpowiednika C #.For a final local variable or method parameter, there's no direct C# equivalent
ogromne wyróżnienie.
const
można stosować tylko w przypadku typów wartości. O ile mi wiadomo, nie ma sposobu, aby stworzyć efektywną stałą dla lokalnego typu odniesienia.
To, czego tu wszyscy brakuje, to gwarancja Java dla definitywnego przypisania ostatecznych zmiennych składowych.
W przypadku klasy C z końcową zmienną składową V każda możliwa ścieżka wykonania przez każdego konstruktora C musi przypisać V dokładnie jeden raz - niepowodzenie przypisania V lub przypisanie V dwa lub więcej razy spowoduje błąd.
Słowo kluczowe readonly w C # nie ma takiej gwarancji - kompilator chętnie pozostawia członków readonly nieprzypisanymi lub pozwala ci przypisywać je wielokrotnie w konstruktorze.
Zatem ostateczny i tylko do odczytu (przynajmniej w odniesieniu do zmiennych składowych) zdecydowanie nie są równoważne - końcowy jest znacznie bardziej rygorystyczny.
Jak wspomniano, sealed
jest odpowiednikiem final
metod i klas.
Jeśli chodzi o resztę, jest to skomplikowane.
W przypadku static final
pól static readonly
jest to najbliższa możliwa rzecz. Pozwala na inicjalizację pola statycznego w konstruktorze statycznym, który jest dość podobny do statycznego inicjalizatora w Javie. Dotyczy to zarówno stałych (prymitywów i obiektów niezmiennych), jak i stałych odniesień do obiektów zmiennych.
const
Modyfikator jest dość podobna do stałych, ale nie można ustawić je w konstruktorze statycznym.
readonly
Można użyć pola, które nie powinno zostać ponownie przypisane po opuszczeniu konstruktora . Nie jest jednak równy - final
wymaga dokładnie jednego przypisania, nawet w konstruktorze lub inicjalizatorze.Nie ma odpowiednika C # dla final
zmiennej lokalnej, o której wiem. Jeśli zastanawiasz się, dlaczego ktokolwiek miałby go potrzebować: możesz zadeklarować zmienną przed if-else, skrzynką lub tym podobnym. Deklarując to jako ostateczne, egzekwujesz, że jest on przypisany maksymalnie raz.
Zasadniczo zmienne lokalne Java muszą zostać przypisane przynajmniej raz przed ich odczytaniem. O ile gałąź nie wyskoczy przed odczytaniem wartości, zmienna końcowa jest przypisywana dokładnie raz. Wszystko to sprawdzane jest podczas kompilacji. Wymaga to dobrze zachowującego się kodu z mniejszym marginesem błędu.
Podsumowując, C # nie ma bezpośredniego odpowiednika final
. Podczas gdy Java nie posiada kilku fajnych funkcji C #, dla mnie jako odświeżającego programisty Javy jest to odświeżenie, aby zobaczyć, gdzie C # nie zapewnia odpowiednika.
Ostateczne klasy Java i końcowe metody -> zapieczętowane. Ostateczna zmienna elementu Java -> tylko do odczytu dla stałej czasu wykonywania, const dla stałej czasu kompilacji.
Brak odpowiednika dla ostatecznej zmiennej lokalnej i argumentu końcowego metody
Stałe C # deklarowane są za pomocą słowa kluczowego const dla stałych kompilacyjnych lub słowa kluczowego readonly dla stałych wykonawczych. Semantyka stałych jest taka sama zarówno w językach C #, jak i Java.