Respostas:
A final
palavra-chave tem vários usos em Java. Corresponde às palavras sealed
- readonly
chave e em C #, dependendo do contexto em que é usada.
Para impedir a subclassificação (herança da classe definida):
Java
public final class MyFinalClass {...}
C #
public sealed class MyFinalClass {...}
Impedir a substituição de um virtual
método.
Java
public class MyClass
{
public final void myFinalMethod() {...}
}
C #
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
Como Joachim Sauer aponta, uma diferença notável entre as duas linguagens aqui é que Java, por padrão, marca todos os métodos não estáticos como virtual
, enquanto C # os marca como sealed
. Portanto, você só precisa usar a sealed
palavra - chave em C # se desejar interromper a substituição de um método que foi explicitamente marcado virtual
na classe base.
Para permitir que uma variável seja atribuída apenas uma vez:
Java
public final double pi = 3.14; // essentially a constant
C #
public readonly double pi = 3.14; // essentially a constant
Como observação lateral, o efeito da readonly
palavra - chave difere do efeito da palavra- const
chave, pois a readonly
expressão é avaliada em tempo de execução, em vez de em tempo de compilação , permitindo expressões arbitrárias.
readonly
variáveis de membro podem ser modificadas em construtores: pastebin.com/AzqzYGiA
Depende do contexto.
final
classe ou método, o equivalente em C # ésealed
.final
campo, o equivalente em C # éreadonly
.final
variável local ou parâmetro de método, não há equivalente C # direto.For a final local variable or method parameter, there's no direct C# equivalent
uma enorme distinção.
const
só pode ser usado em tipos de valor. Tanto quanto sei, não há como fazer uma constante efetiva para um tipo de referência local.
O que todo mundo está perdendo é a garantia de Java de atribuição definitiva para variáveis de membro final.
Para uma classe C com variável de membro final V, todo caminho de execução possível através de cada construtor de C deve atribuir V exatamente uma vez - deixar de atribuir V ou atribuir V duas ou mais vezes resultará em erro.
A palavra-chave readonly do C # não tem essa garantia - o compilador fica mais do que feliz em deixar os membros readonly não atribuídos ou permitir que você os atribua várias vezes em um construtor.
Portanto, final e somente leitura (pelo menos em relação às variáveis-membro) definitivamente não são equivalentes - final é muito mais rigoroso.
Como mencionado, sealed
é equivalente final
a métodos e classes.
Quanto ao resto, é complicado.
Para static final
campos, static readonly
é a coisa mais próxima possível. Ele permite que você inicialize o campo estático em um construtor estático, que é bastante semelhante ao inicializador estático em Java. Isso se aplica a constantes (objetos primitivos e imutáveis) e a referências constantes a objetos mutáveis.
O const
modificador é bastante semelhante para constantes, mas você não pode defini-las em um construtor estático.
readonly
pode ser usado. Porém, não é igual - final
requer exatamente uma atribuição, mesmo no construtor ou inicializador.Não há C # equivalente para uma final
variável local que eu conheça. Se você está se perguntando por que alguém precisaria dela: é possível declarar uma variável antes de um if-else, caso de mudança ou mais. Ao declarar final, você aplica que ele seja atribuído no máximo uma vez.
As variáveis locais Java em geral devem ser designadas pelo menos uma vez antes de serem lidas. A menos que o ramo salte antes da leitura do valor, uma variável final é atribuída exatamente uma vez. Tudo isso é verificado em tempo de compilação. Isso requer um código bem comportado com menos margem para um erro.
Resumindo, o C # não tem equivalente direto de final
. Embora o Java não tenha alguns recursos interessantes do C #, é refrescante para mim, como programador Java, ver onde o C # falha em fornecer um equivalente.
Final da classe Java e método final -> selado. Variável de membro Java final -> somente leitura para constante de tempo de execução, const para constante de tempo de compilação.
Sem equivalente para variável local final e argumento de método final
As constantes C # são declaradas usando a palavra-chave const para constantes de tempo de compilação ou a palavra-chave readonly para constantes de tempo de execução. A semântica das constantes é a mesma nas linguagens C # e Java.