回答編集履歴
6
回答のコメント欄の質疑応答内容を反映
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
|
-
|
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
追記
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
追記
test
CHANGED
@@ -50,4 +50,40 @@
|
|
50
50
|
|
51
51
|
質問文と同じく子クラスのcreateにsuper.create()がないとこんな感じの出力になります。
|
52
52
|
|
53
|
-
[Wandbox](https://wandbox.org/permlink/
|
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
追記
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
追記
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
追記
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
|
|