2018/03/20

JEP では語れない Java SE 10

このエントリーをはてなブックマークに追加

今日リリースされる Java SE 10 の注目機能といえば var の導入ですね。

var の導入などの機能は、OpenJDK の JEP (JDK Enhancement Proposals) で管理されています。たとえば、var の導入は JEP 286 です。

Java SE 10 では 12 の JEP が機能として導入されます。

ところが、JEP になっていない変更といのが、けっこうあるのです。そこで、このエントリーでは、JEP になっていない機能をまとめてみました。

JEP になっていないぐらいなので、かなり細かいです。

 

廃止になった API

Java SE 9 で、@Deprecated アノテーションに forRemoval が追加されました。この値が true なものは、ほんとに削除されることになっています。

Java SE 10 では Java SE 9 で forRemoval = true になったフィールドやメソッドが廃止になっています。いずれも、java.base モジュールに含まれていたものです。

廃止されたフィールド

  • java.lang.SecurityManager.inCheck

SecurityManager クラスの inCheck フィールドは、checkPermission メソッドで置き換えができるので、廃止されました。

廃止されたメソッド

java.lang.Runtime クラス

  • getLocalizedInputStream
  • getLocalizedOutputStream

ローカライズしたストリームを作成するメソッドですが、使うことはまずないと思うので、廃止されても問題ないですよね。

java.lang.SecurityManager クラス

  • classDepth
  • classLoaderDepth
  • currentClassLoader
  • currentLoadedClass
  • getInCheck
  • inClass
  • inClassLoader

これらのメソッドは、いずれも checkPermission メソッドで置き換え可能です。

廃止予定の API

Java SE 10 に含まれる API のうち、将来廃止予定の API は以下の通りです。

これらの API を使用している場合は、なるべく早いうちに変わりの API に置き換えた方がいいです。

廃止予定モジュール

Java EE 系のモジュールは次の Java SE 11 で廃止予定です (JEP 320)。

  • java.activation
  • java.corba
  • java.se.ee
  • java.transaction
  • java.xml.bind
  • java.xml.ws
  • java.xml.ws.annotation

廃止予定のパッケージ

  • java.security.acl

パッケージが廃止される予定なので、java.security.acl パッケージに含まれる Acl インタフェースなどもすべて廃止予定です。

廃止予定のクラス

  • java.lang.Compiler
  • java.security.Certificate
  • java.security.Identity
  • java.security.IdentityScope
  • java.security.Signer
  • javax.security.auth.Policy

廃止予定のフィールド

javax.management.remote.rmi.RMIConnectorServer.CREDENTIAL_TYPES

廃止予定のメソッド

  • java.io.FileInputStream.finalize
  • java.io.FileOutputStream.finalize
  • java.lang.Runtime.runFinalizersOnExit
  • java.lang.Runtime.traceInstructions
  • java.lang.Runtime.traceMethodCalls
  • java.lang.SecurityManager.checkAwtEventQueueAccess
  • java.lang.SecurityManager.checkMemberAccess
  • java.lang.SecurityManager.checkSystemClipboardAccess
  • java.lang.SecurityManager.checkTopLevelWindow
  • java.lang.System.runFinalizersOnExit
  • java.lang.Thread.countStackFrames
  • java.lang.Thread.destroy
  • java.lang.Thread.stop
  • java.util.zip.Deflater.finalize
  • java.util.zip.Inflater.finalize
  • java.util.zip.ZipFile.finalize

 

追加された API

java.base モジュール

java.io.ByteArrayOutputStream クラス

  • toString(Charset charset)

今までキャラクターセットを文字列として指定する toString メソッドはありましたが、Charset オブジェクトで指定できるようになります。

java.io.PrintStream クラス

  • PrintStream(File file, Charset charset)
  • PrintStream(OutputStream out, boolean autoFlush, Charset charset)
  • PrintStream(String fileName, Charset charset)

いずれもコンストラクタで、キャラクターセットを Charset オブジェクトで指定できるようになります。

java.io.PrintWriter クラス

  • PrintWriter(File file, Charset charset)
  • PrintWriter(OutputStream out, boolean autoFlush, Charset charset)
  • PrintWriter(String fileName, Charset charset)

こちらも PrintStream クラスと同様にコンストラクタが追加されました。

java.io.Reader クラス

  • transferTo(Writer out)

リーダーで読み込んだものを直接ライターに書き込めるようになります。

NIO だとできていたので、今さら感はありますけど。

java.lang.Runtime.Version クラス

  • feature()
  • interim()
  • patch()
  • update()

java.lang.StackWalker.StackFrame インタフェース

  • getDescription()
  • getMethodType()

スタックトレース中のメソッドの情報を取得するためのメソッドです。ただ、デフォルトの実装が UnsupportedOperationException 例外を投げるようになっているので、注意が必要です。

StackWalker オブジェクトを作る時に StackWalker.Option.RETAIN_CLASS_REFERENCE を指定しておく必要があります。

java.lang.invoke.MethodType クラス

  • lastParameterType()

java.lang.management.RuntimeMXBean クラス

  • getPid()

java.lang.management.ThreadMXBean クラス

  • dumpAllThreads(boolean lockedMonitors, boolean lockedSynchronizers, int maxDepth)
  • getThreadInfo(long[] ids, boolean lockedMonitors, boolean lockedSynchronizers, int maxDepth)

java.net.URLDecorder クラス

  • decode(String s, Charset charset)

java.net.URLEncoder クラス

  • encode(String s, Charset charset)

URLDecoder クラスも URLEncoder クラスも Charset クラスを指定できるようになっています。

java.nio.channels.Channels クラス

  • newReader(ReadableByteChannel ch, Charset charset)
  • newWritter(WritableByteChannel ch, Charset charset)

