回答編集履歴

3

分割線追加

2024/01/18 16:17

投稿

jimbe
jimbe

スコア13170

test CHANGED
@@ -1,4 +1,6 @@
1
1
  PetInfo.jsp で PetUtil を import していません。
2
+
3
+ ---
2
4
 
3
5
  質問とは関係ありませんが、 Dog と Cat をいちいち確認して別々のメソッドを呼ぶのはオブジェクトとしてうまくいっていないように見えます。
4
6
  他にどのような処理があるのか分かりませんが、散歩場所も好きなおもちゃも犬猫どちらにあっても良さそうな気がします。

2

コード追加

2024/01/18 16:16

投稿

jimbe
jimbe

スコア13170

test CHANGED
@@ -1,6 +1,162 @@
1
1
  PetInfo.jsp で PetUtil を import していません。
2
2
 
3
3
  質問とは関係ありませんが、 Dog と Cat をいちいち確認して別々のメソッドを呼ぶのはオブジェクトとしてうまくいっていないように見えます。
4
- 他にどのような処理があるのか分かりませんが、好きな場所も好きなおもちゃも犬猫どちらにあっても良さそうな気がします。
4
+ 他にどのような処理があるのか分かりませんが、散歩場所も好きなおもちゃも犬猫どちらにあっても良さそうな気がします。
5
5
  何ならそれらを追加属性として map にでも入れるようにすればクラス判定をしなくて済むのでは無いでしょうか。
6
6
  また、 Animal は恐らく Pet を implement して Pet → Animal → Dog/Cat という関係になっていると思いますが、 Animal → Pet → Dog/Cat のほうが合っていると思います。
