OSDN Git Service

hide Avatar constructor.
authorOlyutorskii <olyutorskii@users.osdn.me>
Tue, 31 Mar 2020 12:36:02 +0000 (21:36 +0900)
committerOlyutorskii <olyutorskii@users.osdn.me>
Tue, 31 Mar 2020 12:36:02 +0000 (21:36 +0900)
src/main/java/jp/sfjp/jindolf/data/Avatar.java
src/main/java/jp/sfjp/jindolf/data/html/PeriodHandler.java
src/test/java/jp/sfjp/jindolf/data/AvatarTest.java

index 481c965..7b17f9d 100644 (file)
@@ -12,8 +12,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.RandomAccess;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import jp.sourceforge.jindolf.corelib.PreDefAvatar;
 
@@ -31,7 +29,7 @@ import jp.sourceforge.jindolf.corelib.PreDefAvatar;
  * <p>設計メモ: 未知のAvatar出現に備え、
  * {@link PreDefAvatar}と分離したクラスとして設計された。
  *
- * <p>2020-03現在、既知のAvatarは最大20種類で固定。
+ * <p>2020-03現在、Avatarは20インスタンスで固定。
  * Z国含め未知のAvatarが追加されるケースは今後考慮しない。
  */
 public class Avatar implements Comparable<Avatar> {
@@ -39,18 +37,12 @@ public class Avatar implements Comparable<Avatar> {
     /** ゲルト。 */
     public static final Avatar AVATAR_GERD;
 
-    private static final List<Avatar>        AVATAR_LIST;
-    private static final Map<String, Avatar> AVATAR_FN_MAP;
-    private static final Map<String, Avatar> AVATAR_ID_MAP;
+    private static final List<Avatar>        AVATAR_LIST = buildAvatarList();
+    private static final Map<String, Avatar> AVATAR_FN_MAP = new HashMap<>();
+    private static final Map<String, Avatar> AVATAR_ID_MAP = new HashMap<>();
 
-    private static final Pattern AVATAR_PATTERN;
 
     static{
-        List<PreDefAvatar>  predefs = CoreData.getPreDefAvatarList();
-        AVATAR_LIST = buildAvatarList(predefs);
-
-        AVATAR_FN_MAP = new HashMap<>();
-        AVATAR_ID_MAP = new HashMap<>();
         AVATAR_LIST.forEach(avatar -> {
             String fullName = avatar.getFullName();
             String avatarId = avatar.getIdentifier();
@@ -58,20 +50,7 @@ public class Avatar implements Comparable<Avatar> {
             AVATAR_ID_MAP.put(avatarId, avatar);
         });
 
-        StringBuilder avatarGroupRegex = new StringBuilder();
-        AVATAR_LIST.stream().map((avatar) ->
-            avatar.getFullName()
-        ).forEachOrdered((fullName) -> {
-            if(avatarGroupRegex.length() > 0){
-                avatarGroupRegex.append('|');
-            }
-            avatarGroupRegex.append('(')
-                    .append(Pattern.quote(fullName))
-                    .append(')');
-        });
-        AVATAR_PATTERN = Pattern.compile(avatarGroupRegex.toString());
-
-        AVATAR_GERD = getAvatarByFullname("楽天家 ゲルト");
+        AVATAR_GERD = getAvatarById("gerd");
 
         assert AVATAR_LIST instanceof RandomAccess;
         assert AVATAR_GERD != null;
@@ -83,12 +62,13 @@ public class Avatar implements Comparable<Avatar> {
     private final String fullName;
     private final int idNum;
     private final String identifier;
-    private final int hashNum;
 
 
     /**
      * constructor.
      *
+     * <p>全ての引数は他のインスタンスに対しユニークでなければならない。
+     *
      * @param name 名前
      * @param jobTitle 職業名
      * @param idNum 通し番号
@@ -98,6 +78,8 @@ public class Avatar implements Comparable<Avatar> {
                    String jobTitle,
                    int idNum,
                    String identifier ){
+        super();
+
         this.name = name.intern();
         this.jobTitle = jobTitle.intern();
         this.idNum = idNum;
@@ -105,51 +87,21 @@ public class Avatar implements Comparable<Avatar> {
 
         this.fullName = (this.jobTitle + " " + this.name).intern();
 
-        this.hashNum = this.fullName.hashCode() ^ this.idNum;
-
-        return;
-    }
-
-    /**
-     * constructor.
-     *
-     * @param fullName フルネーム
-     */
-    // TODO 当面は呼ばれないはず。Z国とか向け。
-    public Avatar(String fullName){
-        this.fullName = fullName.intern();
-        this.idNum = -1;
-
-        String[] tokens = this.fullName.split("\\p{Blank}+", 2);
-        if(tokens.length == 1){
-            this.jobTitle = null;
-            this.name = this.fullName;
-        }else if(tokens.length == 2){
-            this.jobTitle = tokens[0].intern();
-            this.name = tokens[1].intern();
-        }else{
-            this.jobTitle = null;
-            this.name = null;
-            assert false;
-        }
-
-        this.identifier = "???".intern();
-
-        this.hashNum = this.fullName.hashCode() ^ this.idNum;
-
         return;
     }
 
 
     /**
-     * 定義済みAvatarのAvatarリストを生成する。
+     * Avatarリストを生成する。
+     *
+     * Avatarの全インスタンスはこのリストに含まれる。
      *
-     * @param predefs 定義済みAvatar元データ群
      * @return ソートされた定義済みAvatarのリスト
      */
-    private static List<Avatar> buildAvatarList(List<PreDefAvatar> predefs){
+    private static List<Avatar> buildAvatarList(){
         List<Avatar> result;
 
+        List<PreDefAvatar>  predefs = CoreData.getPreDefAvatarList();
         result = predefs.stream()
                 .map(preDefAvatar -> toAvatar(preDefAvatar))
                 .sorted()
@@ -171,6 +123,7 @@ public class Avatar implements Comparable<Avatar> {
         String jobTitle  = pre.getJobTitle();
         int serialNo     = pre.getSerialNo();
         String avatarId  = pre.getAvatarId();
+
         Avatar result = new Avatar(shortName, jobTitle, serialNo, avatarId);
         return result;
     }
@@ -190,58 +143,20 @@ public class Avatar implements Comparable<Avatar> {
      * @param fullNameArg Avatarのフルネーム
      * @return Avatar。フルネームが一致するAvatarが無ければnull
      */
-    // TODO 20キャラ程度ならListをなめる方が早いか?
     public static Avatar getAvatarByFullname(String fullNameArg){
         return AVATAR_FN_MAP.get(fullNameArg);
     }
 
     /**
-     * フルネームに合致するAvatarを返す。
-     *
-     * @param fullNameArg Avatarのフルネーム
-     * @return Avatar。フルネームが一致するAvatarが無ければnull
-     */
-    public static Avatar getAvatarByFullname(CharSequence fullNameArg){
-        for(Avatar avatar : AVATAR_LIST){
-            String avatarName = avatar.getFullName();
-            if(avatarName.contentEquals(fullNameArg)){
-                return avatar;
-            }
-        }
-        return null;
-    }
-
-    /**
      * IDに合致するAvatarを返す。
      *
      * @param avatarId AvatarのID
      * @return Avatar。IDが一致するAvatarが無ければnull
      */
-    // TODO 20キャラ程度ならListをなめる方が早いか?
     public static Avatar getAvatarById(String avatarId){
         return AVATAR_ID_MAP.get(avatarId);
     }
 
-    /**
-     * 定義済みAvatar名に一致しないか調べる。
-     *
-     * @param matcher マッチャ
-     * @return 一致したAvatar。一致しなければnull。
-     */
-    public static Avatar lookingAtAvatar(Matcher matcher){
-        matcher.usePattern(AVATAR_PATTERN);
-
-        if( ! matcher.lookingAt() ) return null;
-        int groupCt = matcher.groupCount();
-        for(int group = 1; group <= groupCt; group++){
-            if(matcher.start(group) >= 0){
-                Avatar avatar = AVATAR_LIST.get(group - 1);
-                return avatar;
-            }
-        }
-
-        return null;
-    }
 
     /**
      * フルネームを取得する。
@@ -280,7 +195,7 @@ public class Avatar implements Comparable<Avatar> {
     }
 
     /**
-     * 識別文字列を返す。
+     * AvatarID識別文字列を返す。
      *
      * @return 識別文字列
      */
@@ -291,41 +206,6 @@ public class Avatar implements Comparable<Avatar> {
     /**
      * {@inheritDoc}
      *
-     * @param obj {@inheritDoc}
-     * @return {@inheritDoc}
-     */
-    @Override
-    public boolean equals(Object obj){
-        if(this == obj){
-            return true;
-        }
-
-        if( ! (obj instanceof Avatar) ){
-            return false;
-        }
-        Avatar other = (Avatar) obj;
-
-        boolean nameMatch = this.fullName.equals(other.fullName);
-        boolean idMatch = this.idNum == other.idNum;
-
-        if(nameMatch && idMatch) return true;
-
-        return false;
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @return {@inheritDoc}
-     */
-    @Override
-    public int hashCode(){
-        return this.hashNum;
-    }
-
-    /**
-     * {@inheritDoc}
-     *
      * @return {@inheritDoc}
      */
     @Override
index 0560e34..2632fed 100644 (file)
@@ -121,7 +121,7 @@ class PeriodHandler extends HtmlAdapter {
                               .toString();
         Avatar result = village.getAvatar(fullName);
         if(result == null){
-            result = new Avatar(fullName);
+            result = Avatar.getAvatarByFullname(fullName);
             village.addAvatar(result);
         }
 
index 6757170..352e3a1 100644 (file)
@@ -7,8 +7,6 @@
 package jp.sfjp.jindolf.data;
 
 import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -63,50 +61,6 @@ public class AvatarTest {
         result = Avatar.getAvatarByFullname("農夫 ヤコブ");
         assertNotNull(result);
         assertTrue(result.equals(result));
-        result = Avatar.getAvatarByFullname((CharSequence)"農夫 ヤコブ");
-        assertNotNull(result);
-        assertTrue(result.equals(result));
-        return;
-    }
-
-    /**
-     * Test of lookingAtAvatar method, of class Avatar.
-     */
-    @Test
-    public void testMatchAvatar(){
-        System.out.println("matchAvatar");
-        Matcher matcher;
-        Avatar avatar;
-
-        Pattern pattern = Pattern.compile(".+");
-
-        matcher = pattern.matcher("農夫 ヤコブ");
-        avatar = Avatar.lookingAtAvatar(matcher);
-        assertNotNull(avatar);
-        assertEquals("農夫 ヤコブ", avatar.getFullName());
-
-        matcher = pattern.matcher("農夫 ヤコブXYZ");
-        avatar = Avatar.lookingAtAvatar(matcher);
-        assertNotNull(avatar);
-        assertEquals("農夫 ヤコブ", avatar.getFullName());
-
-        matcher = pattern.matcher("ABC農夫 ヤコブ");
-        avatar = Avatar.lookingAtAvatar(matcher);
-        assertNull(avatar);
-
-        matcher = pattern.matcher("農夫 ヤコブならず者 ディーター");
-        avatar = Avatar.lookingAtAvatar(matcher);
-        assertNotNull(avatar);
-        assertEquals("農夫 ヤコブ", avatar.getFullName());
-        int regionStart;
-        int regionEnd;
-        regionStart = matcher.end();
-        regionEnd = matcher.regionEnd();
-        matcher.region(regionStart, regionEnd);
-        avatar = Avatar.lookingAtAvatar(matcher);
-        assertNotNull(avatar);
-        assertEquals("ならず者 ディーター", avatar.getFullName());
-
         return;
     }