こちらも同じですね。

java.nio.file.FileStore クラス

  • getBlockSize()

java.time.chrono.HijirahEra 列挙型

java.time.chrono.MinguoEra 列挙型

java.time.chrono.ThaiBuddhistEra 列挙型

  • getDisplayName(TextStyle style, Locale locale)

getDisplayName メソッドは Era インタフェースでデフォルトメソッドとして実装されていましたが、それぞれのクラスでオーバーライドされています。

java.time.format.DateTimeFormatter クラス

  • localizedBy(Locale locale)

ロケールに応じた DateTimeFormatter オブジェクトのコピーを返します。

java.util.DoubleSummaryStatistics クラス

  • DoubleSummaryStatistics(long count, double min, double max, double sam)

java.util.IntSummaryStatistics クラス

  • IntSummaryStatistics(long count, int min, int max, long sum)

java.util.LongSummaryStatistics クラス

  • LongSummaryStatistics(Long count, long min, long max, long sum)

なんたら Statistics クラスは空のオブジェクトを作って、accept メソッドをコールすることによって最小、最大、平均などを求めていたのですが、はじめからそれらの値をセットして作ることができるようになりました。

java.util.Formatter クラス

  • Formatter(File file, Charset charset, Locale l)
  • Formatter(OutputStream os, Charset charset, Locale l)
  • Formatter(String fileName, Charset charset, Locale l)

java.util.Scanner クラス

  • Scanner(File source, Charset charset)
  • Scanner(InputStream source, Charset charset)
  • Scanner(ReadabbleByteChannel source, Charset charset)
  • Scanner(Path source, Charset charset)

Formatter クラスも Scanner クラスも、Charset が指定できるようになっています。というか、Charset を指定できるようになる変更が多すぎ。

java.util.List インタフェース

  • copyOf(Collection<? extends E> coll)

java.util.Set インタフェース

  • copyOf(Collection<? extends E> coll)

java.util.Map インタフェース

  • copyOf(Map<? extends K, ? extends V> map)

引数のコレクションをコピーして、変更不可なリストもしくはセットを作ることができます。いずれも static メソッドです。

ただし、引数で指定するコレクションが変更不可な場合、コピーは作られずに、引数で指定したコレクションをそのまま返します。

java.util.Optional クラス

  • orElseThrow()

java.util.OptionalDouble クラス

  • orElseThrow()

java.util.OptionalInt クラス

  • orElseThrow()

java.util.OptionalLong クラス

  • orElseThrow()

値がある場合は値を返し、値がない場合は NoSuchElementException 例外を投げます。

java.util.SplittableRandom クラス

  • nextBytes(byte[] bytes)

引数で指定した配列に乱数をセットします。

java.util.concurrent.FutureTask クラス

  • toString()

タスクを表す文字列だけでなく、タスクの状態も加えて返します。

java.util.concurrent.locks.StampedLock クラス

  • isLockStamp(long stamp)
  • isOptimisticReadStamp(long stamp)
  • isReadLockStamp(log stamp)
  • isWriteLockStamp(log stamp)

いずれも static メソッドで、引数で指定したスタンプの状態を調べるために使用します。

java.util.jar.JarEntry クラス

  • getRealName()

java.util.jar.JarFile クラス

  • versionedStream()

Java SE 9で導入されたマルチリリース Jar ファイルで、バージョンごとの JarEntry オブジェクトをストリームとして返します。

java.tuil.spi.LocaleNameProvider クラス

  • getUnicodeExtensionKey(String key, Locale locale)
  • getUnicodeExtensionType(String type, String key, Locale locale)

java.util.stream.Collectors クラス

  • toUnmodifiableList()
  • toUnmodifiableSet()
  • toUnmodifiableMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper)
  • toUnmodifiableMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction)

ストリーム処理の返り値として、変更不可のコレクションを返すための Collectors メソッドです。

java.compiler モジュール

javax.lang.model.SourceVersion 列挙型

  • RELEASE_10

javax.lang.model.util.TypeKindVisitor6 クラス

  • visitNoTypeAsModule(NoType t, P p)

javax.lang.model.util.TypeKindVisitor9 クラス

  • visitNoTypeAsModule(NoType t, P p)

java.management.rmi モジュール

javax.management.remote.rmi.RMIConnectorServer クラス

  • CREDENTIALS_FILTER_PATTERN
  • SERIAL_FILTER_PATTERN

java.desktop モジュール

java.awt.Toolkit クラス

  • getMenuShortcutKeyMaskEx()

getMenuShortcutKeyMask メソッドが Deprecated になったので、その代わりとなるメソッドです。

getMenuShortcutKeyMask メソッドはデフォルトで、Event.CTRL_MASK を返していたのですが、マスクとしては不適切だということらしいです。getMenuShortcutKeyMaskEx メソッドでは InputEvent.CTRL_DOWN_MASK をデフォルトで返すようになってます。

java.awt.geom.Path2D クラス

  • trimToSize()

java.awt.geom.Path2D.Float クラス

  • trimToSize()

java.awt.geom.Path2D.Double クラス

  • trimToSize()

容量削減のためのメソッドです。

javax.swing.ButtonModel インタフェース

  • getGroup()

ボタンがラジオボタンの場合、そのグループを返します。ラジオボタン以外は null を返します。

javax.swing.plaf.basic.BasicMenuUI クラス

  • getMinimumSize(JComponent c)

メニューの項目に使用するため、引数で指定されたコンポーネントの最小のサイズを返します。

結構あると思うか、メジャーバージョンアップの割には少ないと思うかは、自由です。半年でのリリースだと思うと、多いと思うかもしれません。

ほんとは、もう 1 つ、とある例外のコンストラクタが追加されているのですが、まぁいいでしょう。