回答編集履歴
4
困難な理由を追記
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
宗教上の理由がなければ、`String`クラスを正しく実装するのは相当困難な
|
1
|
+
宗教上の理由がなければ、`String`クラスを正しく実装するのは相当困難(特にHashDoS対策)なため自作しないほうが良いです。
|
2
2
|
y_waiwaiさんが指摘している以外にこの2行だけで3つ間違えてます。
|
3
3
|
|
4
4
|
```Java
|
3
追記
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
宗教上の理由がなければ、`String`クラスを正しく実装するのは困難なの
|
1
|
+
宗教上の理由がなければ、`String`クラスを正しく実装するのは相当困難なのため自作しないほうが良いです。
|
2
2
|
y_waiwaiさんが指摘している以外にこの2行だけで3つ間違えてます。
|
3
3
|
|
4
4
|
```Java
|
@@ -30,9 +30,12 @@
|
|
30
30
|
```Java
|
31
31
|
public MStringObj(char[] chars) {
|
32
32
|
if (chars == null) {
|
33
|
+
// ※引数がnullなのにNullPointerException を発生させるのではなく、IllegalArgumentExceptionを発生させるのはAPIとしてどうなのでしょうか。
|
33
|
-
throw new IllegalArgumentException();
|
34
|
+
throw new IllegalArgumentException();
|
34
35
|
}
|
35
36
|
this.chars = chars.clone(); // 防御的コピー
|
37
|
+
// もしくは Arrays.copyOfを使った形でも。
|
38
|
+
this.chars = Arrays.copyOf(chars,chars.length);
|
36
39
|
}
|
37
40
|
public char[] toCharArray() {
|
38
41
|
return this.chars.clone(); // 防御的コピー
|
2
追記
answer
CHANGED
@@ -39,7 +39,7 @@
|
|
39
39
|
}
|
40
40
|
public MString append(MString s) {
|
41
41
|
char[] rhs = s.toCharArray();
|
42
|
-
|
42
|
+
char[] dst = new char[this.chars.length + rhs.length];
|
43
43
|
System.arraycopy(this.chars, 0, dst, 0, this.chars.length);
|
44
44
|
System.arraycopy(rhs, 0, dst, this.chars.length, rhs.length);
|
45
45
|
return new MStringObj(dst);
|
1
追記
answer
CHANGED
@@ -21,10 +21,12 @@
|
|
21
21
|
public MStringObj(char[] chars) {
|
22
22
|
```
|
23
23
|
|
24
|
+
それとは別のバグですが`for`ループ内の1回目で`return`しているので、1文字目で処理が終わります。
|
25
|
+
|
24
26
|
---
|
25
27
|
|
26
28
|
`MStringObj`の`#append`の仕様がよく分かりませんが。
|
27
|
-
末尾に追加したいのなら(**未テストコード**)
|
29
|
+
文字列の末尾に追加したいのなら(**未テストコード**)
|
28
30
|
```Java
|
29
31
|
public MStringObj(char[] chars) {
|
30
32
|
if (chars == null) {
|
@@ -46,7 +48,7 @@
|
|
46
48
|
[Java言語で配列を結合する方法(一つにまとめる)を見やすくまとめてみた](https://www.sejuku.net/blog/14162)
|
47
49
|
|
48
50
|
---
|
49
|
-
余談、悪意を持った人がリスコフの置き換え原則を使って`MStringObj`クラスのサブクラスを宣言し悪用するのを防ぐために`MStringObj`は`final`で宣言してくださいな。
|
51
|
+
余談、悪意を持った人がリスコフの置き換え原則を使って`MStringObj`クラスのサブクラスを宣言し悪用するのを防ぐために`String`クラスと同様に`MStringObj`は`final`で宣言してくださいな。
|
50
52
|
```Java
|
51
53
|
public final class MStringObj implements MString
|
52
54
|
```
|