OSDN Git Service

ステージ名の自動命名
authorOlyutorskii <olyutorskii@users.osdn.me>
Fri, 20 May 2011 08:10:28 +0000 (17:10 +0900)
committerOlyutorskii <olyutorskii@users.osdn.me>
Fri, 20 May 2011 08:10:28 +0000 (17:10 +0900)
src/main/java/jp/sourceforge/mikutoga/parser/ParseStage.java
src/test/java/jp/sourceforge/mikutoga/parser/ParseStageTest.java

index 859e038..3814cba 100644 (file)
@@ -11,25 +11,41 @@ package jp.sourceforge.mikutoga.parser;
  * パース処理の進行ステージ種別を表す。
  * ループ構造の識別に用いられる。
  */
-public class ParseStage {
+public abstract class ParseStage {
 
     private final String name;
 
     /**
      * コンストラクタ。
-     * 進行ステージ名は空文字列が指定される。
+     * 進行ステージ名は実行時クラス名(パッケージ名抜き)が指定される。
      */
-    public ParseStage(){
-        this("");
+    protected ParseStage(){
+        super();
+
+        Class<?> klass = getClass();
+        String fullName = klass.getName();
+        int idx = fullName.lastIndexOf('.');
+
+        String stripName;
+        if(idx >= 0){
+            stripName = fullName.substring(idx + 1);
+        }else{
+            stripName = fullName;
+        }
+
+        this.name = stripName;
+
         return;
     }
 
     /**
      * コンストラクタ。
      * @param name 進行ステージ名
+     * @throws NullPointerException 引数がnull
      */
-    public ParseStage(String name){
+    protected ParseStage(String name) throws NullPointerException{
         super();
+        if(name == null) throw new NullPointerException();
         this.name = name;
         return;
     }
index f8a313c..611c2c1 100644 (file)
@@ -35,13 +35,35 @@ public class ParseStageTest extends TestCase {
 
         ParseStage instance;
 
-        instance = new ParseStage();
+        instance = new Test1("A.B.C");
+        assertEquals("A.B.C", instance.toString());
+
+        instance = new Test1("");
         assertEquals("", instance.toString());
 
-        instance = new ParseStage("ABC");
-        assertEquals("ABC", instance.toString());
+        try{
+            instance = new Test1(null);
+            fail();
+        }catch(NullPointerException e){
+            // OK
+        }
+
+        instance = new Test2();
+        assertEquals("ParseStageTest$Test2", instance.toString());
 
         return;
     }
 
+    class Test1 extends ParseStage{
+        public Test1(String txt){
+            super(txt);
+        }
+    }
+
+    class Test2 extends ParseStage{
+        public Test2(){
+            super();
+        }
+    }
+
 }