その他のJava機能

最初の記事の ソースを翻訳し続けます 。 それにもかかわらず、ますます明白なことは、それにもかかわらず、繰り返しはそれほど悪いことではないと判断しました。

そして、ソースが使い果たされた場合-habr-java-communityへの呼び出し:「 Dしないでください!」、コメントでこのリストを完成させ、あなたの経験を共有してください。 それまでの間 、インストール、ダビング、および希釈後の前の記事の続きは、私たち自身の経験によるものです。

JDKツール


ほとんどの人が、JDKには非常に多くのツールが含まれていることを知っています。 ただし、日常の作業では、java、javac、jar以外の多くの人は使用しないと思います。 binフォルダーから他に何を取得できますか:


Java VM


JVMは、 JythonJRubyGroovyScalaなどの他のプログラミング言語からバイトコードにコンパイルされたコードを実行できます

システムトレイ


Java 1.6以降、システムトレイにアイコンを追加できます: http : //java.sun.com/docs/books/tutorial/uiswing/misc/systemtray。 html

動的プロキシ


1.3で追加された動的プロキシにより、指定されたインターフェイスによって実行時に新しいタイプを決定できます。

あなたはそれを知っていますか:



-ネイティブメソッドSystem.arraycopyを使用して配列の高速コピーが可能(...)

-thisキーワードを使用すると、内部クラスのフィールドとメソッドにアクセスできます。 たとえば、内部クラスに同じ名前のメソッドまたはフィールドがある場合:OuterClass.this.methodName()またはOuterClass.this.fieldName。
*非静的内部クラスの場合のみ-gribozavr

-Java 1.5は可変長引数リストを受け取りました:
public void foo( String ... bars) {
for ( String bar: bars)
System. out .println(bar);
}


-instanceofがオプションになる前にnullをチェックする:
if(null!= aObject && aObject instanceof String){
と同じ
if(aObject instanceof String)

-Serializableの魔法のシ​​リアル化がありますが、private writeObject、readObjectメソッドを介したExternalizableオブジェクトはありません。
java.sun.com/developer/technicalArticles/Programming/serialization

-プリミティブのクラスは、int.class、float.class ...を使用して取得できます。

-プリミティブに加えて、+および+ =が機能する唯一のタイプはStringクラスです。 構築str = str +“ 1”は、コンパイラによってstr = new StringBuffer(str).append(“ 1”)。ToString()に置き換えられます。 ループ内で文字列を連結していますか?
* Java 1.5以降では、 StringBuilderが使用されます-malkolm

-Cスタイルのsprintfはjavaで使用可能です。String.format()を試してください。
String w = «world»;
String s = String .format(«Hello %s %d», w, 3);


-float i = Float.NaNの場合-式i == iはfalse
*これはIEEE 754要件で、Double.isNan()を使用してNaNのdoubleを確認できます-gribozavr

セミクローズドコンストラクター



ソース: javaekspert.blogspot.com/2007/11/semi-private-constructors.html

オブジェクトの作成を他のクラスからアクセスできないようにする(たとえば、ファクトリを使用する場合)か、一部のコンストラクタへのアクセスをブロックして、オブジェクトの「プライベートプロパティ」であると宣言する必要が非常によくあります。 ただし、単体テスト中に独自のレーキを踏む必要があります-オブジェクトを作成することは不可能です。

保護されたコンストラクターと匿名クラスを使用して、セミクローズコンストラクターが助けになります。 例:
UserクラスがUser(int id)コンストラクターの1つを非表示にし、User(String name)のみを使用可能にしたい場合、これがその権利です。 ただし、次のようにクラスを宣言します(プライベートではなく、保護されています):

public class User { // User final
protected User( int id) {…}
public User( String name) {
this (getId(name));
}
}


つまり、最初のコンストラクターを後で使用するための抜け穴を残します。つまり、

public class TestUser {
public void testUserIdConstructor() {
User hack = new User(1) {};
}
}


また、変数hackには、コンストラクターUser(1)を呼び出すことにより、Userから継承された匿名クラスのオブジェクトが割り当てられました。

自己結合ジェネリック



クラスSelfBounded <TはSelfBoundedを拡張> {
}

Bruce Eckelの記事からwww.artima.com/weblogs/viewpost.jsp?thread=136394
ジェネリックに関する巨大な FAQのロード-あなたが尋ねることを恐れていたすべて: www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html

そして再び列挙型について



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 ; }
}


ブラックマジック


別の方法では、それを言語と呼ぶことは変わりません。 ドラムロール...
sun.misc.Unsafeクラスを使用すると、アプリケーションでメモリを直接管理できます。 次のことができます。
  1. コンストラクターを呼び出さずにオブジェクトを作成する
  2. 例外をスローリストに定義せずに例外をスローします。
  3. メモリブロックの割り当て、解放、コピー
  4. 同期宣言なしでオブジェクトモニター(ロック/ロック解除)を取得して返す
  5. バイトコードからクラスを宣言します -このアイテムは、カスタムClassLoaderで作業する人々を混乱させます

なぜこれだけなのか、私は尋ねたいのですか? 私は答えを見つけることができず、このクラスを甘やかすとJVMを殺すことができると思います

ソース-
http://www.docjar.com/html/api/ClassLib/Common/sun/misc/Unsafe.java。 html
もう一つの興味深いリンクは、すでにロシア語で-
http://wasm.ru/article.php?article=unsjav1
http://wasm.ru/article.php?article=unsafe_ii
オープンソースで使用:
グーグルコード検索

*ソースコードはソースコードハイライターで強調表示されました。

Source: https://habr.com/ru/post/J67769/


All Articles