回答編集履歴

6

回答のコメント欄の質疑応答内容を反映

2018/08/18 01:28

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
  ---
32
32
 
33
-
33
+ > 無理でした。
34
34
 
35
35
  ```Java
36
36
 
@@ -42,17 +42,15 @@
42
42
 
43
43
  ```
44
44
 
45
- `BaseGame`クラスのコンストラクタから`BaseGame`の`Create`を呼び出していませんか。
45
+ スタックトレースを見ると`BaseGame`クラスのコンストラクタから`BaseGame`の`Create`を呼び出していませんか。
46
46
 
47
47
 
48
48
 
49
49
  ---
50
50
 
51
- BaseGameの記述が気になりますが。
51
+ `BaseGame`クラスが気になりますが。
52
52
 
53
- 質問文と同じく子クラスのcreateにsuper.create()がないとこんな感じの出力になります。
54
-
55
- [Wandbox](https://wandbox.org/permlink/DcGHerldPI0CoiZ9)
53
+ 継承したクラスでのcreateの呼び出しを`println`してみました[このような出力](https://wandbox.org/permlink/DcGHerldPI0CoiZ9)になります。
56
54
 
57
55
 
58
56
 
@@ -60,7 +58,7 @@
60
58
 
61
59
  ■対策としては
62
60
 
63
- 案1,コンストラクタでオーバーライド対象のメソッドのcreate()の呼び出しをやめる。
61
+ 案1,コンストラクタでオーバーライド対象のメソッドの`create()`の呼び出しをやめる。
64
62
 
65
63
  コンストラクタの可視性の関係上、イベントリスナーの登録、スレッドの起動も避けたほうがよいです。
66
64
 
@@ -70,23 +68,23 @@
70
68
 
71
69
  以下からは改造の手間がかかります。
72
70
 
73
- 案2, BaseGameが何を目的のクラスなのかで変わりますが。
71
+ 案2, `BaseGame`が何を目的のクラスなのかで変わりますが。
74
72
 
75
- BaseGameを継承するのをやめて、コンポジット(委譲)にする。
73
+ `BaseGame`を継承するのをやめて、コンポジット(委譲)にする。
76
74
 
77
- debug2クラスはBaseGameクラスのフィールドを持ち、baseGame.create();などを必要な都度呼び出す。
75
+ `debug2`クラスはBaseGameクラスのフィールドを持ち、`baseGame.create();`などを必要な都度呼び出す。
78
76
 
79
- private BaseGame baseGame = new BaseGame();
77
+ `private BaseGame baseGame = new BaseGame();`
80
78
 
81
79
 
82
80
 
83
- 案3, BaseGameはクラスではなくinterfaceの定義とdefalutメソッドのみにする。
81
+ 案3, `BaseGame`はクラスではなく`interface`で抽象メソッドの定義と`defalut`メソッドにする。
84
82
 
85
83
 
86
84
 
87
85
  個人的なオススメは案2でしょうか。
88
86
 
89
- BaseGameというクラス名はいろいろな処理がありそうなクラス名に見えるので、
87
+ `BaseGame`というクラス名はいろいろな処理がありそうなクラス名に見えるので、
90
88
 
91
89
  内部の処理をクラス分割することをお勧めします。
92
90
 
@@ -96,10 +94,10 @@
96
94
 
97
95
 
98
96
 
99
- 追記したBaseGameを見ました、率直な感想は継承する意味があまりないような。
97
+ 追記した`BaseGame`を見ました、率直な感想は継承する意味があまりないような。
100
98
 
101
99
  クラスを導入する事で解消される問題もあまりなさそうに見えますし。
102
100
 
103
- どちらかというと、[Properties](https://docs.oracle.com/javase/jp/10/docs/api/java/util/Properties.html)クラスもしくはJSON形式のファイルを使って
101
+ どちらかというと、[Properties](https://docs.oracle.com/javase/jp/10/docs/api/java/util/Properties.html)クラスもしくは`JSON形式`のファイルを使って
104
102
 
105
- 今、プログラムに埋め込んでいるMAP情報や画像のパスなどを外部化した方が管理しやすいかもです。
103
+ 今、プログラムに埋め込んでいる`MAP情報`や画像のパスなどを外部化した方が管理しやすいかもです。

5

追記

2018/08/18 01:28

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -34,7 +34,9 @@
34
34
 
35
35
  ```Java
36
36
 
37
+ at debug2.Create(debug2.java:69)
38
+
37
- src.yukkuri.lib.Game.BaseGame.<init>(BaseGame.java:29) // ←
39
+ src.yukkuri.lib.Game.BaseGame.<init>(BaseGame.java:29) // ← BaseGameのコンストラクタ<init>
38
40
 
39
41
  at debug2.<init>(debug2.java:52)
40
42
 
@@ -87,3 +89,17 @@
87
89
  BaseGameというクラス名はいろいろな処理がありそうなクラス名に見えるので、
88
90
 
89
91
  内部の処理をクラス分割することをお勧めします。
92
+
93
+
94
+
95
+ ---
96
+
97
+
98
+
99
+ 追記したBaseGameを見ました、率直な感想は継承する意味があまりないような。
100
+
101
+ クラスを導入する事で解消される問題もあまりなさそうに見えますし。
102
+
103
+ どちらかというと、[Properties](https://docs.oracle.com/javase/jp/10/docs/api/java/util/Properties.html)クラスもしくはJSON形式のファイルを使って
104
+
105
+ 今、プログラムに埋め込んでいるMAP情報や画像のパスなどを外部化した方が管理しやすいかもです。

4

追記

2018/08/18 00:57

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -50,4 +50,40 @@
50
50
 
51
51
  質問文と同じく子クラスのcreateにsuper.create()がないとこんな感じの出力になります。
52
52
 
53
- [Wandbox](https://wandbox.org/permlink/4HYSApU9nCHETVXx)
53
+ [Wandbox](https://wandbox.org/permlink/DcGHerldPI0CoiZ9)
54
+
55
+
56
+
57
+
58
+
59
+ ■対策としては
60
+
61
+ 案1,コンストラクタでオーバーライド対象のメソッドのcreate()の呼び出しをやめる。
62
+
63
+ コンストラクタの可視性の関係上、イベントリスナーの登録、スレッドの起動も避けたほうがよいです。
64
+
65
+ (私もサンプルコードではよく書きますが)
66
+
67
+
68
+
69
+ 以下からは改造の手間がかかります。
70
+
71
+ 案2, BaseGameが何を目的のクラスなのかで変わりますが。
72
+
73
+ BaseGameを継承するのをやめて、コンポジット(委譲)にする。
74
+
75
+ debug2クラスはBaseGameクラスのフィールドを持ち、baseGame.create();などを必要な都度呼び出す。
76
+
77
+ private BaseGame baseGame = new BaseGame();
78
+
79
+
80
+
81
+ 案3, BaseGameはクラスではなくinterfaceの定義とdefalutメソッドのみにする。
82
+
83
+
84
+
85
+ 個人的なオススメは案2でしょうか。
86
+
87
+ BaseGameというクラス名はいろいろな処理がありそうなクラス名に見えるので、
88
+
89
+ 内部の処理をクラス分割することをお勧めします。

3

追記

2018/08/18 00:29

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -41,3 +41,13 @@
41
41
  ```
42
42
 
43
43
  `BaseGame`クラスのコンストラクタから`BaseGame`の`Create`を呼び出していませんか。
44
+
45
+
46
+
47
+ ---
48
+
49
+ BaseGameの記述が気になりますが。
50
+
51
+ 質問文と同じく子クラスのcreateにsuper.create()がないとこんな感じの出力になります。
52
+
53
+ [Wandbox](https://wandbox.org/permlink/4HYSApU9nCHETVXx)

2

追記

2018/08/18 00:14

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -25,3 +25,19 @@
25
25
  +private final newSprite[] m_player = new newSprite[5];
26
26
 
27
27
  ```
28
+
29
+
30
+
31
+ ---
32
+
33
+
34
+
35
+ ```Java
36
+
37
+ src.yukkuri.lib.Game.BaseGame.<init>(BaseGame.java:29) // ←
38
+
39
+ at debug2.<init>(debug2.java:52)
40
+
41
+ ```
42
+
43
+ `BaseGame`クラスのコンストラクタから`BaseGame`の`Create`を呼び出していませんか。

1

追記

2018/08/17 23:57

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -1,4 +1,8 @@
1
+ スタックトレースの追記ありがとうございました。
2
+
3
+
4
+
1
- debug2.Create(debug2.java:69)が以下の行です、
5
+ スタックトレースの`debug2.Create(debug2.java:69)`質問文のコードを見る限り以下の行です、
2
6
 
3
7
 
4
8
 
@@ -8,7 +12,7 @@
8
12
 
9
13
  `Sprite`クラスの定義が質問文に無いので確実な事はいえませんが、
10
14
 
11
- 上記行で`NullPointerException`が発生しえるのは変数:`m_player`なのです
15
+ 上記行で`NullPointerException`が発生しえるのは変数:`m_player`です
12
16
 
13
17
  以下のようにfinal宣言に変更して再代入を抑止しても上記問題が発生するか確認して頂けませんか?
14
18