这是我尝试做的正确方法吗?抽象的静态变量?

时间:2013-08-12 14:39:35

标签: java oop static abstract

查看下面的代码。似乎有更简单的方法来做到这一点。

对于我要添加到系统的每个新Class,我必须执行以下操作才能设置类变量(static - > maxPlayers)?

像抽象静态变量?

protected abstract class Class{
        protected abstract int getMaxPlayers();

        public class Soldier extends Class{
            public static final int maxPlayers = 4;

            @Override
            protected int getMaxPlayers() {
                return Soldier.maxPlayers;
            }
        }

        public class Demoman extends Class{
            public static final int maxPlayers = 2;

            @Override
            protected int getMaxPlayers() {
                return Demoman.maxPlayers;
            }
        }
        public class Scout extends Class{
            public static final int maxPlayers = 4;

            @Override
            protected int getMaxPlayers() {
                return Scout.maxPlayers;
            }
        }
        public class Medic extends Class{
            public static final int maxPlayers = 2;

            @Override
            protected int getMaxPlayers() {
                return Medic.maxPlayers;
            }
        }
    }

就像我必须重复这个模板一样:

public static final int maxPlayers = 2;

            @Override
            protected int getMaxPlayers() {
                return Medic.maxPlayers;
            }

我认为这样做是不正确的。

2 个答案:

答案 0 :(得分:11)

首先,你不应该为你的班级Class命名(即使是例子)。选择一个更好的名字。

其次,看起来enum就像你真正需要的那样:

public enum Army {   
    SOLDIER(4),
    DEMOMAN(2),
    SCOUT(4),
    MEDIC(2);

    private final int maxPlayers;

    private Army(int maxPlayers) {
        this.maxPlayers = maxPlayers;
    }

    public int getMaxPlayers() {
        return maxPlayers;
    }
}

答案 1 :(得分:0)

不,你不能在基类中有一个静态变量,每个子类的值都不同(据我所知,这就是你理想的 >想做)。

你这样做是一种选择,另一种是使用非静态变量,如下所示。

并且你的变量应该优先于你的getter函数。

class Class
{
   private final int maxPlayers;

   Class(int max)
   {
      maxPlayers = max;
   }

   public int getMaxPlayers()
   {
      return maxPlayers;
   }
}

class Soldier extends Class
{
   Soldier()
   {
      super(4);
   }
}

为了提高可读性和可修改性,您可以考虑将4替换为enum或类似内容。

另一种方式:

abstract class Class
{
   public static int MAX_PLAYERS_SOLDIER = 4,
                     MAX_PLAYERS_DEMOMAN = 2,
                     ...;

   protected abstract int getMaxPlayers();
}

class Soldier extends Class
{
   @Override
   protected int getMaxPlayers()
   {
      return MAX_PLAYERS_SOLDIER;
   }
}