2020年8月10日 星期一

SpriteOverEvent 之靈異現象

重現方式

直接上 SSCCE:

public class SpriteTestEP extends DrawComponent implements EntryPoint {
	private RectangleSprite red = new RectangleSprite(200, 201, 100, 50);
	private RectangleSprite none = new RectangleSprite(200, 201, 300, 50);

	public SpriteTestEP() {
		red.setFill(RGB.RED);
		none.setFill(Color.NONE);

		addSprite(red);
		addSprite(none);

		addSpriteOverHandler(new SpriteOverHandler() {
			@Override
			public void onSpriteOver(SpriteOverEvent event) {
				log("Over : " + who(event.getSprite()));
			}
		});
		addSpriteOutHandler(new SpriteOutHandler() {
			@Override
			public void onSpriteLeave(SpriteOutEvent event) {
				log("Out : " + who(event.getSprite()));
			}
		});
	}

	private String who(Sprite sprite) {
		return (sprite == red ? "red" : "none");
	}

	public static native void log(Object object) /*-{
		console.log(
			@java.lang.String::valueOf(Ljava/lang/Object;)(object)
		);
	}-*/;

	@Override
	public void onModuleLoad() {
		//無關緊要,純粹 follow GXT 習慣  XD
		Viewport vp = new Viewport();
		vp.add(this);
		RootPanel.get().add(vp);
	}
}

操作步驟:

  1. 游標進入紅色區塊
  2. 慢慢水平移動滑鼠,直到離開紅色區塊

2020年7月2日 星期四

JDK 15 的新功能

原文網址:https://www.infoworld.com/article/3534133/jdk-15-the-new-features-in-java-15.html

Java Development Kit 15 是 Java SE 的下個版本,Oracle 的實做在 6/11 進入到初期的 ramp-down phase,該版本的功能集已經定型了。JDK 15 的亮點包含 text block、hidden class、foreign memory 存取 API 以及 sealed class、record 的 preview 版本。

Java upgrade 也進入到 ramp-down phase,兩個候選版本會在 8/20 之前釋出。general availability 會在 9/15。JDK 15 的前身是 3/17 發布的 JDK 14。Oracle 在 Java SE 保持著 6 個月發布一次新版的步調,每年會有兩個新的版本問世。

OpenJDK 15 的新功能與改變:

  • 第二個 foreign memory 存取 API 的孵化版本,這可以讓 Java 程式安全且有效率地存取 Java heap 以外的 foreign memory。API 可以操作數種不同的 foreign memory,像是 native、persistent、managed heap。許多 Java 程式會存取 foreign memory,像是 Ignite、MapDB。這個 API 會協助避免產生與 garbage collection、跨 process 的 share memory、將檔案對應至記憶體的序列化… 相關的成本與不確定性。目前的 Java API 沒有提供令人滿意的 foreign memory 存取方法。但在新的提案當中,API 應該也不會損害到 JVM 的安全性。這個功能在 JDK 14 當中完成了早期孵化板,在 JDK 15 當中提供的是精鍊過的版本。
  • sealed class 的 preview 版本。除了 interface,sealed class 限制其他 class 或 interface 如何繼承或實做 sealed class 的方式。這個功能的目標包含 class 或 interface 的設計者可以控制哪些程式碼是有實做的責任、提供一個比 access modifier 更具表達力的方法來限制 super class 的使用、以及 support future directions in pattern matching by underpinning the exhaustive analysis of patterns。
  • 移除 Solaris/SPARC、Solaris/x64、Linux/SPARC 的支援。(細節略)
  • record 是一種 class、它是 immutable 資料的透明載體。在 JDK 14 當中以前期 preview 版面世,JDK 15 應該會包含 preview 二版。這個計畫的目標包含設計一個 OO 建造法來表達一個簡單的數據集合、幫助程式設計師專住在建構 immutable data 而不是可繼承的行為、自動實做資料相關的 method(像是 equals 跟 assessor)、保持 Java 長期以來的原則(像是 nominal typing 以及移植能力)。record 可以視為是 nominal tuple。
  • 基於 Edwards-Curve Digital Signature Algorithm (EdDSA) 的加密簽章演算法。EdDSA 是現代的 elliptic curve scheme 勝過目前 JDK 當中的簽章 scheme。EdDSA 只有在 SunEC provider 當中會實做。EdDSA 會被需要是因為相較於其他簽章 scheme 它加強了安全度及效能。一些加密的 library(例如 OpenSSL 跟 BoringSSL)已支援這個演算法。
  • 重新實做古老的 DatagramSocket API,將底層 java.net.datagram.Socket 以及 java.net.MulticastSocket API 換成簡單且較現代的實做方式。這帶來幾點好處:1. 容易除錯與維護。2. 使用 Project Loom 正在開發的 virtual thread。新的計畫會依循 JEP 353(重新實做古老的 Socket API)。目前 java.net.datagram.Socket 以及 java.net.MulticastSocket 的實做可以回溯至 JDK 1.0,那時 IPv6 還在開發中。這造成目前 MulticastSocket 的實做試著調解 IPv4 跟 IPv6 導致很難維護。
  • 預設關掉 biased locking,所有相關的 command-line 選項也都 deprecate。(細節略)
  • 延續 JDK 14 的 preview 版本,推出 instanceof 的 pattern matching 的 preview 二版。pattern matching 主要可以讓「在程式當中用特定條件取出 object 的 component」的表示法變得更簡潔。像 Haskell 跟 C# 都因為其簡約與安全的特性而包含 pattern matching。
  • hidden class 是無法讓其他 class 在 bytecode 當中直接使用的 class,這讓 framework 在 runtime 製造出 class 然後透過 reflection 的方式間接地使用這些 class。hidden class 可以被定義為 access control nest 的 member,並且可以獨立 unload。這個提案透過啟用標準 API 來定義無法被找到且有 limited lifecycle 的 hidden class,會增加所有 JVM 上語言的效能。無論 JDK 內外的 framework 將可以動態地製造 class 而不是定義 hidden class。許多在 JVM 上的語言依賴動態製造 class 來達到彈性與效率。這個提案的目標包含:讓 framework 定義找不到實做細節的 class,這樣其他 class 就無法連結到、也無法用 reflection 的方式發現到;support for extending an access control nest with non-discoverable classes;以及支援無法找到的 class 的侵入式 unload,這樣 framework 就有彈性可以想定義多少就定義多少。另外一個目標是 deprecate 一個非標準 API misc.Unsafe::defineAnonymousClass,這代表未來的版本會移除掉。同樣地,Java 語言並不會因為這個提案而有所改變。
  • Z Garbage CollectorZGC)將從實現性質的功能轉變成產品。2018 年 9 月整合進 JDK 11 的 ZGC 是一個可拓展、低延遲的 GC。ZGC 以實驗性功能的身份導入,是因為 Java 開發人員認為 ZGC 的大小與複雜度應該小心地逐步帶入。從那之後補強了許多部份,ranging from concurrent class unloading, uncommitting of unused memory, and support for data-class sharing to improved NUMA awareness and multi-threaded heap pre-touching。heap 的最大值也從 4TB 增加到 16 TB。支援的平台包括 Linux、Windows 與 MacOS。
  • text block 在 JDK 14 與 JDK 13 都出過 preview 版,要讓 Java 程式碼當中撰寫多行字串的工作便得簡單、同時避免大多數情況下的 escape sequence。一個 text block 是多行的字串,其中不包含 escape sequence、自動用可預測的方式格式化、並且提供開發人員控制格式的能力。A goal of the text blocks proposal is enhancing the readability of strings in Java programs that denote code written in non-Java languages. Another goal is to support migration from string literals by stipulating that any new construct can express the same set of strings as a string literal, interpret the same escape sequences, and be manipulated in the same fashion as a string literal. OpenJDK 開發人員希望增加 escape sequence 以管理明確的 white space 以及換行符號。
  • Shenandoah low-pause-time garbage collector 從實驗性的功能轉變成產品。這在 JDK 12 時候導入,已經經過一年了。
  • 移除 Nashorn。(細節略)
  • Deprecation of the RMI Activation mechanism(細節略)

