teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

困難な理由を追記

2018/07/22 11:57

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -1,4 +1,4 @@
1
- 宗教上の理由がなければ、`String`クラスを正しく実装するのは相当困難なため自作しないほうが良いです。
1
+ 宗教上の理由がなければ、`String`クラスを正しく実装するのは相当困難(特にHashDoS対策)なため自作しないほうが良いです。
2
2
  y_waiwaiさんが指摘している以外にこの2行だけで3つ間違えてます。
3
3
 
4
4
  ```Java

3

追記

2018/07/22 11:57

投稿

umyu
umyu

スコア5846

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

追記

2018/07/22 11:53

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -39,7 +39,7 @@
39
39
  }
40
40
  public MString append(MString s) {
41
41
  char[] rhs = s.toCharArray();
42
- int[] dst = new int[this.chars.length + rhs.length];
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

追記

2018/07/22 10:40

投稿

umyu
umyu

スコア5846

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
  ```