【问题标题】:Is it the right way to do what Im trying? Abstract static variable?这是做我正在尝试的正确方法吗?抽象静态变量?
【发布时间】:2013-08-13 22:27:27
【问题描述】:

查看下面的代码。似乎有更简单的方法。

对于我要添加到系统中的每个新Class,我必须执行以下操作才能设置类变量(静态-> 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;
            }

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

【问题讨论】:

  • 为什么都是内部类?
  • 给你的班级打电话 Class 并不是一个好主意——这个名字已经在使用了...
  • 是的。确实如此。它仅用于示例。还是谢谢。
  • 请为您的问题提供一个更好(更具描述性)的标题。
  • 出于什么目的?您的代码的目的是什么?

标签: java oop static abstract


【解决方案1】:

首先,您不应该将您的班级命名为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:不错,干净的解决方案。但是,您需要更改第一行。
  • 速度。这就是我一直在寻找的。​​span>
  • 我又想到了这个方法。当你这样做时。 maxPlayers 的 int 存储在实例中,不像静态的。所以它已经宣布了很多次。这不是我想要的。
  • @Nirock。不,它没有被初始化很多次。如您所见,该字段为final。它只在构造函数被调用时初始化一次。
  • 是的,但是每个实例都会调用构造函数。每次我使用 Role.SOLDIER
【解决方案2】:

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

您的做法是一种选择,另一种是使用非静态变量,如下所示。

而且你的变量最好比你的 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;
   }
}

【讨论】:

  • 我在他的基类中看不到任何静态变量。这是一个静态方法,他在他的所有子类中都覆盖了它。
  • 我也没有,但我读到这个问题是因为这就是他想要完成的。
  • 感谢您的回答。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
相关资源
最近更新 更多