Po przeczytaniu ukrytych funkcji języka C # zastanawiałem się, jakie są niektóre z ukrytych funkcji Java?
295
Po przeczytaniu ukrytych funkcji języka C # zastanawiałem się, jakie są niektóre z ukrytych funkcji Java?
Odpowiedzi:
Inicjacja Double Brace zaskoczyła mnie kilka miesięcy temu, kiedy ją odkryłem, nigdy wcześniej o niej nie słyszałem.
ThreadLocals zazwyczaj nie są tak powszechnie znane jako sposób przechowywania stanu poszczególnych wątków.
Ponieważ JDK 1.5 Java ma wyjątkowo dobrze zaimplementowane i niezawodne narzędzia do współbieżności poza blokadami, znajdują się one w java.util.concurrent, a szczególnie interesującym przykładem jest java.util.concurrent.atomic podpakiet zawierający bezpieczne dla wątków operacje podstawowe, które implementują porównanie -i-swap operacji i może mapować do rzeczywistych obsługiwanych sprzętowo wersji tych operacji.
źródło
Łączna zmienność parametru typu:
Na przykład, jeśli chcesz wziąć parametr, który jest zarówno Porównywalny, jak i Kolekcja:
Ta wymyślona metoda zwraca wartość true, jeśli dwie podane kolekcje są równe lub jeśli jedna z nich zawiera dany element, w przeciwnym razie fałsz. Należy zauważyć, że można wywoływać metody zarówno Porównywalne, jak i Kolekcji na argumentach b1 i b2.
źródło
Byłem zaskoczony inicjatorami instancji innego dnia. Usunąłem niektóre złożone metody i ostatecznie utworzyłem wiele inicjatorów instancji:
Wykonanie
main
metody wyświetli:Sądzę, że byłyby przydatne, gdybyś miał wiele konstruktorów i potrzebował wspólnego kodu
Zapewniają również cukier składniowy do inicjowania twoich zajęć:
źródło
JDK 1.6_07 + zawiera aplikację o nazwie VisualVM (bin / jvisualvm.exe), która jest przyjemnym GUI na wielu narzędziach. Wydaje się bardziej wszechstronny niż JConsole.
źródło
Dzikie karty Classpath od Java 6.
Zamiast
Zobacz http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html
źródło
Dla większości osób, z którymi przeprowadzam wywiady dla stanowisk programistów Java, bloki oznaczone jako zaskakujące. Oto przykład:
Kto powiedział, że
goto
w java to tylko słowo kluczowe? :)źródło
A co z typami zwrotów kowariantnych które obowiązywały od JDK 1.5? Jest dość słabo nagłośniony, ponieważ jest nieprzyzwoitym dodatkiem, ale jak rozumiem, jest absolutnie niezbędny do działania leków generycznych.
Zasadniczo kompilator pozwala teraz podklasie zawęzić typ zwracany przez przesłoniętą metodę, aby była podklasą typu zwracanego przez oryginalną metodę. Jest to dozwolone:
Możesz wywołać
values
metodę podklasy i otrzymać posortowany wątek bezpiecznySet
odString
s bez konieczności rzutowania doConcurrentSkipListSet
.źródło
Przeniesienie kontroli w bloku ostatecznie odrzuca każdy wyjątek. Poniższy kod nie zgłasza wyjątku RuntimeException - został utracony.
From http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html
źródło
Nie widziałem, żeby ktoś wspominał wystąpienie implementacji w taki sposób, że sprawdzanie wartości null nie jest konieczne.
Zamiast:
po prostu użyj:
źródło
free
ing lubdelete
ing w C / C ++. Taka podstawowa koncepcja.Zezwalanie na metody i konstruktorów w wyliczeniach zaskoczyło mnie. Na przykład:
Możesz nawet mieć „stałe określone ciało klasy”, które pozwala określonej wartości wyliczeniowej zastąpić metody.
Więcej dokumentacji tutaj .
źródło
mAge
powinien być ostateczny. Rzadko jest powód, dla którego nieumiejętności są w wyliczeniach.Parametry typu dla metod ogólnych można jawnie określić w następujący sposób:
źródło
public static <T> T foo(T t)
. Możesz wtedy dzwonić doClass.<Type>foo(t);
return set1.equals(set2) ? new ArrayList<String>(set1) : Collections.<String>emptyList()
. Przydaje się również w przypadku niektórych wywołań metod, w których prosta kolekcja.emptyMap () dawałaby błąd kompilacji.Możesz użyć wyliczeń, aby zaimplementować interfejs.
EDYCJA: Lata później ....
Korzystam z tej funkcji tutaj
https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/vanilla/java/affinity/AffinityStrategies.java
Korzystając z interfejsu, programiści mogą definiować własne strategie. Za pomocą
enum
środków mogę zdefiniować kolekcję (pięciu) wbudowanych.źródło
Począwszy od Java 1.5, Java ma teraz znacznie bardziej przejrzystą składnię do pisania funkcji o różnym arity. Zamiast więc przekazywać tablicę, teraz możesz wykonać następujące czynności
słupki są automatycznie konwertowane na tablicę określonego typu. Nie jest to wielka wygrana, ale mimo to wygrana.
źródło
Moje ulubione: zrzuć wszystkie ślady stosu nici na standardowe wyjście.
windows: CTRL- Breakw twoim oknie Java CdD / konsoli
unix:
kill -3 PID
źródło
Break
klawisz.Kilka osób napisało o inicjatorach instancji, oto dobre zastosowanie:
To szybki sposób na inicjalizację map, jeśli robisz coś szybko i prosto.
Lub używając go do stworzenia prototypu szybkiej ramy wychylnej:
Oczywiście można go nadużywać:
źródło
Dynamiczne proxy (dodane w 1.3) pozwalają zdefiniować nowy typ w czasie wykonywania, który jest zgodny z interfejsem. Przydaje się zaskakująco wiele razy.
źródło
ostateczna inicjalizacja może zostać odroczona.
Zapewnia to, że nawet przy złożonym przepływie logiki zwracane są zawsze wartości. Zbyt łatwo przeoczyć skrzynkę i przez przypadek zwrócić wartość zerową. Nie uniemożliwia powrotu wartości null, po prostu oczywiste, że jest to celowe:
źródło
Myślę, że inną „przeoczoną” cechą Java jest sama JVM. Jest to prawdopodobnie najlepsza dostępna maszyna wirtualna. Obsługuje wiele interesujących i przydatnych języków (Jython, JRuby, Scala, Groovy). Wszystkie te języki mogą łatwo i bezproblemowo współpracować.
Jeśli projektujesz nowy język (jak w przypadku Scala), natychmiast dostępne są wszystkie istniejące biblioteki, a zatem Twój język jest „użyteczny” od samego początku.
Wszystkie te języki korzystają z optymalizacji HotSpot. Maszyna wirtualna jest bardzo dobrze monitorowana i debugowana.
źródło
Możesz zdefiniować anonimową podklasę i bezpośrednio wywołać na niej metodę, nawet jeśli nie implementuje ona żadnych interfejsów.
źródło
start()
) nie jest tak naprawdę zdefiniowana w podklasie ...AsList metoda
java.util.Arrays
umożliwia połączenie miłe z varargs, metod generycznych i autoboxing:źródło
Arrays.asList
Ma niezwykłą cechę, że możnaset()
elementy, ale nieadd()
bądźremove()
. Więc zwykle zawijam go w anew ArrayList(...)
lub aCollections.unmodifiableList(...)
, w zależności od tego, czy chcę modyfikować listę, czy nie.Użycie tego słowa kluczowego do uzyskania dostępu do pól / metod zawierających klasę z klasy wewnętrznej. W poniższym, raczej wymyślonym przykładzie, chcemy użyć pola sortAscending klasy kontenera od anonimowej klasy wewnętrznej. Używanie ContainerClass.this.sortAscending zamiast this.sortAscending załatwia sprawę.
źródło
MyActivity.this
.Nie jest to właściwie funkcja, ale zabawna sztuczka, którą odkryłem niedawno na jakiejś stronie internetowej:
jest poprawnym programem Java (chociaż generuje ostrzeżenie). Jeśli nie rozumiesz dlaczego, zobacz odpowiedź Gregory'ego! ;-) Podświetlanie składni również daje wskazówkę!
źródło
Nie są to do końca „ukryte funkcje” i nie są bardzo przydatne, ale w niektórych przypadkach mogą być niezwykle interesujące:
Klasa sun.misc.Unsafe - pozwoli ci wdrożyć bezpośrednie zarządzanie pamięcią w Javie (możesz nawet napisać samomodyfikujący się kod Java za pomocą jeśli dużo próbujesz):
źródło
Podczas pracy w Swing lubię ukryte Ctrl- Shift-F1 funkcja .
Zrzuca drzewo komponentów bieżącego okna.
(Zakładając, że nie związałeś tego naciśnięcia klawisza z czymś innym).
źródło
Każdy plik klasy zaczyna się od wartości szesnastkowej 0xCAFEBABE celu zidentyfikowania go jako prawidłowego kodu bajtowego JVM.
( Wyjaśnienie )
źródło
Głosuję na java.util.concurrent z jego równoległymi kolekcjami i elastycznymi programami wykonawczymi, umożliwiającymi między innymi pule wątków, zaplanowane zadania i skoordynowane zadania. DelayQueue jest moim osobistym ulubieńcem, w którym elementy są udostępniane po określonym czasie.
java.util.Timer i TimerTask można bezpiecznie zatrzymać.
Nie do końca ukryte, ale w innym pakiecie niż inne klasy związane z datą i godziną. java.util.concurrent.TimeUnit jest przydatny podczas konwersji między nanosekundami, mikrosekundami, milisekundami i sekundami.
Czyta o wiele lepiej niż zwykle someValue * 1000 lub someValue / 1000.
źródło
CountDownLatch
iCyclicBarrier
- bardzo przydatne!Słowo kluczowe aser na poziomie języka .
źródło
W rzeczywistości nie jest częścią języka Java, ale dezasembler javap dostarczany z JDK firmy Sun nie jest powszechnie znany ani używany.
źródło
Dodanie konstrukcji pętli dla każdego w 1.5. <3 to.
I może być używany w instancjach zagnieżdżonych:
Konstrukcja for-each ma również zastosowanie do tablic, w których ukrywa zmienną indeksu zamiast iteratora. Poniższa metoda zwraca sumę wartości w tablicy int:
Link do dokumentacji Sun
źródło
i
tutaj jest bardzo mylące, ponieważ większość ludzi oczekuje, że będę indeksem, a nie elementem tablicy.osobiście odkryłem
java.lang.Void
bardzo późno - poprawia czytelność kodu w połączeniu z generycznymi, npCallable<Void>
źródło