Depois de ler os Recursos ocultos do C # , perguntei-me: Quais são alguns dos recursos ocultos do Java?
295
Depois de ler os Recursos ocultos do C # , perguntei-me: Quais são alguns dos recursos ocultos do Java?
Respostas:
A inicialização com cinta dupla me pegou de surpresa alguns meses atrás, quando eu a descobri, nunca tinha ouvido falar antes.
ThreadLocals normalmente não são tão amplamente conhecidos como uma maneira de armazenar o estado por thread.
Como o JDK 1.5 Java possui ferramentas de simultaneidade extremamente bem implementadas e robustas além de apenas bloqueios, elas vivem em java.util.concurrent e um exemplo especificamente interessante é o subpacote java.util.concurrent.atomic que contém primitivas seguras para threads que implementam a comparação operação de swap e pode mapear para versões suportadas por hardware nativas reais dessas operações.
fonte
União de junta na variação do parâmetro de tipo:
Por exemplo, se você quiser usar um parâmetro comparável e uma coleção:
Esse método artificial retorna true se as duas coleções fornecidas forem iguais ou se uma delas contiver o elemento especificado, caso contrário, false. O ponto a ser observado é que você pode invocar métodos de Comparable e Collection nos argumentos b1 e b2.
fonte
Fiquei surpreso com os inicializadores de instância outro dia. Eu estava excluindo alguns métodos dobrados em código e acabei criando vários inicializadores de instância:
A execução do
main
método exibirá:Eu acho que isso seria útil se você tivesse vários construtores e precisasse de código comum
Eles também fornecem açúcar sintático para inicializar suas aulas:
fonte
O JDK 1.6_07 + contém um aplicativo chamado VisualVM (bin / jvisualvm.exe) que é uma boa interface gráfica do usuário em cima de muitas das ferramentas. Parece mais abrangente que o JConsole.
fonte
Curingas de caminho de classe desde o Java 6.
Ao invés de
Consulte http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html
fonte
Para a maioria das pessoas que entrevisto para posições de desenvolvedor Java, os blocos rotulados são muito surpreendentes. Aqui está um exemplo:
Quem disse
goto
em java é apenas uma palavra-chave? :)fonte
E quanto aos tipos de retorno covariantes existentes desde o JDK 1.5? É muito pouco divulgado, pois é uma adição pouco sexy, mas, pelo que entendi, é absolutamente necessário para os genéricos funcionarem.
Essencialmente, o compilador agora permite que uma subclasse restrinja o tipo de retorno de um método substituído a uma subclasse do tipo de retorno do método original. Portanto, isso é permitido:
Você pode chamar o
values
método da subclasse e obter um thread classificado a salvoSet
deString
s sem precisar converter para oConcurrentSkipListSet
.fonte
A transferência de controle em um bloco finalmente descarta qualquer exceção. O código a seguir não gera RuntimeException - ele está perdido.
From http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html
fonte
Ninguém viu menção de instância de implementação, de forma que a verificação de nulo não é necessária.
Ao invés de:
Apenas use:
fonte
free
entrar oudelete
entrar em C / C ++. Um conceito tão fundamental.Permitir métodos e construtores em enums me surpreendeu. Por exemplo:
Você pode até ter um "corpo de classe específico constante" que permite que um valor de enum específico substitua métodos.
Mais documentação aqui .
fonte
mAge
deve ser final. Raramente existe uma razão para os campos não finais nas enumerações.Os parâmetros de tipo para métodos genéricos podem ser especificados explicitamente da seguinte maneira:
fonte
public static <T> T foo(T t)
. Você pode fazer chamadas paraClass.<Type>foo(t);
return set1.equals(set2) ? new ArrayList<String>(set1) : Collections.<String>emptyList()
. Também é útil para algumas invocações de métodos em que um simples Collections.emptyMap () causaria um erro de compilação.Você pode usar enumerações para implementar uma interface.
EDIT: Anos depois ....
Eu uso esse recurso aqui
https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/vanilla/java/affinity/AffinityStrategies.java
Usando uma interface, os desenvolvedores podem definir suas próprias estratégias. Usando um
enum
meio, posso definir uma coleção (de cinco) incorporada.fonte
A partir do Java 1.5, o Java agora possui uma sintaxe muito mais limpa para escrever funções de variável variável. Então, em vez de apenas passar uma matriz, agora você pode fazer o seguinte
barras é automaticamente convertida em matriz do tipo especificado. Não é uma vitória enorme, mas mesmo assim uma vitória.
fonte
Meu favorito: despejar todos os rastreamentos da pilha de threads para o padrão.
windows: CTRL- Breakna janela java cmd / console
unix:
kill -3 PID
fonte
Break
tecla.Algumas pessoas postaram sobre inicializadores de instância, eis um bom uso para isso:
É uma maneira rápida de inicializar mapas se você estiver apenas fazendo algo rápido e simples.
Ou use-o para criar um protótipo de quadro de giro rápido:
Claro que pode ser abusado:
fonte
Proxies dinâmicos (adicionados em 1.3) permitem definir um novo tipo em tempo de execução que esteja em conformidade com uma interface. É útil um número surpreendente de vezes.
fonte
a inicialização final pode ser adiada.
Ele garante que mesmo com um fluxo complexo de valores de retorno lógicos sejam sempre definidos. É muito fácil perder um caso e retornar nulo por acidente. Não torna impossível retornar nulo, apenas óbvio que é de propósito:
fonte
Eu acho que outro recurso "esquecido" do java é a própria JVM. É provavelmente a melhor VM disponível. E suporta muitas linguagens interessantes e úteis (Jython, JRuby, Scala, Groovy). Todos esses idiomas podem cooperar com facilidade e facilidade.
Se você cria um novo idioma (como no caso de scala), imediatamente tem todas as bibliotecas disponíveis e, portanto, seu idioma é "útil" desde o início.
Todos esses idiomas fazem uso das otimizações do HotSpot. A VM é muito bem monitorada e depurável.
fonte
Você pode definir uma subclasse anônima e chamar diretamente um método, mesmo que não implemente interfaces.
fonte
start()
) não está realmente definido na subclasse ...O método asList in
java.util.Arrays
permite uma boa combinação de varargs, métodos genéricos e caixa automática:fonte
Arrays.asList
tem o recurso incomum que você podeset()
elementos, mas nãoadd()
ouremove()
. Por isso, costumo envolvê-lo em umnew ArrayList(...)
ou em umCollections.unmodifiableList(...)
, dependendo se quero ou não a lista modificável.Usando esta palavra - chave para acessar campos / métodos de conter classe de uma classe interna. No exemplo abaixo, bastante artificial, queremos usar o campo sortAscending da classe de contêiner da classe interna anônima. Usar ContainerClass.this.sortAscending em vez de this.sortAscending faz o truque.
fonte
MyActivity.this
.Não é realmente um recurso, mas um truque divertido que descobri recentemente em algumas páginas da Web:
é um programa Java válido (embora gere um aviso). Se você não vê o porquê, veja a resposta de Gregory! ;-) Bem, o destaque da sintaxe aqui também dá uma dica!
fonte
Isso não é exatamente "recursos ocultos" e não é muito útil, mas pode ser extremamente interessante em alguns casos:
Classe sun.misc.Unsafe - permitirá implementar o gerenciamento direto de memória em Java (você pode até escrever código Java auto-modificável com isso se você tentar muito):
fonte
Ao trabalhar no Swing, eu gosto do oculto Ctrl- Shift-F1 recurso.
Despeja a árvore de componentes da janela atual.
(Supondo que você não tenha vinculado essa tecla a outra coisa.)
fonte
Todo arquivo de classe começa com o valor hexadecimal 0xCAFEBABE para identificá-lo como bytecode válido da JVM.
( Explicação )
fonte
Meu voto vai para java.util.concurrent, com suas coleções simultâneas e executores flexíveis, permitindo, entre outros, conjuntos de threads, tarefas agendadas e tarefas coordenadas. O DelayQueue é meu favorito pessoal, onde os elementos são disponibilizados após um atraso especificado.
java.util.Timer e TimerTask podem ser colocados com segurança em repouso.
Além disso, não exatamente oculto, mas em um pacote diferente das outras classes relacionadas à data e hora. java.util.concurrent.TimeUnit é útil ao converter entre nanossegundos, microssegundos, milissegundos e segundos.
Ele lê muito melhor que o usual someValue * 1000 ou someValue / 1000.
fonte
CountDownLatch
eCyclicBarrier
- tão útil!Palavra- chave de afirmação no nível do idioma .
fonte
Não é realmente parte da linguagem Java, mas o desmontador javap que acompanha o JDK da Sun não é amplamente conhecido ou usado.
fonte
A adição da construção de loop for-each em 1.5. Eu <3.
E pode ser usado em instâncias aninhadas:
A construção for-each também é aplicável a matrizes, onde oculta a variável index em vez do iterador. O método a seguir retorna a soma dos valores em uma matriz int:
Link para a documentação da Sun
fonte
i
aqui é super confuso, pois a maioria das pessoas espera que eu seja um índice e não o elemento da matriz.eu descobri pessoalmente
java.lang.Void
muito tarde - melhora a legibilidade do código em conjunto com os genéricos, por exemploCallable<Void>
fonte