Visual Studio IntelliCodeがJavaに対応したので試してみた

[Visual Studio Code](https://code.visualstudio.com/)の拡張機能「[Visual Studio IntelliCode](https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode)」がJavaに対応したとのことで、早速試してみました。

**12/2追記**
Visual Studio CodeでなぜJava開発が可能か？について調べました。
**[「なぜVisual Studio CodeでJavaの開発ができるのか？」](https://qiita.com/kikutaro/items/745925395ae89944ae48)**

# Visual Studio IntelliCodeとは？

機械学習を用いてAIがコーディング支援してくれる機能で、GitHubにあるコードを学習データとして使っているそうです。

- [AI-assisted coding comes to Java with Visual Studio IntelliCode](https://blogs.msdn.microsoft.com/visualstudio/2018/11/12/ai-assisted-coding-comes-to-java-with-visual-studio-intellicode/)
- [コーディングをAIが支援してくれる「Visual Studio IntelliCode」、Javaに対応。GitHubにあるコードを機械学習](https://www.publickey1.jp/blog/18/aivisual_studio_intellicodejavagithub.html)
![2018-11-17_23h35_00.png](https://qiita-image-store.s3.amazonaws.com/0/47737/81e06bf9-c768-f6a2-0123-f83300a8db96.png)

# 環境

試したのは次の環境です。拡張機能に[Java Extension Pack](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack)のみ入れた環境を用意して確認しました。[Language Support for Java™ by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java)は既にJava 11に対応しているため、今回はOpenJDK 11.0.1を利用しました。

- Windows 10 Pro（Azure上のVM）
- Visual Studio Code 1.29.1
- OpenJDK 11.0.1
- Java Extension Pack
    - Language Support for Java™ by Red Hat
    - Debugger for Java
    - Java Test Runner
    - Maven Project Explorer
- Visual Studio IntelliCode

# 結果
## Hello World
まずはHello Worldの標準出力レベルで確認してみます。
#### Visual Studio IntelliCodeがない環境
Visual Studio IntelliCodeを入れる前の環境を試します。System.outでドットを打つとメソッド一覧が表示されますが、普通にアルファベット順に表示されています。
![2018-11-17_23h06_52.png](https://qiita-image-store.s3.amazonaws.com/0/47737/87b5f052-e7a1-39f2-4bf7-7dcba0a68f7c.png)

#### Visual Studio IntelliCodeを入れた環境
続いてVisual Studio IntelliCodeを入れた環境で試してみると、「★」マークが付いたものが表示されます。これがIntelliCodeによって推奨されたメソッドです。appendを指しているよりは嬉しいですね。
![2018-11-17_23h07_55.png](https://qiita-image-store.s3.amazonaws.com/0/47737/2258fa31-74fc-b4ab-f2bf-6c2681ebb057.png)

## コンテキスト
先の例はシンプルすぎてあまり良さがわからないので、次のような例を試してみました。

#### Integer型の数値
Integerの数値を定義して、メソッドをみると、次のように並びます。
![2018-11-18_00h37_17.png](https://qiita-image-store.s3.amazonaws.com/0/47737/c11840e7-6787-d795-a0b4-a5a4d9e07d9e.png)

#### Integer型の数値 + if文
if文の条件で使ってみると先ほどparseIntやtoStringが並んでいたものが、equals、intValueなどが優先されました。このようにコードのコンテキストに合わせてAIが推奨してくれるようです。
![2018-11-18_00h48_14.png](https://qiita-image-store.s3.amazonaws.com/0/47737/fdc9f7b9-2f10-7252-44ce-8fbb6910e43f.png)


現状どこまで有効な表示がでるかわかりませんが、ちゃんと機能しているようです。

## おまけ
ちなみに[JDK11で入ったHttpClient](https://openjdk.java.net/groups/net/httpclient/intro.html)を試してみると、「★」が付いたものは表示されませんでした。この辺はまだ学習データがないのか、JDK11に対応していないのか、よくわかりませんでした。
![2018-11-17_23h23_50.png](https://qiita-image-store.s3.amazonaws.com/0/47737/499dc652-c5c9-c173-ec9f-f710abd3494c.png)

## [追記]

当初、以下の例で書いていました。

```java
Integer val = new Integer(123);
```

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">Integerのコンストラクタは11ではdeprecatedになってるはずだけど警告が出ない？</p>&mdash; きしだൠ (@kis) <a href="https://twitter.com/kis/status/1063815253702537216?ref_src=twsrc%5Etfw">2018年11月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

コメントいただいたとおり、deprecatedでVSCodeでも警告が出ていました。悪い例を書いてしまい、失礼しましたm(_ _)m
![2018-11-18_00h29_30.png](https://qiita-image-store.s3.amazonaws.com/0/47737/79e62517-4e30-47b8-1756-581c3f7625ea.png)