Javaとは〜
問題一覧
1
仮想マシン プラットフォームに依存しない。
2
Java SE Javaの基本となるエディション Java EE サーバーサイド開発のための企業向けエディション Java ME 組み込みシステムに利用されるエディション
3
Java開発環境 Javaアプリを実行するためのJava仮想マシンをはじめ、コンパイラーやデバッガーなどのツールを備えている
4
クラス
5
命名に際しては、他のライブラリとの重複を避けるために、ドメイン名を逆にしたものを頭に付与するようにしてください。 mynavi.example.comなら 「com.example.mynavi」がパッケージとなる
6
mainというメソッドだけは特殊で、アプリの開始位置を表します。Javaはアプリを起動したときに、まずmainメソッドを探して、その配下のコードから実行するのです。このようなメソッドのことをエントリーポイントと言います。
7
Javaのソースコードが.javaファイル コンパイルしたものが、.classファイル
8
javac option src option:コマンドオプション src:ソースファイル(.javaファイル) 例 javac -d C:data -classpath .;C:data -encoding Windows-31J tojavacodesamplebasicHelloSample.java https://java-code.jp/55
9
javac コマンドのオプションを指定 -classpath パス 関連するクラスファイルの検索先。複数指定時は、セミコロン(Windows)、またはコロン(Unix)区切り -classpathオプションは、そのソースをコンパイルするために必要なクラスファイル、またはJARファイルの場所(パス)を表すものです
10
都度設定するのが面倒である場合には、環境変数CLASSPATHであらかじめ指定しておいても構いません。
11
java option clazz params option:コマンドオプション clazz:実行するクラス params:パラメーター https://java-code.jp/53
12
jarファイルはコンパイル済みのclassファイルや画像などのファイルを、zip形式に圧縮してまとめたファイル Javaでアプリケーションを配布する際には、JAR形式でまとめたものを配布するのが一般的です。
13
javaコマンドのjar オプションを指定する たとえば以下は、Hello.jarを実行する例です。パラメーターとして「山田」をセットします。 > java -jar Hello.jar "山田"
14
jarファイルからアプリケーションを起動するには、 .jarファイルに以下のような内容のマニフェストファイル(/META-INF/MANIFEST.MF)を組み込んでおく必要があります。 Main-Classパラメータには、起動するクラスを指定します。 Main-Class: to.java.code.sample.basic.HelloSample
15
jar option jfile clazz… option:コマンドオプション jfile:作成するjarファイルの名前 clazz:含めるクラスファイル(複数指定可) たとえば以下は、あらかじめ用意したクラスファイルとマニフェストファイル(MANIFEST.MF)をもとに、Hello.jarを作成する例です。 > jar cvfm Hello.jar to¥java¥code¥sample¥basic¥META-INF¥MANIFEST.MF to¥java¥code¥sample¥basic¥*.class https://java-code.jp/51 https://java-reference.com/command-jar/
16
javadocコマンドは、ソースファイルに記述されたドキュメンテーションコメントからAPIドキュメントを作成します。 公式サイトで公開されているAPIドキュメントも、もともとはjavadocコマンドで作成されたものです。 APIドキュメントをHTMLで確認できる。 コマンド詳細 javadoc option src option:コマンドオプション src:ドキュメントのもととなるソースファイル https://java-code.jp/49 https://qiita.com/maple_syrup/items/96f7142222cd4eb5c9de
17
入力・評価・出力のループのこと。インタプリタにおいて、ユーザーとインタプリタが対話的にコード片を実行できるもの
18
jshell option option:コマンドオプション Java 9で追加されています。 Java 9以前では、簡単なコードを利用するにもコンパイル&実行という手順を踏む必要がありましたが、JShellを利用することでその場で即座に実行できます。 https://java-code.jp/1272
19
JShellのプロンプトは「jshell> 」です。ライブラリを利用する際には、普通のコードと同じくimport命令でクラスをインポートします(①)。 以降のコード(②~③)は、暗黙的にmainメソッド配下のコードと見なされます。また、変数の宣言も不要です。生成されたオブジェクトは、そのまま自動変数$1、$2…に順に代入されるからです。③でも②で生成したArrayListオブジェクトに変数$2経由でアクセスできています。 JShellを終了するには、/exitメタコマンドを利用します。
20
camelCase記法:先頭文字は小文字、単語の区切りは大文字(myNameなど) Pascal記法:先頭文字は大文字、単語の区切りも大文字(MyNameなど) アンダースコア記法:すべての文字は小文字、または大文字。単語の区切りはアンダースコア(MY_NAME、my_nameなど)
21
コンパイラが、初期値から型を推論すること。 つまり、データ型を指定しない変数宣言ができる。 package com.example.mynavi.basic; public class VarBasic { public static void main(String[] args) { var num = 3.14; System.out.println(num); // 結果:3.14 } } 上の例であれば、変数の型は推論された結果は、doubleです。
22
1 型推論によってコンパイラに定められた型は、変更不可能。 (スクリプトではないからしょうがない) 以下のようなコードはコンパイルエラーとなります。変数dataの型は、宣言時にdoubleで決まるので、これにString型の値を代入することはできません。 var data = 3.14; data = "Javaコード入門"; 2 初期値は省略不可 3 複数の変数を列挙できない var num1 = 1 , num2 = 2; 4 ローカル変数にしか使えない。 フィールド宣言では、初期値の有無に関わらず、varキーワードは利用できません。
23
カンマで区切る double num = 3.14, num2 = 1.414;
24
Java10以降
25
final public static void main(String[] args) { final String GREETING_MSG = "こんにちは、世界!"; System.out.println(GREETING_MSG); }
26
byte バイトデータを示す型 1バイト符号付き整数(-128~127) short 2バイト符号付き整数(-32768~32767) int 4バイト符号付き整数(-2147483648~2147483647) long 8バイト符号付き整数(-9223372036854775808~9223372036854775807)
27
基本はint型を利用し、それで不足の場合のみlong型を利用してください。short型を利用する機会はほとんどありません。
28
二進数は0b、八進数は0、十六進数は0xを付与する int i2 = 010; // 8進数(0~) int i3 = 0xFF; // 16進数(0x~) int i4 = 0b0010; // 2進数(0b~。JavaSE 7以降)
29
int型 System.out.println(21474);
30
「L」(long型)を値の末尾に付与してください。 System.out.println(2147483648L);
31
float … 4バイト浮動小数点数(±1.40239846×10^-45~±3.40282347×10^38) double … 8バイト浮動小数点数 (±4.94065645841246544×10^-324~±1.79769313486231570×10^308)
32
double
33
float値を表すには、リテラルのサフィックスとして「f」または「F」を指定してください。 float f = 1.1234f;
34
浮動小数点型では指数表現も利用できます。「1.234E5」は「1.234×10^5」の意味です。大文字小文字を区別しません。 double d1 = 1.1234; double d2 = 1.1234E5; // 指数表現
35
char … UNICODE文字(u0000~uffff) リテラル値はシングルクォートで括ります。文字そのものを指定する他、uxxxxの形式で文字を表すこともできます。 char c1 = 'あ'; char c2 = '¥u5f01'; // 16進数の文字コード表現 ちなみに文字列型はクラスで基本型ではないとのこと
36
int[] data = new int[5]; int[] data2 = { 1, 2, 3 };
37
int[][] data3 = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; System.out.println(data3[0][2]);
38
拡大変換可能だが縮小変換はそのままでは不可 基本型では、小さな型を大きな型に代入可能(たとえば、int型の値をlong型に代入) long型の値がint型に格納はできない
39
「(型名)」を付与するだけ long l = 50; int i = (int)l; System.out.println(1+i);
40
instanceof演算子を利用する。 これは、オブジェクトが指定されたクラス、またはスーパークラスのインスタンスであるかを判定します。 クラス型のキャストにあたっては、あらかじめinstanceof演算子で実際の型を判定しておくことで、安全にキャストを実行できます。 Animal c = new Cat(); ※親の型でインスタンス可能! if (c instanceof Hamster) { Hamster h = (Hamster)c; } ※ハムスターもアニマル型を継承してると思うので、型変換可能
41
x++は代入した後にインクリメントしますが、++xは代入する前にインクリメントします。 int x = 1; int y = x++; System.out.println("yは" + y); // 結果:yは1 int a = 1; int b = ++a; System.out.println("bは" + b); // 結果:bは2
42
浮動小数点数は内部的に二進数で演算されてしまう。 例えば10進数の0.1ですら、2進数では0.000110011…のような無限循環小数となってしまう。 つまり計算に不向き。 System.out.println(1.0 - 0.1 - 0.2 - 0.3); // 結果:0.39999999999999997 といった感じになる。
43
厳密な結果を得る場合には、BigDecimalというクラスを利用してください BigDecimal bd1 = new BigDecimal("1.0"); BigDecimal bd2 = new BigDecimal("0.1"); BigDecimal bd3 = new BigDecimal("0.2"); BigDecimal bd4 = new BigDecimal("0.3"); System.out.println(bd1.subtract(bd2).subtract(bd3).subtract(bd4)); // 結果:0.4 だいぶめんどい subtractメソッドが減算を意味します。その他、add(加算)、multiply(積算)、divide(除算)などを利用できます
44
文字列連結演算子になる。 System.out.println("x" + 1); // 結果:x1 System.out.println(1 + "x"); // 結果:1x System.out.println("2" + 1); // 結果:21 代入
45
基本型、参照型
46
基本型は値渡し 参照型は参照の値渡し javascriptとおなじ https://yoshitaro-yoyo.hatenablog.com/entry/only_value_passing_in_java#Java%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%8F%82%E7%85%A7%E5%9E%8B ちなみに参照渡しとは 実引数と仮引数が完全に同じ実体を表すように引数を受け渡すこと 再代入すると、参照の変更が行われるのが参照渡し、そのまま再代入されるのが参照の値渡しということらしい
47
正しくは同一性(Identity)――同じモノであるかを確認するための演算子 基本型では、値が等しければ同じものであるので問題ありません。 しかし、参照型では同じ値であっても、同じものであるとは限りません。たまたま同じ値を持っているだけで、異なる場所に格納されている異なるものである可能性があるからです。 つまり、厳密な等価演算子である。
48
参照型を比較するには、同値性(Equivalence)を確認するためのequalsメソッドを利用してください。 System.out.println(Arrays.equals(data1, data2));
49
// 単一行コメントです。 /* 複数行の コメントです。 */ /** * javadocコマンドでドキュメント化されるコメントです。 */
50
Java12以降に追加された。 まだプレビュー状態らしい (1)switch式 switchが式として表現できます。つまり、文の中でswitch命令を記述できます。なお、switch式では値を返さないパターンがあってはいけないので、default句は省略不可です。 (2)アロー演算子 case/default句を「値 -> 対応する式」の形式で表せます。アロー演算子では、句の末尾のbreak命令は不要となります。 (3)case値の複数列記 case句に、カンマ区切りで値を列記できます。従来のようにcase句そのものを列記する必要はありません。 String lang = "Ruby"; @SuppressWarnings("preview") String category = switch(lang) { case "PHP", "Python", "Ruby" -> "スクリプト言語"; case "Java", "C#", "C" -> "プログラミング言語"; default -> "不明"; }; System.out.println(category); // 結果:スクリプト言語 また、Preview版を利用する場合は、@SuppressWarningsアノテーションでPreviewに対する警告を無効化しておきましょう
51
ある 多重代入可能 a = b = c = 10; つまり文中で代入できるってことね
52
ある。 int a = 1, b = 2; for文でもつかえる。 for(int i = 0, j = 10; i < 5; i++, j++) { System.out.println(i * j); }
53
ラベル構文を利用することで、入れ子になったループをまとめて脱出することもできます。 ラベルは脱出したいループの先頭に付与します(この場合は「ext」) public static void main(String[] args) { ext : for (int i = 1; i < 10; i++) { for (int j = 1; j < 10; j++) { if (i * j > 50) { break ext; } System.out.print((i * j) + "/"); } System.out.println(); } }
54
クラス直下にたいして フィールド宣言の頭にstatic final修飾子を付与することで宣言できます public static final double E = 2.7182818284590452354; public static final double PI = 3.14159265358979323846; 定数であることはfinal修飾子だけで表現できますが、static修飾子を付けるのがお作法です。static修飾子を付与することで、インスタンス生成のたびに同じ値をインスタンスにコピーするのを防ぐことができます
55
型名のうしろに「…」を付与することで、可変長引数を表す 可変長引数とは呼び出し側で自由に引数の数を変えられる引数のこと package com.example.mynavi.object; public class Util { public static double sum(double... values) { double result = 0; for (double value : values) { result += value; } return result; } } 呼び出し方はこう System.out.println(Util.sum(10, 30, 50)); // 結果:90.0 System.out.println(Util.sum(10, 30, 50, 70)); // 結果:160.0
56
可変長引数は、内部的には配列として処理されます。前問題のサンプルでは引数valuesを拡張for命令で順に取り出し、順に足しこんでいるわけです。
57
同じ名前で、引数の型、並びだけが異なる」メソッドを複数定義すること public String getInfo() { return this.getInfo("%sは%s色のハムスターです。"); } public String getInfo(String format) { return String.format(format, this.name, this.color); }
58
デフォルトコンストラクター コンストラクターが明示的に定義されなかった場合、Javaは引数なしの空のコンストラクターを暗黙的に生成します。これをデフォルトコンストラクターと言います。
59
コンストラクターによく似たしくみ 初期化ブロックは、classブロック直下で名前なしのブロック({…})として表します。 public class Animal { String name; String color; { this.name = 'ニンザブロウ'; this.color = 'White'; } } 記法そのものはシンプルですが、コンストラクターに比べると、引数を渡すことすらできませんので、自由度もあまりありません。
60
一般的には、オブジェクトの初期化にはコンストラクターを利用し、コンストラクターを複数定義(オーバーロード)した場合に、重複してしまった処理だけを初期化ブロックとして切り出す、という使い方になるでしょう。
61
パッケージを含めたクラス名のこと
62
本来、クラスを一意に特定するためには、完全修飾名で記述しなければなりません。しかし、to.java.code.sample.basic.Animalのような名前を毎回記述するのは面倒です。 そこで、あらかじめ利用するパッケージをインポート(import)しておくことで、コード内ではパッケージを省略して記述できるようになります。 import com.example.mynavi.object.Animal; Animal a = new Animal(); ↓ com.example.mynavi.object.Animal a = new com.example.mynavi.objectAnimal();
63
パッケージ配下のすべてのクラスをまとめてインポートしたいときにアスタリスクでインポートするやり方 import com.example.mynavi.object.*; ただし、近年ではコード内で利用しているクラスを明確にするという意味で、できるだけオンデマンドインポートは利用しないのが慣例的です。
64
java.langパッケージは、頻繁に利用するという性質上、自動的にインポートされます。明示的にimport宣言する必要はありません。
65
import static命令を利用することで、クラスのメンバーを呼び出すこともできます。 以下はabsメソッドをインポートしている package com.example.mynavi.object; import static java.lang.Math.*; public class ClassStaticImport { public static void main(String[] args) { System.out.println(abs(-10)); // 結果:10 } } import static java.lang.Math.abs でも可能
66
できない。 staticな内部クラスは外部クラスのstaticなメンバーにのみアクセス可能なので、外部クラスのメンバーとの関係性は比較的薄くなり、通常の別のクラスとして宣言した場合に近くなります。
67
非staticな内部クラスは、インスタンス化に際して外部クラスのオブジェクトへの参照を保持するためにメモリーを消費すること。 また、この参照によって外部クラスのオブジェクトの破棄が妨げられることもあります。 なるほど、ガベージコレクションが働かなくなる可能性があるらしい 非staticな内部クラスを利用するのは、外部クラスのオブジェクトのインスタンスフィールドにアクセスしなければならない状況に限定すべきです。 // 外部クラス class OuterClass { private String str = "OuterClassの変数"; // 内部クラス class InnerClass { public void innerSample() { System.out.println(str); } } } public class Main { public static void main(String[] args) { // 外部クラスのインスタンスの生成 OuterClass oc = new OuterClass(); // 外部クラスのオブジェクトから内部クラスのインスタンスを生成 OuterClass.InnerClass ic = oc.new InnerClass(); ic.innerSample(); } }
68
外部クラスへのアクセス権をもつ静的クラス、またはオブジェクトを生成をしたいとき。 継承するほどでもない時に利用する
69
Java9で導入された。 パッケージを束ねる機能で、モジュール内のパッケージのアクセス権を以下のように制御するということができる。 モジュール内のパッケージに対して ・現在のモジュールの中でだけpublic ・特定のモジュールに対してだけpublic ・すべてのモジュールに対してpublic が設定できるようになる。
70
あるライブラリの中で利用しているパッケージのアクセス権を制御し、メインのプログラムからは不可視とすることができる。 従来のJavaでは 全てに対してpublicとなるため この制御ができなかった
71
モジュール化された。 > java –-list-modules java.base@13.0.1 java.compiler@13.0.1 java.datatransfer@13.0.1 java.desktop@13.0.1 java.instrument@13.0.1 java.logging@13.0.1 java.management@13.0.1 java.management.rmi@13.0.1 java.naming@13.0.1 java.net.http@13.0.1 …中略… jdk.rmic@13.0.1 jdk.scripting.nashorn@13.0.1 jdk.scripting.nashorn.shell@13.0.1 jdk.sctp@13.0.1 jdk.security.auth@13.0.1 jdk.security.jgss@13.0.1 jdk.unsupported@13.0.1 jdk.unsupported.desktop@13.0.1 jdk.xml.dom@13.0.1 jdk.zipfs@13.0.1
72
モジュール用のディレクトリを作成し、そのディレクトリにmodule-info.javaというファイルを作り、その他のソースファイルと共にコンパイルする。 module-info.javaには、以下の2点を記述する。 ・どのパッケージを公開するのか ・ほかのどのモジュールを使うのか module test { exports com.test; //exports パッケージ名 requires foo; //requires モジュール名 } 下記のような構成となる。 jp.mynavi.greeting/ └── src ├── jp │ └── mynavi │ └── imajava │ ├── hidden │ │ └── HiddenGreeting.java │ └── mylib │ └── Greeting.java └── module-info.java Greeting.java package jp.mynavi.imajava.mylib; public class Greeting { public static String hello(String name) { return "Hello " + name + "!"; } }
73
モジュールの世界では、デフォルトでは異なるモジュールにはアクセスできません 別のモジュールを利用したい場合には、モジュール定義ファイルにrequires宣言を追加してください。たとえば以下は、java.net.httpモジュールを利用する例です。 module-info.java module mynavi { requires java.net.http; } requires宣言なしにjava.net.httpモジュールにアクセスした場合、「The type java.net.http.HttpClient is not accessible」のようなエラーとなります。
74
別のモジュールであるにも関わらず、 requires宣言をしなくても、アクセスできる特別なモジュールとしてjava.baseモジュールがある
75
requires宣言では、そのモジュールが利用可能なモジュールしか宣言できない。 requires transitive宣言では、自モジュールがrequiresされた際、requires transitiveされたモジュールへのアクセス権を宣言元モジュールに引き継ぎができる。 →mod1モジュールは、java.net.http やjava.sqlモジュールが利用できる。 module mod1 { requires mod2; } module mod2 { requires transitive java.net.http; requires transitive java.sql; } この場合、mod1モジュールはmod2モジュール経由でjava.net.http/java.sqlモジュールに依存していますが、mod1側でこれらのモジュールをrequires宣言する必要はありません。 これが推移的な依存関係を宣言する、という意味です(よって、太字を削除した場合、mod1モジュールはjava.net.http/java.sqlモジュールを明示的にrequires宣言しなければなりません)。
76
モジュールに束ねられたパッケージは 非公開となるので、記述は不要
77
モジュール配下のパッケージは、デフォルトでモジュールプライベート(=モジュールの外からはアクセスできない)と見なされます。 モジュールの外からパッケージへのアクセスを許可するには、exportsで公開したいパッケージを宣言してください。 たとえば以下はmynaviモジュールからcom.example.mynavi.basicパッケージを公開する例です。 module mynavi { exports com.example.mynavi.basic; }
78
特定のモジュールに対してのみパッケージを公開したいならば、exports…to宣言を利用します。たとえば、以下はhoge/piyoモジュールに対してのみcom.example.mynavi.basicパッケージを公開する例です。 module mynavi { exports com.example.mynavi.basic to hoge, piyo; }
79
モジュール化するには、module-info.javaとソースファイルをコンパイルするファイルのパスとして、コンパイルする。コンパイル時には、javacコマンドの-dオプションを使う <構文> javac -d クラスファイルの出力先ディレクトリ コンパイルするファイルのパス <例> javac -d mods/test src/test/module-info.java src/test/com/sample/Main.java
80
モジュールの実行には、javaコマンドの--module-pathオプションでモジュールを探すためのモジュールパスを指定し、-mオプションで実行したいモジュールのクラスを指定する。 <構文> java --module-path モジュールのルートディレクトリ -m 実行したいモジュールのクラス <例> java --module-path mods -m test/com.sample.Main //testモジュールのcom.sample.Mainクラスを実行
81
モジュールはjarコマンドで1つにまとめることができる。 <構文> jar --create --file=jarファイル名 --main-class=エントリーポイントを持つクラス -C jarファイルに含めるファイルがあるディレクトリ <例> jar --create --file=mlib/test.jar --main-class=com.sample.Main -C mods/test
82
モジュールパスとは、モジュールの検索先を表すパスのことです。Eclipseであれば、プロジェクトのプロパティから[Javaのビルド・パス]-[ライブラリー]タブから確認できます。
83
非モジュールをモジュールとして扱えるようにするためのしくみが、自動モジュールです。 具体的には、モジュールパスに配置された.jarファイルで、モジュール定義ファイルを持たないコードは、自動モジュールと見なされます。
その他
その他
谷峻輔 · 12問 · 2年前その他
その他
12問 • 2年前LWC
LWC
谷峻輔 · 100問 · 2年前LWC
LWC
100問 • 2年前LWC2
LWC2
谷峻輔 · 28問 · 2年前LWC2
LWC2
28問 • 2年前Javascript
Javascript
谷峻輔 · 100問 · 2年前Javascript
Javascript
100問 • 2年前javascript2
javascript2
谷峻輔 · 58問 · 2年前javascript2
javascript2
58問 • 2年前js1 JavaScript の基礎
js1 JavaScript の基礎
谷峻輔 · 92問 · 2年前js1 JavaScript の基礎
js1 JavaScript の基礎
92問 • 2年前js2 コード品質、オブジェクト基本、データ型
js2 コード品質、オブジェクト基本、データ型
谷峻輔 · 100問 · 2年前js2 コード品質、オブジェクト基本、データ型
js2 コード品質、オブジェクト基本、データ型
100問 • 2年前js3 データ型
js3 データ型
谷峻輔 · 100問 · 2年前js3 データ型
js3 データ型
100問 • 2年前js4 データ型、関数の高度な機能
js4 データ型、関数の高度な機能
谷峻輔 · 100問 · 2年前js4 データ型、関数の高度な機能
js4 データ型、関数の高度な機能
100問 • 2年前js5 関数の高度な機能 オブジェクトプロパティの設定 プロトタイプ, 継承プロトタイプ, 継承、クラス
js5 関数の高度な機能 オブジェクトプロパティの設定 プロトタイプ, 継承プロトタイプ, 継承、クラス
谷峻輔 · 96問 · 2年前js5 関数の高度な機能 オブジェクトプロパティの設定 プロトタイプ, 継承プロトタイプ, 継承、クラス
js5 関数の高度な機能 オブジェクトプロパティの設定 プロトタイプ, 継承プロトタイプ, 継承、クラス
96問 • 2年前js6 クラス Promise, async/await
js6 クラス Promise, async/await
谷峻輔 · 100問 · 2年前js6 クラス Promise, async/await
js6 クラス Promise, async/await
100問 • 2年前js7 Promise, async/await、ジェネレータ, 高度なイテレーション、モジュール
js7 Promise, async/await、ジェネレータ, 高度なイテレーション、モジュール
谷峻輔 · 96問 · 2年前js7 Promise, async/await、ジェネレータ, 高度なイテレーション、モジュール
js7 Promise, async/await、ジェネレータ, 高度なイテレーション、モジュール
96問 • 2年前js8 その他
js8 その他
谷峻輔 · 57問 · 2年前js8 その他
js8 その他
57問 • 2年前Reactクイックスタート
Reactクイックスタート
谷峻輔 · 15問 · 2年前Reactクイックスタート
Reactクイックスタート
15問 • 2年前デザインパターン
デザインパターン
谷峻輔 · 5問 · 2年前デザインパターン
デザインパターン
5問 • 2年前承認申請
承認申請
谷峻輔 · 16問 · 2年前承認申請
承認申請
16問 • 2年前アプリケーションビルダー2
アプリケーションビルダー2
谷峻輔 · 100問 · 2年前アプリケーションビルダー2
アプリケーションビルダー2
100問 • 2年前アプリケーションビルダー3
アプリケーションビルダー3
谷峻輔 · 100問 · 2年前アプリケーションビルダー3
アプリケーションビルダー3
100問 • 2年前アプリケーションビルダー4
アプリケーションビルダー4
谷峻輔 · 100問 · 2年前アプリケーションビルダー4
アプリケーションビルダー4
100問 • 2年前アプリケーションビルダー5
アプリケーションビルダー5
谷峻輔 · 94問 · 2年前アプリケーションビルダー5
アプリケーションビルダー5
94問 • 2年前アプリケーションビルダー6
アプリケーションビルダー6
谷峻輔 · 100問 · 2年前アプリケーションビルダー6
アプリケーションビルダー6
100問 • 2年前アプリケーションビルダー7
アプリケーションビルダー7
谷峻輔 · 100問 · 2年前アプリケーションビルダー7
アプリケーションビルダー7
100問 • 2年前アプリケーションビルダー8
アプリケーションビルダー8
谷峻輔 · 98問 · 2年前アプリケーションビルダー8
アプリケーションビルダー8
98問 • 2年前アプリケーションビルダー9
アプリケーションビルダー9
谷峻輔 · 70問 · 2年前アプリケーションビルダー9
アプリケーションビルダー9
70問 • 2年前フロー
フロー
谷峻輔 · 42問 · 2年前フロー
フロー
42問 • 2年前レポート、ダッシュボード
レポート、ダッシュボード
谷峻輔 · 60問 · 2年前レポート、ダッシュボード
レポート、ダッシュボード
60問 • 2年前SalesCloud
SalesCloud
谷峻輔 · 18問 · 2年前SalesCloud
SalesCloud
18問 • 2年前標準機能
標準機能
谷峻輔 · 72問 · 2年前標準機能
標準機能
72問 • 2年前宣言的開発
宣言的開発
谷峻輔 · 8問 · 2年前宣言的開発
宣言的開発
8問 • 2年前数式、人力規則
数式、人力規則
谷峻輔 · 18問 · 2年前数式、人力規則
数式、人力規則
18問 • 2年前アクセスレベル
アクセスレベル
谷峻輔 · 63問 · 2年前アクセスレベル
アクセスレベル
63問 • 2年前データ型変換
データ型変換
谷峻輔 · 22問 · 2年前データ型変換
データ型変換
22問 • 2年前オブジェクト、項目
オブジェクト、項目
谷峻輔 · 91問 · 2年前オブジェクト、項目
オブジェクト、項目
91問 • 2年前アプリ、タブ
アプリ、タブ
谷峻輔 · 92問 · 2年前アプリ、タブ
アプリ、タブ
92問 • 2年前自動化
自動化
谷峻輔 · 17問 · 2年前自動化
自動化
17問 • 2年前組織、開発モデル
組織、開発モデル
谷峻輔 · 65問 · 2年前組織、開発モデル
組織、開発モデル
65問 • 2年前ボタン、アクション
ボタン、アクション
谷峻輔 · 69問 · 2年前ボタン、アクション
ボタン、アクション
69問 • 2年前インテグレーション
インテグレーション
谷峻輔 · 40問 · 2年前インテグレーション
インテグレーション
40問 • 2年前ページレイアウト、リストビュー、レコードタイプ、プロセス
ページレイアウト、リストビュー、レコードタイプ、プロセス
谷峻輔 · 46問 · 2年前ページレイアウト、リストビュー、レコードタイプ、プロセス
ページレイアウト、リストビュー、レコードタイプ、プロセス
46問 • 2年前標準オブジェクト
標準オブジェクト
谷峻輔 · 42問 · 2年前標準オブジェクト
標準オブジェクト
42問 • 2年前ServiceCloud
ServiceCloud
谷峻輔 · 16問 · 2年前ServiceCloud
ServiceCloud
16問 • 2年前ユーザ、ライセンス、プロファイル、権限セット
ユーザ、ライセンス、プロファイル、権限セット
谷峻輔 · 41問 · 2年前ユーザ、ライセンス、プロファイル、権限セット
ユーザ、ライセンス、プロファイル、権限セット
41問 • 2年前データインポート、エクスポート
データインポート、エクスポート
谷峻輔 · 3回閲覧 · 12問 · 2年前データインポート、エクスポート
データインポート、エクスポート
3回閲覧 • 12問 • 2年前Chatter
Chatter
谷峻輔 · 21問 · 2年前Chatter
Chatter
21問 • 2年前承認申請
承認申請
谷峻輔 · 15問 · 2年前承認申請
承認申請
15問 • 2年前フロー
フロー
谷峻輔 · 44問 · 2年前フロー
フロー
44問 • 2年前レポート、ダッシュボード
レポート、ダッシュボード
谷峻輔 · 65問 · 2年前レポート、ダッシュボード
レポート、ダッシュボード
65問 • 2年前SalesCloud
SalesCloud
谷峻輔 · 18問 · 2年前SalesCloud
SalesCloud
18問 • 2年前標準機能
標準機能
谷峻輔 · 72問 · 2年前標準機能
標準機能
72問 • 2年前宣言的開発
宣言的開発
谷峻輔 · 8問 · 2年前宣言的開発
宣言的開発
8問 • 2年前アクセスレベル
アクセスレベル
谷峻輔 · 52問 · 2年前アクセスレベル
アクセスレベル
52問 • 2年前数式、人力規則
数式、人力規則
谷峻輔 · 17問 · 2年前数式、人力規則
数式、人力規則
17問 • 2年前データ型変換
データ型変換
谷峻輔 · 22問 · 2年前データ型変換
データ型変換
22問 • 2年前オブジェクト、項目
オブジェクト、項目
谷峻輔 · 89問 · 2年前オブジェクト、項目
オブジェクト、項目
89問 • 2年前アプリ、タブ
アプリ、タブ
谷峻輔 · 100問 · 2年前アプリ、タブ
アプリ、タブ
100問 • 2年前自動化
自動化
谷峻輔 · 18問 · 2年前自動化
自動化
18問 • 2年前組織、開発モデル
組織、開発モデル
谷峻輔 · 60問 · 2年前組織、開発モデル
組織、開発モデル
60問 • 2年前ボタン、アクション
ボタン、アクション
谷峻輔 · 69問 · 2年前ボタン、アクション
ボタン、アクション
69問 • 2年前インテグレーション
インテグレーション
谷峻輔 · 40問 · 2年前インテグレーション
インテグレーション
40問 • 2年前ページレイアウト、リストビュー、レコードタイプ、プロセス
ページレイアウト、リストビュー、レコードタイプ、プロセス
谷峻輔 · 44問 · 2年前ページレイアウト、リストビュー、レコードタイプ、プロセス
ページレイアウト、リストビュー、レコードタイプ、プロセス
44問 • 2年前標準オブジェクト
標準オブジェクト
谷峻輔 · 32問 · 2年前標準オブジェクト
標準オブジェクト
32問 • 2年前ServiceCloud
ServiceCloud
谷峻輔 · 17問 · 2年前ServiceCloud
ServiceCloud
17問 • 2年前ユーザ、ライセンス、プロファイル、権限セット
ユーザ、ライセンス、プロファイル、権限セット
谷峻輔 · 18問 · 2年前ユーザ、ライセンス、プロファイル、権限セット
ユーザ、ライセンス、プロファイル、権限セット
18問 • 2年前データインポート、エクスポート
データインポート、エクスポート
谷峻輔 · 11問 · 2年前データインポート、エクスポート
データインポート、エクスポート
11問 • 2年前Chatter
Chatter
谷峻輔 · 21問 · 2年前Chatter
Chatter
21問 • 2年前一時
一時
谷峻輔 · 89問 · 2年前一時
一時
89問 • 2年前一時2
一時2
谷峻輔 · 29問 · 2年前一時2
一時2
29問 • 2年前js9 ドキュメント
js9 ドキュメント
谷峻輔 · 80問 · 2年前js9 ドキュメント
js9 ドキュメント
80問 • 2年前問題一覧
1
仮想マシン プラットフォームに依存しない。
2
Java SE Javaの基本となるエディション Java EE サーバーサイド開発のための企業向けエディション Java ME 組み込みシステムに利用されるエディション
3
Java開発環境 Javaアプリを実行するためのJava仮想マシンをはじめ、コンパイラーやデバッガーなどのツールを備えている
4
クラス
5
命名に際しては、他のライブラリとの重複を避けるために、ドメイン名を逆にしたものを頭に付与するようにしてください。 mynavi.example.comなら 「com.example.mynavi」がパッケージとなる
6
mainというメソッドだけは特殊で、アプリの開始位置を表します。Javaはアプリを起動したときに、まずmainメソッドを探して、その配下のコードから実行するのです。このようなメソッドのことをエントリーポイントと言います。
7
Javaのソースコードが.javaファイル コンパイルしたものが、.classファイル
8
javac option src option:コマンドオプション src:ソースファイル(.javaファイル) 例 javac -d C:data -classpath .;C:data -encoding Windows-31J tojavacodesamplebasicHelloSample.java https://java-code.jp/55
9
javac コマンドのオプションを指定 -classpath パス 関連するクラスファイルの検索先。複数指定時は、セミコロン(Windows)、またはコロン(Unix)区切り -classpathオプションは、そのソースをコンパイルするために必要なクラスファイル、またはJARファイルの場所(パス)を表すものです
10
都度設定するのが面倒である場合には、環境変数CLASSPATHであらかじめ指定しておいても構いません。
11
java option clazz params option:コマンドオプション clazz:実行するクラス params:パラメーター https://java-code.jp/53
12
jarファイルはコンパイル済みのclassファイルや画像などのファイルを、zip形式に圧縮してまとめたファイル Javaでアプリケーションを配布する際には、JAR形式でまとめたものを配布するのが一般的です。
13
javaコマンドのjar オプションを指定する たとえば以下は、Hello.jarを実行する例です。パラメーターとして「山田」をセットします。 > java -jar Hello.jar "山田"
14
jarファイルからアプリケーションを起動するには、 .jarファイルに以下のような内容のマニフェストファイル(/META-INF/MANIFEST.MF)を組み込んでおく必要があります。 Main-Classパラメータには、起動するクラスを指定します。 Main-Class: to.java.code.sample.basic.HelloSample
15
jar option jfile clazz… option:コマンドオプション jfile:作成するjarファイルの名前 clazz:含めるクラスファイル(複数指定可) たとえば以下は、あらかじめ用意したクラスファイルとマニフェストファイル(MANIFEST.MF)をもとに、Hello.jarを作成する例です。 > jar cvfm Hello.jar to¥java¥code¥sample¥basic¥META-INF¥MANIFEST.MF to¥java¥code¥sample¥basic¥*.class https://java-code.jp/51 https://java-reference.com/command-jar/
16
javadocコマンドは、ソースファイルに記述されたドキュメンテーションコメントからAPIドキュメントを作成します。 公式サイトで公開されているAPIドキュメントも、もともとはjavadocコマンドで作成されたものです。 APIドキュメントをHTMLで確認できる。 コマンド詳細 javadoc option src option:コマンドオプション src:ドキュメントのもととなるソースファイル https://java-code.jp/49 https://qiita.com/maple_syrup/items/96f7142222cd4eb5c9de
17
入力・評価・出力のループのこと。インタプリタにおいて、ユーザーとインタプリタが対話的にコード片を実行できるもの
18
jshell option option:コマンドオプション Java 9で追加されています。 Java 9以前では、簡単なコードを利用するにもコンパイル&実行という手順を踏む必要がありましたが、JShellを利用することでその場で即座に実行できます。 https://java-code.jp/1272
19
JShellのプロンプトは「jshell> 」です。ライブラリを利用する際には、普通のコードと同じくimport命令でクラスをインポートします(①)。 以降のコード(②~③)は、暗黙的にmainメソッド配下のコードと見なされます。また、変数の宣言も不要です。生成されたオブジェクトは、そのまま自動変数$1、$2…に順に代入されるからです。③でも②で生成したArrayListオブジェクトに変数$2経由でアクセスできています。 JShellを終了するには、/exitメタコマンドを利用します。
20
camelCase記法:先頭文字は小文字、単語の区切りは大文字(myNameなど) Pascal記法:先頭文字は大文字、単語の区切りも大文字(MyNameなど) アンダースコア記法:すべての文字は小文字、または大文字。単語の区切りはアンダースコア(MY_NAME、my_nameなど)
21
コンパイラが、初期値から型を推論すること。 つまり、データ型を指定しない変数宣言ができる。 package com.example.mynavi.basic; public class VarBasic { public static void main(String[] args) { var num = 3.14; System.out.println(num); // 結果:3.14 } } 上の例であれば、変数の型は推論された結果は、doubleです。
22
1 型推論によってコンパイラに定められた型は、変更不可能。 (スクリプトではないからしょうがない) 以下のようなコードはコンパイルエラーとなります。変数dataの型は、宣言時にdoubleで決まるので、これにString型の値を代入することはできません。 var data = 3.14; data = "Javaコード入門"; 2 初期値は省略不可 3 複数の変数を列挙できない var num1 = 1 , num2 = 2; 4 ローカル変数にしか使えない。 フィールド宣言では、初期値の有無に関わらず、varキーワードは利用できません。
23
カンマで区切る double num = 3.14, num2 = 1.414;
24
Java10以降
25
final public static void main(String[] args) { final String GREETING_MSG = "こんにちは、世界!"; System.out.println(GREETING_MSG); }
26
byte バイトデータを示す型 1バイト符号付き整数(-128~127) short 2バイト符号付き整数(-32768~32767) int 4バイト符号付き整数(-2147483648~2147483647) long 8バイト符号付き整数(-9223372036854775808~9223372036854775807)
27
基本はint型を利用し、それで不足の場合のみlong型を利用してください。short型を利用する機会はほとんどありません。
28
二進数は0b、八進数は0、十六進数は0xを付与する int i2 = 010; // 8進数(0~) int i3 = 0xFF; // 16進数(0x~) int i4 = 0b0010; // 2進数(0b~。JavaSE 7以降)
29
int型 System.out.println(21474);
30
「L」(long型)を値の末尾に付与してください。 System.out.println(2147483648L);
31
float … 4バイト浮動小数点数(±1.40239846×10^-45~±3.40282347×10^38) double … 8バイト浮動小数点数 (±4.94065645841246544×10^-324~±1.79769313486231570×10^308)
32
double
33
float値を表すには、リテラルのサフィックスとして「f」または「F」を指定してください。 float f = 1.1234f;
34
浮動小数点型では指数表現も利用できます。「1.234E5」は「1.234×10^5」の意味です。大文字小文字を区別しません。 double d1 = 1.1234; double d2 = 1.1234E5; // 指数表現
35
char … UNICODE文字(u0000~uffff) リテラル値はシングルクォートで括ります。文字そのものを指定する他、uxxxxの形式で文字を表すこともできます。 char c1 = 'あ'; char c2 = '¥u5f01'; // 16進数の文字コード表現 ちなみに文字列型はクラスで基本型ではないとのこと
36
int[] data = new int[5]; int[] data2 = { 1, 2, 3 };
37
int[][] data3 = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; System.out.println(data3[0][2]);
38
拡大変換可能だが縮小変換はそのままでは不可 基本型では、小さな型を大きな型に代入可能(たとえば、int型の値をlong型に代入) long型の値がint型に格納はできない
39
「(型名)」を付与するだけ long l = 50; int i = (int)l; System.out.println(1+i);
40
instanceof演算子を利用する。 これは、オブジェクトが指定されたクラス、またはスーパークラスのインスタンスであるかを判定します。 クラス型のキャストにあたっては、あらかじめinstanceof演算子で実際の型を判定しておくことで、安全にキャストを実行できます。 Animal c = new Cat(); ※親の型でインスタンス可能! if (c instanceof Hamster) { Hamster h = (Hamster)c; } ※ハムスターもアニマル型を継承してると思うので、型変換可能
41
x++は代入した後にインクリメントしますが、++xは代入する前にインクリメントします。 int x = 1; int y = x++; System.out.println("yは" + y); // 結果:yは1 int a = 1; int b = ++a; System.out.println("bは" + b); // 結果:bは2
42
浮動小数点数は内部的に二進数で演算されてしまう。 例えば10進数の0.1ですら、2進数では0.000110011…のような無限循環小数となってしまう。 つまり計算に不向き。 System.out.println(1.0 - 0.1 - 0.2 - 0.3); // 結果:0.39999999999999997 といった感じになる。
43
厳密な結果を得る場合には、BigDecimalというクラスを利用してください BigDecimal bd1 = new BigDecimal("1.0"); BigDecimal bd2 = new BigDecimal("0.1"); BigDecimal bd3 = new BigDecimal("0.2"); BigDecimal bd4 = new BigDecimal("0.3"); System.out.println(bd1.subtract(bd2).subtract(bd3).subtract(bd4)); // 結果:0.4 だいぶめんどい subtractメソッドが減算を意味します。その他、add(加算)、multiply(積算)、divide(除算)などを利用できます
44
文字列連結演算子になる。 System.out.println("x" + 1); // 結果:x1 System.out.println(1 + "x"); // 結果:1x System.out.println("2" + 1); // 結果:21 代入
45
基本型、参照型
46
基本型は値渡し 参照型は参照の値渡し javascriptとおなじ https://yoshitaro-yoyo.hatenablog.com/entry/only_value_passing_in_java#Java%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%8F%82%E7%85%A7%E5%9E%8B ちなみに参照渡しとは 実引数と仮引数が完全に同じ実体を表すように引数を受け渡すこと 再代入すると、参照の変更が行われるのが参照渡し、そのまま再代入されるのが参照の値渡しということらしい
47
正しくは同一性(Identity)――同じモノであるかを確認するための演算子 基本型では、値が等しければ同じものであるので問題ありません。 しかし、参照型では同じ値であっても、同じものであるとは限りません。たまたま同じ値を持っているだけで、異なる場所に格納されている異なるものである可能性があるからです。 つまり、厳密な等価演算子である。
48
参照型を比較するには、同値性(Equivalence)を確認するためのequalsメソッドを利用してください。 System.out.println(Arrays.equals(data1, data2));
49
// 単一行コメントです。 /* 複数行の コメントです。 */ /** * javadocコマンドでドキュメント化されるコメントです。 */
50
Java12以降に追加された。 まだプレビュー状態らしい (1)switch式 switchが式として表現できます。つまり、文の中でswitch命令を記述できます。なお、switch式では値を返さないパターンがあってはいけないので、default句は省略不可です。 (2)アロー演算子 case/default句を「値 -> 対応する式」の形式で表せます。アロー演算子では、句の末尾のbreak命令は不要となります。 (3)case値の複数列記 case句に、カンマ区切りで値を列記できます。従来のようにcase句そのものを列記する必要はありません。 String lang = "Ruby"; @SuppressWarnings("preview") String category = switch(lang) { case "PHP", "Python", "Ruby" -> "スクリプト言語"; case "Java", "C#", "C" -> "プログラミング言語"; default -> "不明"; }; System.out.println(category); // 結果:スクリプト言語 また、Preview版を利用する場合は、@SuppressWarningsアノテーションでPreviewに対する警告を無効化しておきましょう
51
ある 多重代入可能 a = b = c = 10; つまり文中で代入できるってことね
52
ある。 int a = 1, b = 2; for文でもつかえる。 for(int i = 0, j = 10; i < 5; i++, j++) { System.out.println(i * j); }
53
ラベル構文を利用することで、入れ子になったループをまとめて脱出することもできます。 ラベルは脱出したいループの先頭に付与します(この場合は「ext」) public static void main(String[] args) { ext : for (int i = 1; i < 10; i++) { for (int j = 1; j < 10; j++) { if (i * j > 50) { break ext; } System.out.print((i * j) + "/"); } System.out.println(); } }
54
クラス直下にたいして フィールド宣言の頭にstatic final修飾子を付与することで宣言できます public static final double E = 2.7182818284590452354; public static final double PI = 3.14159265358979323846; 定数であることはfinal修飾子だけで表現できますが、static修飾子を付けるのがお作法です。static修飾子を付与することで、インスタンス生成のたびに同じ値をインスタンスにコピーするのを防ぐことができます
55
型名のうしろに「…」を付与することで、可変長引数を表す 可変長引数とは呼び出し側で自由に引数の数を変えられる引数のこと package com.example.mynavi.object; public class Util { public static double sum(double... values) { double result = 0; for (double value : values) { result += value; } return result; } } 呼び出し方はこう System.out.println(Util.sum(10, 30, 50)); // 結果:90.0 System.out.println(Util.sum(10, 30, 50, 70)); // 結果:160.0
56
可変長引数は、内部的には配列として処理されます。前問題のサンプルでは引数valuesを拡張for命令で順に取り出し、順に足しこんでいるわけです。
57
同じ名前で、引数の型、並びだけが異なる」メソッドを複数定義すること public String getInfo() { return this.getInfo("%sは%s色のハムスターです。"); } public String getInfo(String format) { return String.format(format, this.name, this.color); }
58
デフォルトコンストラクター コンストラクターが明示的に定義されなかった場合、Javaは引数なしの空のコンストラクターを暗黙的に生成します。これをデフォルトコンストラクターと言います。
59
コンストラクターによく似たしくみ 初期化ブロックは、classブロック直下で名前なしのブロック({…})として表します。 public class Animal { String name; String color; { this.name = 'ニンザブロウ'; this.color = 'White'; } } 記法そのものはシンプルですが、コンストラクターに比べると、引数を渡すことすらできませんので、自由度もあまりありません。
60
一般的には、オブジェクトの初期化にはコンストラクターを利用し、コンストラクターを複数定義(オーバーロード)した場合に、重複してしまった処理だけを初期化ブロックとして切り出す、という使い方になるでしょう。
61
パッケージを含めたクラス名のこと
62
本来、クラスを一意に特定するためには、完全修飾名で記述しなければなりません。しかし、to.java.code.sample.basic.Animalのような名前を毎回記述するのは面倒です。 そこで、あらかじめ利用するパッケージをインポート(import)しておくことで、コード内ではパッケージを省略して記述できるようになります。 import com.example.mynavi.object.Animal; Animal a = new Animal(); ↓ com.example.mynavi.object.Animal a = new com.example.mynavi.objectAnimal();
63
パッケージ配下のすべてのクラスをまとめてインポートしたいときにアスタリスクでインポートするやり方 import com.example.mynavi.object.*; ただし、近年ではコード内で利用しているクラスを明確にするという意味で、できるだけオンデマンドインポートは利用しないのが慣例的です。
64
java.langパッケージは、頻繁に利用するという性質上、自動的にインポートされます。明示的にimport宣言する必要はありません。
65
import static命令を利用することで、クラスのメンバーを呼び出すこともできます。 以下はabsメソッドをインポートしている package com.example.mynavi.object; import static java.lang.Math.*; public class ClassStaticImport { public static void main(String[] args) { System.out.println(abs(-10)); // 結果:10 } } import static java.lang.Math.abs でも可能
66
できない。 staticな内部クラスは外部クラスのstaticなメンバーにのみアクセス可能なので、外部クラスのメンバーとの関係性は比較的薄くなり、通常の別のクラスとして宣言した場合に近くなります。
67
非staticな内部クラスは、インスタンス化に際して外部クラスのオブジェクトへの参照を保持するためにメモリーを消費すること。 また、この参照によって外部クラスのオブジェクトの破棄が妨げられることもあります。 なるほど、ガベージコレクションが働かなくなる可能性があるらしい 非staticな内部クラスを利用するのは、外部クラスのオブジェクトのインスタンスフィールドにアクセスしなければならない状況に限定すべきです。 // 外部クラス class OuterClass { private String str = "OuterClassの変数"; // 内部クラス class InnerClass { public void innerSample() { System.out.println(str); } } } public class Main { public static void main(String[] args) { // 外部クラスのインスタンスの生成 OuterClass oc = new OuterClass(); // 外部クラスのオブジェクトから内部クラスのインスタンスを生成 OuterClass.InnerClass ic = oc.new InnerClass(); ic.innerSample(); } }
68
外部クラスへのアクセス権をもつ静的クラス、またはオブジェクトを生成をしたいとき。 継承するほどでもない時に利用する
69
Java9で導入された。 パッケージを束ねる機能で、モジュール内のパッケージのアクセス権を以下のように制御するということができる。 モジュール内のパッケージに対して ・現在のモジュールの中でだけpublic ・特定のモジュールに対してだけpublic ・すべてのモジュールに対してpublic が設定できるようになる。
70
あるライブラリの中で利用しているパッケージのアクセス権を制御し、メインのプログラムからは不可視とすることができる。 従来のJavaでは 全てに対してpublicとなるため この制御ができなかった
71
モジュール化された。 > java –-list-modules java.base@13.0.1 java.compiler@13.0.1 java.datatransfer@13.0.1 java.desktop@13.0.1 java.instrument@13.0.1 java.logging@13.0.1 java.management@13.0.1 java.management.rmi@13.0.1 java.naming@13.0.1 java.net.http@13.0.1 …中略… jdk.rmic@13.0.1 jdk.scripting.nashorn@13.0.1 jdk.scripting.nashorn.shell@13.0.1 jdk.sctp@13.0.1 jdk.security.auth@13.0.1 jdk.security.jgss@13.0.1 jdk.unsupported@13.0.1 jdk.unsupported.desktop@13.0.1 jdk.xml.dom@13.0.1 jdk.zipfs@13.0.1
72
モジュール用のディレクトリを作成し、そのディレクトリにmodule-info.javaというファイルを作り、その他のソースファイルと共にコンパイルする。 module-info.javaには、以下の2点を記述する。 ・どのパッケージを公開するのか ・ほかのどのモジュールを使うのか module test { exports com.test; //exports パッケージ名 requires foo; //requires モジュール名 } 下記のような構成となる。 jp.mynavi.greeting/ └── src ├── jp │ └── mynavi │ └── imajava │ ├── hidden │ │ └── HiddenGreeting.java │ └── mylib │ └── Greeting.java └── module-info.java Greeting.java package jp.mynavi.imajava.mylib; public class Greeting { public static String hello(String name) { return "Hello " + name + "!"; } }
73
モジュールの世界では、デフォルトでは異なるモジュールにはアクセスできません 別のモジュールを利用したい場合には、モジュール定義ファイルにrequires宣言を追加してください。たとえば以下は、java.net.httpモジュールを利用する例です。 module-info.java module mynavi { requires java.net.http; } requires宣言なしにjava.net.httpモジュールにアクセスした場合、「The type java.net.http.HttpClient is not accessible」のようなエラーとなります。
74
別のモジュールであるにも関わらず、 requires宣言をしなくても、アクセスできる特別なモジュールとしてjava.baseモジュールがある
75
requires宣言では、そのモジュールが利用可能なモジュールしか宣言できない。 requires transitive宣言では、自モジュールがrequiresされた際、requires transitiveされたモジュールへのアクセス権を宣言元モジュールに引き継ぎができる。 →mod1モジュールは、java.net.http やjava.sqlモジュールが利用できる。 module mod1 { requires mod2; } module mod2 { requires transitive java.net.http; requires transitive java.sql; } この場合、mod1モジュールはmod2モジュール経由でjava.net.http/java.sqlモジュールに依存していますが、mod1側でこれらのモジュールをrequires宣言する必要はありません。 これが推移的な依存関係を宣言する、という意味です(よって、太字を削除した場合、mod1モジュールはjava.net.http/java.sqlモジュールを明示的にrequires宣言しなければなりません)。
76
モジュールに束ねられたパッケージは 非公開となるので、記述は不要
77
モジュール配下のパッケージは、デフォルトでモジュールプライベート(=モジュールの外からはアクセスできない)と見なされます。 モジュールの外からパッケージへのアクセスを許可するには、exportsで公開したいパッケージを宣言してください。 たとえば以下はmynaviモジュールからcom.example.mynavi.basicパッケージを公開する例です。 module mynavi { exports com.example.mynavi.basic; }
78
特定のモジュールに対してのみパッケージを公開したいならば、exports…to宣言を利用します。たとえば、以下はhoge/piyoモジュールに対してのみcom.example.mynavi.basicパッケージを公開する例です。 module mynavi { exports com.example.mynavi.basic to hoge, piyo; }
79
モジュール化するには、module-info.javaとソースファイルをコンパイルするファイルのパスとして、コンパイルする。コンパイル時には、javacコマンドの-dオプションを使う <構文> javac -d クラスファイルの出力先ディレクトリ コンパイルするファイルのパス <例> javac -d mods/test src/test/module-info.java src/test/com/sample/Main.java
80
モジュールの実行には、javaコマンドの--module-pathオプションでモジュールを探すためのモジュールパスを指定し、-mオプションで実行したいモジュールのクラスを指定する。 <構文> java --module-path モジュールのルートディレクトリ -m 実行したいモジュールのクラス <例> java --module-path mods -m test/com.sample.Main //testモジュールのcom.sample.Mainクラスを実行
81
モジュールはjarコマンドで1つにまとめることができる。 <構文> jar --create --file=jarファイル名 --main-class=エントリーポイントを持つクラス -C jarファイルに含めるファイルがあるディレクトリ <例> jar --create --file=mlib/test.jar --main-class=com.sample.Main -C mods/test
82
モジュールパスとは、モジュールの検索先を表すパスのことです。Eclipseであれば、プロジェクトのプロパティから[Javaのビルド・パス]-[ライブラリー]タブから確認できます。
83
非モジュールをモジュールとして扱えるようにするためのしくみが、自動モジュールです。 具体的には、モジュールパスに配置された.jarファイルで、モジュール定義ファイルを持たないコードは、自動モジュールと見なされます。