Java의 숨겨진 기능
C#의 숨겨진 특징들을 읽고 나는 자바의 숨겨진 특징에는 어떤 것들이 있을까 궁금했다.
Double Brace Initialization은 몇 달 전 처음 발견했을 때 정말 놀라웠어요.
ThreadLocals는 일반적으로 스레드 단위의 상태를 저장하는 방법으로 널리 알려져 있지 않습니다.
JDK 1.5 Java는 단순히 잠금을 넘어 매우 잘 구현되고 강력한 동시성 도구를 가지고 있기 때문에 java.util.concurrent에 존재하며 특히 흥미로운 예는 비교 및 스왑 작업을 구현하고 실제 네이티브 하드웨어에 매핑할 수 있는 스레드 세이프 프리미티브를 포함하는 java.util.concurrent.atic 서브패키지입니다.d버전의 조작을 참조해 주세요.
유형 모수 분산의 결합 결합:
public class Baz<T extends Foo & Bar> {}
예를 들어 Comparible과 Collection 모두인 매개 변수를 사용하려는 경우:
public static <A, B extends Collection<A> & Comparable<B>>
boolean foo(B b1, B b2, A a) {
return (b1.compareTo(b2) == 0) || b1.contains(a) || b2.contains(a);
}
이 조작된 메서드는 지정된 두 컬렉션이 동일하거나 둘 중 하나에 지정된 요소가 포함되어 있으면 true를 반환하고 그렇지 않으면 false를 반환합니다.주의할 점은 인수 b1과 b2에서 Comparible과 Collection의 메서드를 모두 호출할 수 있다는 것입니다.
얼마 전 인스턴스 이니셜라이저에 깜짝 놀랐어요.코드폴드 메서드를 삭제하다가 여러 인스턴스 이니셜라이저를 생성하게 되었습니다.
public class App {
public App(String name) { System.out.println(name + "'s constructor called"); }
static { System.out.println("static initializer called"); }
{ System.out.println("instance initializer called"); }
static { System.out.println("static initializer2 called"); }
{ System.out.println("instance initializer2 called"); }
public static void main( String[] args ) {
new App("one");
new App("two");
}
}
의 실행main
과 같이 표시됩니다.
static initializer called
static initializer2 called
instance initializer called
instance initializer2 called
one's constructor called
instance initializer called
instance initializer2 called
two's constructor called
여러 개의 컨스트럭터가 있고 공통 코드가 필요한 경우 도움이 될 것 같습니다.
그들은 또한 수업을 초기화하기 위한 통사당도 제공합니다.
List<Integer> numbers = new ArrayList<Integer>(){{ add(1); add(2); }};
Map<String,String> codes = new HashMap<String,String>(){{
put("1","one");
put("2","two");
}};
JDK 1.6_07+에는 VisualVM(bin/jvisualvm.exe)이라는 앱이 포함되어 있습니다.이 앱은 많은 툴과 함께 사용할 수 있습니다.J콘솔보다 더 포괄적으로 보입니다.
Java 6 이후 클래스 패스 와일드 카드
java -classpath ./lib/* so.Main
대신
java -classpath ./lib/log4j.jar:./lib/commons-codec.jar:./lib/commons-httpclient.jar:./lib/commons-collections.jar:./lib/myApp.jar so.Main
http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html 를 참조해 주세요.
Java 개발자 자리에 대해 인터뷰하는 대부분의 사람들에게 블록 레이블은 매우 놀랍습니다.다음은 예를 제시하겠습니다.
// code goes here
getmeout:{
for (int i = 0; i < N; ++i) {
for (int j = i; j < N; ++j) {
for (int k = j; k < N; ++k) {
//do something here
break getmeout;
}
}
}
}
그랬어?goto
java java java java java java :
JDK 1.5부터 시행되고 있는 공변 리턴 타입은 어떻습니까?그것은 꽤 빈약하게 홍보되어 있습니다.그것은 외설적인 추가이지만, 제가 이해하기로는 제네릭스가 작동하기 위해서는 절대적으로 필요합니다.
기본적으로, 컴파일러는 이제 오버라이드된 메서드의 반환 유형을 원래 메서드의 반환 유형의 하위 클래스로 좁히는 것을 허용합니다.따라서 이것은 허용됩니다.
class Souper {
Collection<String> values() {
...
}
}
class ThreadSafeSortedSub extends Souper {
@Override
ConcurrentSkipListSet<String> values() {
...
}
}
서브클래스의 라고 할 수 .values
sorted safe ( 스레드세이프)를 취득합니다.Set
String
다운캐스트를 하지 않고ConcurrentSkipListSet
.
최종적으로 블록 내의 제어권 이전은 예외를 모두 폐기합니다.다음 코드는 런타임을 슬로우하지 않습니다.예외 -- 손실되었습니다.
public static void doSomething() {
try {
//Normally you would have code that doesn't explicitly appear
//to throw exceptions so it would be harder to see the problem.
throw new RuntimeException();
} finally {
return;
}
}
http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html 에서
null을 확인할 필요가 없는 방식으로 구현되는 경우를 언급한 사람은 없습니다.
대신:
if( null != aObject && aObject instanceof String )
{
...
}
사용방법:
if( aObject instanceof String )
{
...
}
메서드와 컨스트럭터를 일괄적으로 허용하는 것은 나를 놀라게 했다.예를 들어 다음과 같습니다.
enum Cats {
FELIX(2), SHEEBA(3), RUFUS(7);
private int mAge;
Cats(int age) {
mAge = age;
}
public int getAge() {
return mAge;
}
}
특정 열거값을 사용하여 메서드를 재정의할 수 있는 "고정 클래스 본문"을 가질 수도 있습니다.
자세한 것은 이쪽.
일반 메서드의 유형 매개 변수는 다음과 같이 명시적으로 지정할 수 있습니다.
Collections.<String,Integer>emptyMap()
enum을 사용하여 인터페이스를 구현할 수 있습니다.
public interface Room {
public Room north();
public Room south();
public Room east();
public Room west();
}
public enum Rooms implements Room {
FIRST {
public Room north() {
return SECOND;
}
},
SECOND {
public Room south() {
return FIRST;
}
}
public Room north() { return null; }
public Room south() { return null; }
public Room east() { return null; }
public Room west() { return null; }
}
편집: 수년 후...
여기서 이 기능을 사용합니다.
public enum AffinityStrategies implements AffinityStrategy {
인터페이스를 사용함으로써 개발자는 자신의 전략을 정의할 수 있습니다.「」의 enum
1개의 빌트인 컬렉션을 정의할 수 있습니다.
Java 1.5를 기점으로 Java는 가변 특성 함수의 쓰기 구문을 훨씬 깔끔하게 만들었습니다.따라서 어레이만 전달하는 것이 아니라 다음 작업을 수행할 수 있습니다.
public void foo(String... bars) {
for (String bar: bars)
System.out.println(bar);
}
막대는 지정된 유형의 배열로 자동 변환됩니다.큰 승리는 아니지만 그래도 승리입니다.
마음에 드는 것은 모든 스레드 스택 트레이스를 덤프하여 표준화하는 것입니다.
windows:Break - Java cmd/module 창에서
unix:kill -3 PID
인스턴스 이니셜라이저에 대해 몇 사람이 글을 올렸습니다.이것에 대한 유용한 용도는 다음과 같습니다.
Map map = new HashMap() {{
put("a key", "a value");
put("another key", "another value");
}};
빠르고 간단한 작업을 수행할 경우 지도를 빠르게 초기화할 수 있습니다.
또는 빠른 스윙 프레임 프로토타입을 만드는 데 사용할 수 있습니다.
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.add( new JLabel("Hey there"){{
setBackground(Color.black);
setForeground( Color.white);
}});
panel.add( new JButton("Ok"){{
addActionListener( new ActionListener(){
public void actionPerformed( ActionEvent ae ){
System.out.println("Button pushed");
}
});
}});
frame.add( panel );
물론 악용될 수 있습니다.
JFrame frame = new JFrame(){{
add( new JPanel(){{
add( new JLabel("Hey there"){{
setBackground(Color.black);
setForeground( Color.white);
}});
add( new JButton("Ok"){{
addActionListener( new ActionListener(){
public void actionPerformed( ActionEvent ae ){
System.out.println("Button pushed");
}
});
}});
}});
}};
동적 프록시(1.3에 추가)를 사용하면 인터페이스에 적합한 새로운 유형을 런타임에 정의할 수 있습니다.그것은 놀랄 만큼 여러 번 유용하게 쓰였다.
최종 초기화를 연기할 수 있습니다.
복잡한 로직 흐름에서도 반환값이 항상 설정되도록 합니다.케이스를 놓치고 실수로 무효로 돌아오는 것은 너무 쉽다.null을 반환할 수 없게 만드는 것은 아닙니다.그냥 고의라는 것을 알 수 있습니다.
public Object getElementAt(int index) {
final Object element;
if (index == 0) {
element = "Result 1";
} else if (index == 1) {
element = "Result 2";
} else {
element = "Result 3";
}
return element;
}
java의 또 다른 "무시" 특징은 JVM 그 자체라고 생각합니다.이 VM은 아마도 사용 가능한 최고의 VM일 것입니다.또한 많은 흥미롭고 유용한 언어(Jython, JRuby, Scala, Groovy)를 지원합니다.그 모든 언어들은 쉽고 원활하게 협력할 수 있다.
새로운 언어(스칼라 케이스와 같이)를 설계하면 기존의 모든 라이브러리를 즉시 사용할 수 있으므로 언어가 처음부터 "유용"합니다.
이러한 모든 언어는 HotSpot 최적화를 사용합니다.VM은 매우 잘 감시되고 디버깅이 가능합니다.
어나니머스 서브클래스를 정의하고 인터페이스가 실장되어 있지 않은 경우에도 그 서브클래스에 직접 메서드를 호출할 수 있습니다.
new Object() {
void foo(String s) {
System.out.println(s);
}
}.foo("Hello");
의 asList 메서드java.util.Arrays
그럼 varargs, 범용 메서드 및 자동 박스를 적절히 조합할 수 있습니다.
List<Integer> ints = Arrays.asList(1,2,3);
내부 클래스의 클래스를 포함하는 필드 또는 메서드에 액세스하려면 이 키워드를 사용합니다.다음 예제에서는 익명의 내부 클래스에서 컨테이너 클래스의 sortAscending 필드를 사용합니다.이.sortAscending 대신 ContainerClass.this.sortAscending을 사용하면 효과가 있습니다.
import java.util.Comparator;
public class ContainerClass {
boolean sortAscending;
public Comparator createComparator(final boolean sortAscending){
Comparator comparator = new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
if (sortAscending || ContainerClass.this.sortAscending) {
return o1 - o2;
} else {
return o2 - o1;
}
}
};
return comparator;
}
}
기능은 아니지만 최근 웹 페이지에서 발견한 재미있는 속임수입니다.
class Example
{
public static void main(String[] args)
{
System.out.println("Hello World!");
http://Phi.Lho.free.fr
System.exit(0);
}
}
는 유효한 Java 프로그램입니다(단, 경고를 생성합니다).이유를 알 수 없는 경우 Gregory의 답변을 참조하십시오.;-) 여기서 구문 강조 표시를 통해 힌트를 얻을 수 있습니다.
이것은, 「숨겨진 기능」이라고는 할 수 없고, 그다지 유용하지도 않지만, 경우에 따라서는 매우 흥미로울 수 있습니다.
클래스 sun.misc.안전하지 않음 - Java에서 직접 메모리 관리를 구현할 수 있습니다(많이 시도할 경우 이를 사용하여 자체 수정 Java 코드를 작성할 수도 있습니다).
public class UnsafeUtil {
public static Unsafe unsafe;
private static long fieldOffset;
private static UnsafeUtil instance = new UnsafeUtil();
private Object obj;
static {
try {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
unsafe = (Unsafe)f.get(null);
fieldOffset = unsafe.objectFieldOffset(UnsafeUtil.class.getDeclaredField("obj"));
} catch (Exception e) {
throw new RuntimeException(e);
}
};
}
Swing에서 작업할 때 숨겨진 - 기능을 좋아합니다.
현재 창의 구성 요소 트리가 덤프됩니다.
(그 키 스트로크를 다른 것에 바인드하지 않은 것으로 합니다.
모든 클래스 파일은 유효한 JVM 바이트 코드로 식별하기 위해 16진수 값 0xCAfeBABE로 시작합니다.
(설명)
저는 java.util.concurrent에 투표합니다.동시에 동시 컬렉션과 유연한 실행자는 스레드 풀, 스케줄링된 작업 및 조정된 작업을 허용합니다.Delay Queue는 개인적으로 가장 좋아하는 것으로, 특정 지연 후에 요소를 사용할 수 있습니다.
java.displaces를 클릭합니다.타이머 및 타이머 태스크를 안전하게 정지할 수 있습니다.
또한 숨김은 아니지만 날짜 및 시간에 관련된 다른 클래스와는 다른 패키지에 포함되어 있습니다.java.util.concurrent.Time Unit은 나노초, 마이크로초, 밀리초 및 초로 변환할 때 유용합니다.
일반적인 someValue * 1000 또는 someValue / 1000보다 훨씬 잘 읽힙니다.
언어 레벨 아사트 키워드
Java 언어의 일부는 아니지만 Sun의 JDK와 함께 제공되는 javap 디스어셈블러는 널리 알려지거나 사용되지 않습니다.
1.5에서 각 루프 구성의 추가.나는 그것을 3개 미만으로 한다.
// For each Object, instantiated as foo, in myCollection
for(Object foo: myCollection) {
System.out.println(foo.toString());
}
또한 중첩된 인스턴스에서 사용할 수 있습니다.
for (Suit suit : suits)
for (Rank rank : ranks)
sortedDeck.add(new Card(suit, rank));
for-each 구문은 반복기가 아닌 인덱스 변수를 숨기는 배열에도 적용할 수 있습니다.다음 메서드는 int 배열 값의 합계를 반환합니다.
// Returns the sum of the elements of a
int sum(int[] a) {
int result = 0;
for (int i : a)
result += i;
return result;
}
내가 직접 발견한 것은java.lang.Void
very late - 범용 장치와 함께 코드 가독성을 향상시킵니다.Callable<Void>
언급URL : https://stackoverflow.com/questions/15496/hidden-features-of-java
'programing' 카테고리의 다른 글
MariaDB가 쿼리 시간 초과 시 PHP가 예외를 발생시키지 않음 (0) | 2022.09.23 |
---|---|
MariaDB 사용 페이지 압축 (0) | 2022.09.23 |
MariaDB가 Ubuntu 15.04에서 비밀번호를 확인하지 않습니다. (0) | 2022.09.23 |
MariaDB GROUP_CONCAT는 하나의 값만 반환합니다. (0) | 2022.09.23 |
TypeScript의 EventTarget 유형에 '값' 속성이 없습니다. (0) | 2022.09.23 |