74e62a0eb030563dcbd0b2de5133e03358126d63
[scilab.git] / scilab / modules / external_objects_java / help / ja_JP / 02-getting-started.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 <!--
4 *
5 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
6 * Copyright (C) 2013 - S/E - Sylvestre Ledru
7 * Copyright (C) 2012 - CNES - Simon Billemont
8 *
9  * Copyright (C) 2012 - 2016 - Scilab Enterprises
10  *
11  * This file is hereby licensed under the terms of the GNU GPL v2.0,
12  * pursuant to article 5.3.4 of the CeCILL v.2.1.
13  * This file was originally licensed under the terms of the CeCILL v2.1,
14  * and continues to be available under such terms.
15  * For more information, see the COPYING file which you should have received
16  * along with this program.
17 *
18 *
19 -->
20
21 <refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" version="5.0-subset Scilab" xml:lang="ja" xml:id="jims-getting-started-2">
22
23     <refnamediv>
24
25         <refname>入門 - 第2ステップ</refname>
26
27         <refpurpose>Java Scilab バインディングを使用するには?</refpurpose>
28
29     </refnamediv>
30
31     <refsection>
32
33         <title>説明</title>
34
35         <para>
36
37             このチュートリアルは,
38
39             <link linkend="jims-getting-started">第1ステップ</link>の続きです.
40
41         </para>
42
43     </refsection>
44
45     <refsection>
46
47         <title>例 3: Scilabvで Java オブジェクトを使用する</title>
48
49         <para>
50
51             この例では,より高度に抽象化された一連のJavaオブジェクトを
52
53             定義します. 次に, Javaスクリプト言語の一種としてScilabを使用して
54
55             これらのオブジェクトに様々な操作を行います.
56
57             以下の様なJavaの広範な機能を紹介します;
58
59             staticメソッド (Factory construct), Enums, 簡単なポリモーフィズム,
60
61             メンバ/メソッドのスコープ.
62         </para>
63
64         <para>
65
66             この広範な機能は,簡単な家を記述する7つの簡単なクラスにより示されます;
67
68         </para>
69
70         <programlisting role="java"><![CDATA[
71 // House.java という名前で保存
72 package com.foo;
73
74 import java.util.Arrays;
75 import java.util.LinkendList;
76 import java.util.List;
77
78 public class House {
79
80         private Color                   color;
81         private Door                    door;
82         private List<IWindow>   windows = new LinkendList<IWindow>();
83
84         public House(Color color, Door door, IWindow... windows) {
85                 this.color = color;
86                 this.door = door;
87                 this.windows.addAll(Arrays.asList(windows));
88         }
89
90         public void repaint() {
91                 swapDoorHouseColor();
92         }
93
94         private void swapDoorHouseColor() {
95                 Color doorColor = door.getColor();
96                 door.repaint(color);
97                 color = doorColor;
98         }
99
100         public void addWindow(IWindow window) {
101                 windows.add(window);
102         }
103
104         public void replaceDoor(Door newDoor) {
105                 this.door = newDoor;
106         }
107
108         @Override
109         public String toString() {
110                 return String.format(
111                                 "This is a house painted in %s, has a %s door, and %d windows",
112                                 color.getDescr(), door.getColor().getDescr(), windows.size());
113         }
114 }
115       ]]></programlisting>
116
117         <programlisting role="java"><![CDATA[
118 package com.foo;
119
120 public class HouseFactory {
121
122         public static House basicHouse() {
123                 Door door = new Door(Color.WHITE);
124                 IWindow window = new RectangularWindow(2, 0.8);
125                 return new House(Color.WHITE, door, window);
126         }
127
128         public static House flashyHouse() {
129                 Door door = new Door(Color.random());
130                 IWindow window = new CircularWindow(1.2);
131                 return new House(Color.random(), door, window);
132         }
133 }
134       ]]></programlisting>
135
136         <programlisting role="java"><![CDATA[
137
138 package com.foo;
139
140 import java.util.Random;
141
142 public enum Color {
143
144         BLACK("black"), BLUE("blue"), BROWN("brown"), GREEN("green"),
145         ORANGE("orange"), RED("red"), WHITE("white"), YELLOW("yellow");
146
147         public String   descr;
148
149         private Color(String s) {
150                 descr = s;
151         }
152
153         public String getDescr() {
154                 return descr;
155         }
156
157         public static Color random() {
158                 Color[] allColors = values();
159                 return allColors[new Random().nextInt(values().length)];
160         }
161 }      ]]></programlisting>
162
163         <programlisting role="java"><![CDATA[
164
165 package com.foo;
166
167 public class Door {
168
169         private Color   color;
170
171         public Door(Color color) {
172                 this.color = color;
173         }
174
175         public Color getColor() {
176                 return color;
177         }
178
179         public void repaint(Color newColor) {
180                 color = newColor;
181         }
182 }
183       ]]></programlisting>
184
185         <programlisting role="java"><![CDATA[
186 package com.foo;
187
188 public interface IWindow {
189
190         double getWindowArea();
191
192 }
193       ]]></programlisting>
194
195         <programlisting role="java"><![CDATA[
196 package com.foo;
197
198 public class RectangularWindow implements IWindow {
199
200         double  length;
201         double  width;
202
203         public RectangularWindow(double length, double width) {
204                 this.length = length;
205                 this.width = width;
206         }
207
208         public double getWindowArea() {
209                 return length * width;
210         }
211 }
212       ]]></programlisting>
213
214         <programlisting role="java"><![CDATA[
215 package com.foo;
216
217 public class CircularWindow implements IWindow {
218
219         double  radius;
220
221         public CircularWindow(double radius) {
222                 this.radius = radius;
223         }
224
225         public double getWindowArea() {
226                 return Math.PI * radius * radius;
227         }
228 }
229       ]]></programlisting>
230
231
232
233         <programlisting role="example"><![CDATA[
234 // この例はScilabディストリビューションに含まれます.
235 directory=SCI+"/modules/external_objects_java/examples/com/foo/"
236 // これらを全てコンパイルします
237 jcompile(ls(directory + "/*.java"))
238       ]]></programlisting>
239
240         <para>
241
242             まず, 基本となるfactory houseを構築しましょう.
243
244             このため, HouseFactory をインポートし, 静的メソッドbasicHouse()
245
246             を呼び出す必要があります.
247
248         </para>
249
250         <screen>
251
252             -->jimport("com.foo.HouseFactory")
253
254
255
256             -->house = HouseFactory.basicHouse()
257
258             house  =
259
260
261
262             This is a house painted in white, has a white door, and 1 windows
263
264
265
266         </screen>
267
268         <para>
269
270             これは, 静的メソッドをJavaと同様にコールできることを示します.
271
272             これは, "jinvoke(HouseFactory, 'basicHouse')"  と等価であることも
273
274             頭に入れておいてください.
275
276
277
278             オブジェクトのメッセージも以下のように交換できます:
279
280             <screen>
281
282                 com.foo.House@ae8022
283
284                 To
285
286                 This is a house painted in white, has a white door, and 1 windows
287
288             </screen>
289
290             これは, Houseクラスが標準で \cmd[toString] メソッドを有するためです. この <literal>toString</literal>は,この表現を生成する際に使用されます. <link linkend="jgetclassname">jgetclassname</link> を呼び出すことにより, この場合も Houseオブジェクトの実際の型(クラス)を取得できます.
291
292             <screen>
293
294                 -->jgetclassname(house)
295
296                 ans  =
297
298
299
300                 com.foo.House
301
302             </screen>
303
304
305
306             更に興味深いのは,HouseをScilabに直接インポートせずに,家の説明が入手できたことです!
307
308             家が構築されたので,この家に別の窓を追加してみましょう. このため, 新しい窓を作成し,   <literal>addWindow(IWindow)</literal>関数により家に追加します. <literal>IWindow</literal>は窓に関する抽象化された説明で, 直接インスタンス化することはできません. しかし, 構築時に以下の2種類の実装が利用可能です; <literal>RectangularWindow</literal> および <literal>CircularWindow</literal>. この家は, factory で <literal>RectangularWindow</literal> を1つ付けているため, 新たに<literal>CircularWindow</literal>を作成してみましょう.
309
310         </para>
311
312         <screen>
313
314             -->jimport("com.foo.IWindow")
315
316
317
318             -->IWindow.new()
319
320             !--error 999
321
322             Method invocation: An error occurred: Exception when calling Java method : No such constructor in the class com.foo.IWindow.
323
324
325
326             -->jimport("com.foo.CircularWindow")
327
328
329
330             --> newWindow = CircularWindow.new(0.5)
331
332             newWindow  =
333
334
335
336             com.foo.CircularWindow@3e389405
337
338
339
340             -->house.addWindow(newWindow);
341
342
343
344             -->house
345
346             house  =
347
348
349
350             This is a house painted in white, has a white door, and 2 windows
351
352
353
354         </screen>
355
356         <para>
357
358             新しい窓が作成され, リファレンスが変数 "newWindow" に保存されました.次に, この窓が変数をラップすることを必要とせずに家に追加されました.これは通常予想される動作です.最後に, 家が2つの窓を有することを表示します.
359
360         </para>
361
362         <para>
363
364             しかし, ドアが気に入らないため, ドアを変更してみましょう. ドアを作成するには, ドアの色を選ぶ必要があります. Color はJava Enum クラス型です. 前記と同様に, まず変数をインポートし,新規インスタンスを作成した後, 家のドアを交換します.
365
366         </para>
367
368         <screen>
369
370             -->jimport("com.foo.Color")
371
372
373
374             -->jimport("com.foo.Door")
375
376
377
378             -->newDoor = Door.new(Color.RED)
379
380             newDoor  =
381
382
383
384             com.foo.Door@54a5f709
385
386
387
388             -->house.replaceDoor(newDoor);
389
390
391
392             -->house
393
394             house  =
395
396
397
398             This is a house painted in white, has a red door, and 2 windows
399
400         </screen>
401
402         <para>
403
404             Enum型の使用はクラスと同様に簡単です! これらのメソッドとメンバは同じ方針に基づいています:
405
406         </para>
407
408         <screen>
409
410             -->c = Color.random()
411
412             c  =
413
414
415
416             BLACK
417
418
419
420             -->c = Color.random()
421
422             c  =
423
424
425
426             BLUE
427
428
429
430             -->c.getDescr()
431
432             ans  =
433
434
435
436             blue
437
438         </screen>
439
440         <para>
441
442             家に保持される窓のリストは<literal>IWindow</literal>型
443
444             です. これにより, リストに追加できるのは通常は窓のみです.
445
446             これを確かめるため, Scilabで<literal>Door</literal>を
447
448             追加するとどうなるかを見てみましょう.
449
450         </para>
451
452         <screen>
453
454             -->house.addWindow(newDoor);
455
456             !--error 999
457
458             Method invocation: An error occurred: Exception when calling Java method : No method addWindow in the class com.foo.House or bad arguments type.
459
460         </screen>
461
462         <para>
463
464             Java Reflectionを使用した場合と同様, JVM セキュリティ機構が,Javaポリモーフィズム規則に反することを防止するべく監視しています.
465
466         </para>
467
468         <screen>
469
470             -->c.descr
471
472             ans  =
473
474
475
476             blue
477
478
479
480             -->house.door
481
482             !--error 999
483
484             %_EObj_e: An error occurred: Exception when calling Java method : Invalid field door
485
486
487
488             -->house.repaint();
489
490
491
492             -->house
493
494             house  =
495
496
497
498             This is a house painted in red, has a white door, and 2 windows
499
500
501
502             -->house.swapDoorHouseColor()
503
504             !--error 999
505
506             %_EObj_e: An error occurred: Exception when calling Java method : Invalid field swapDoorHouseColor
507
508         </screen>
509
510         <para>
511
512             結論として, JIMSパッケージは Java JNIインターフェイスをScilab上で隠蔽する役割を担っており, これにより,非常に簡単にかつ透過的にScilabでJavaライブラリを使用することが可能です.全ての通常のJVM機能が存在し,Scilab構文は明確で直感的に使用できます.
513
514         </para>
515
516         <para>
517
518             ここまでで, ScilabとJavaライブラリを連携させ,
519
520             Javaの全機能をScilabスクリプト環境で利用する
521
522             方法を理解できたはずです.
523
524         </para>
525
526     </refsection>
527
528     <refsection>
529
530         <title>履歴</title>
531
532         <revhistory>
533
534             <revision>
535
536                 <revnumber>5.5.0</revnumber>
537
538                 <revremark>
539
540                     関数が導入されました. 'JIMS'モジュールに基づきます.
541
542                     JIMSモジュールとの動作上の主な違いは,
543
544                     <link linkend="jautoUnwrap">jautoUnwrap</link>がデフォルトで
545
546                     有効になっていることです.
547
548                 </revremark>
549
550             </revision>
551
552         </revhistory>
553
554     </refsection>
555
556 </refentry>
557
558
559