2020年6月3日 星期三

GWT 2.9.0 發布

亮點

  • 可以用 jsinterop-base 1.0.0、elemental2 1.0.0、jsinterop-annotations 2.0.0(除了 @JsAsync@JsEnum)做 compile,這會讓 GWT2 將可以用 J2CL 以及這些工具來 compile。
  • 增加 Java language level 9, 10, 11 的支援度。
  • 正式停止在 Java 7 上執行 GWT compiler 與 server side tooling 的支援。在這個版本當中,GWT 還是可以在 Java 7 上 compile,但是不會保證能否運作。未來的版本會以 Java 8+ compile bytecode。這個版本用來測試與提供不同平台上搭配 Java 8, 11, 14 一起運作的方式。

棄用

  • Elemental 已經正式棄用了,這個版本裡頭還有,但是未來的版本當中可能就不會出現。我們建議用 Elemental2 來取代,它可以同時用 GWT2 以及 J2CL compile。
  • 移除 NoSuchMethodException 的模擬。

修正

  • 修正 float[]double[]Arrays.binarySearch()
  • error / exception 增加支援多行訊息。
  • DiskCache 增加關閉的 hook 來清除暫存檔們。
  • 將 Gecko 版號快取起來,以減少在 FireFox 的 CPU 使用率
  • 不再假設「this 一定不是 null」
  • Updates globals for Firefox version 60.0.2, Chrome 66.0.3359.45。
  • 修正 String.regionMatches()
  • 原生的 JsMethods 允許跟實做程式碼以相同名稱共存。
  • 必要時,確保 lambda 的 box、unbox、insert 有消除 cast。
  • Double.compare()Float.compare() 正確地處理負 0。

雜項

  • CLDR 更新到 v.34。
  • Arrays 現在有 implement Cloneable
  • Link backing errors together with a cause attribute, start tracking suppressed errors in addition to the cause in underlying error object.
  • AtomicReference 加到 gwt/emul
  • Propagate script nonces via ScriptInjector
  • 增加 ExecutorServiceScheduledExecutorService 的部份功能模擬。
  • 模擬 java.util.concurrent.Flow
  • 模擬 javax.annotation{,.processing}.Generated
  • goog.global 沒有定義時,讓他變成 $wnd。
  • 增加 when-linker-added element definition。
  • 增加 Reader 以及 StringReader 模擬。
  • 移除 GWT 版本檢查。
  • synthetic method 不會顯示「unusable-by-js」警示。
  • Update unmodifiableList to throw on Java8 methods.
  • 預設關掉 DataflowOptimizer,用到時會發出警告。

更多細節參見 commit log