7
+
8
+ 以下は Animal を無くし Pet に処理を集めた上で、 Pet に addnlInfoMap を作り Dog/Cat はそれぞれの都合で情報を追加します。
9
+ その為、 petList.jsp はマップの中身をただ出力するだけで済みます。
10
+
11
+ ```java
12
+ package jp.co.axiz;
13
+
14
+ import java.util.*;
15
+
16
+ //Animal の使い道が分からないので Pet と合成
17
+ public abstract class Pet {
18
+ //追加情報
19
+ public static enum AddnlInfo {
20
+ WALKING_PLACE("散歩場所"),
21
+ FAVORITE_ITEM("お気に入りの遊具");
22
+
23
+ final String text;
24
+ AddnlInfo(String text) {
25
+ this.text = text;
26
+ }
27
+ @Override
28
+ public String toString() { return text; }
29
+ }
30
+
31
+ private final String name;
32
+ private final int age, height, weight;
33
+ private final String type;
34
+ private final Map<AddnlInfo,String> addnlInfoMap = new EnumMap<AddnlInfo,String>(AddnlInfo.class);
35
+
36
+ protected int weightLimit = -1;
37
+
38
+ public Pet(String name, int age, int height, int weight, String type) {
39
+ this.name = name;
40
+ this.age = age;
41
+ this.height = height;
42
+ this.weight = weight;
43
+ this.type = type;
44
+ }
45
+ protected void putAddnlInfo(AddnlInfo key, String value) {
46
+ addnlInfoMap.put(key, value);
47
+ }
48
+
49
+ public String getName() { return name; }
50
+ public int getAge() { return age; }
51
+ public int getHeight() { return height; }
52
+ public int getWeight() { return weight; }
53
+ public String getType() { return type; }
54
+ public Map<AddnlInfo,String> getAddnlInfoMap() { return Collections.unmodifiableMap(addnlInfoMap); }
55
+
56
+ public boolean isFat() { return weightLimit < 0 ? false : weight > weightLimit; }
57
+
58
+ @Override
59
+ public String toString() {
60
+ StringBuilder sb = new StringBuilder("[");
61
+ sb.append("name=").append(name);
62
+ sb.append(",age=").append(age);
63
+ sb.append(",height=").append(height);
64
+ sb.append(",weight=").append(weight);
65
+ sb.append(",type=").append(type);
66
+ sb.append(",addnlInfo=").append(addnlInfoMap);
67
+ return sb.append("]").toString();
68
+ }
69
+ }
70
+ ```
71
+ ```java
72
+ package jp.co.axiz.util;
73
+
74
+ import jp.co.axiz.Pet;
75
+
76
+ public class Dog extends Pet {
77
+ public Dog(String name, int age, int height, int weight, String type, String place) {
78
+ super(name, age, height, weight, type);
79
+ putAddnlInfo(AddnlInfo.WALKING_PLACE, place);
80
+ weightLimit = 15;
81
+ }
82
+ }
83
+ ```
84
+ ```java
85
+ package jp.co.axiz.util;
86
+
87
+ import jp.co.axiz.Pet;
88
+
89
+ public class Cat extends Pet {
90
+ public Cat(String name, int age, int height, int weight, String type, String item) {
91
+ super(name, age, height, weight, type);
92
+ putAddnlInfo(AddnlInfo.FAVORITE_ITEM, item);
93
+ weightLimit = 5;
94
+ }
95
+ }
96
+ ```
97
+ petList.jsp
98
+ ```html
99
+ <%@ page language="java" contentType="text/html; charset=UTF-8"
100
+ pageEncoding="UTF-8"%>
101
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
102
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
103
+
104
+ <%@ page import="jp.co.axiz.Pet"%>
105
+
106
+ <!DOCTYPE html>
107
+ <html>
108
+ <head>
109
+ <meta charset="UTF-8">
110
+ <title>Java</title>
111
+ <link href="css/styles.css" rel="stylesheet">
112
+ </head>
113
+ <body>
114
+ <h1>ペット情報管理</h1>
115
+ <div class="info">
116
+ <h2>ペット情報</h2>
117
+
118
+ <table class="petInfoTable">
119
+
120
+ <tr>
121
+ <th>名前:</th>
122
+ <td>${requestScope.selectedPet.name}</td>
123
+ </tr>
124
+ <tr>
125
+ <th>年齢:</th>
126
+ <td>${requestScope.selectedPet.age}</td>
127
+ </tr>
128
+ <tr>
129
+ <th>体長:</th>
130
+ <td>${requestScope.selectedPet.height}</td>
131
+ </tr>
132
+ <tr>
133
+ <th>体重:</th>
134
+ <td>${requestScope.selectedPet.weight}<c:if
135
+ test="${requestScope.selectedPet.isFat()}">
136
+ <span class="fat">*太りすぎです。</span>
137
+ </c:if>
138
+ </td>
139
+ </tr>
140
+ <tr>
141
+
142
+ <!--散歩場所やお気に入りの遊具-->
143
+ <c:forEach var="addnlInfo" items="${requestScope.selectedPet.addnlInfoMap}">
144
+ <tr>
145
+ <th><c:out value="${addnlInfo.key}" /></th>
146
+ <td><c:out value="${addnlInfo.value}" /></td>
147
+ </tr>
148
+ </c:forEach>
149
+
150
+ </table>
151
+ </div>
152
+
153
+ <form action="petList.jsp">
154
+ <button class="btn" type="submit">戻る</button>
155
+ </form>
156
+
157
+ <form action="index.jsp">
158
+ <button class="btn" type="submit">先頭に戻る</button>
159
+ </form>
160
+ </body>
161
+ </html>
162
+ ```

1

追加

2024/01/18 15:09

投稿

jimbe
jimbe

スコア13170

test CHANGED
@@ -1 +1,6 @@
1
1
  PetInfo.jsp で PetUtil を import していません。
2
+
3
+ 質問とは関係ありませんが、 Dog と Cat をいちいち確認して別々のメソッドを呼ぶのはオブジェクトとしてうまくいっていないように見えます。
4
+ 他にどのような処理があるのか分かりませんが、好きな場所も好きなおもちゃも犬猫どちらにあっても良さそうな気がします。
5
+ 何ならそれらを追加属性として map にでも入れるようにすればクラス判定をしなくて済むのでは無いでしょうか。
6
+ また、 Animal は恐らく Pet を implement して Pet → Animal → Dog/Cat という関係になっていると思いますが、 Animal → Pet → Dog/Cat のほうが合っていると思います。