Java 强制扩展类设置多个值的简单方法

Java 强制扩展类设置多个值的简单方法,java,Java,例如,让我们从一个游戏中说: public class Enemy { protected int x, y; protected int width, height; protected int hitpoints; protected int speed; } 我想让多个类扩展这个类(每个敌人类型一个),但我需要确保(最好强制)扩展类以某种方式将值分配给所有这些变量 我不想通过构造函数调用传递它们,也不想在其中设置它们——因此,目前我不得不通过简单地将整个减

例如,让我们从一个游戏中说:

public class Enemy {
    protected int x, y;
    protected int width, height;
    protected int hitpoints;
    protected int speed;
}
我想让多个类扩展这个类(每个敌人类型一个),但我需要确保(最好强制)扩展类以某种方式将值分配给所有这些变量

我不想通过构造函数调用传递它们,也不想在其中设置它们——因此,目前我不得不通过简单地将整个减速复制到每个类中,并在同一行中为它们赋值来实现这一点

有没有更有效的方法? (如果问题有点模糊,很抱歉……)

提前谢谢

编辑-这是我创建扩展类的方式:

public class Skeleton extends Enemy {
    protected int x, y;
    protected int width, height;
    protected int hitpoints;
    protected int speed;
}

您的类骨架不应声明与中设置的相同的变量


对于您的问题,最简单的选择是将变量设置为final,然后在构造函数中设置它们。编译器将强制所有变量都已设置。

您的类骨架不应声明与中设置的变量相同的变量

对于您的问题,最简单的选择是将变量设置为final,然后在构造函数中设置它们。编译器将强制它们都已设置。

基于注释(尽管我会在超类上使用构造函数),一种方法是将敌方类声明为抽象类(如果您只想在那里定义常见行为,可能应该是抽象类),并将变量初始化为对抽象方法的调用。 这样,扩展类将被迫实现这些方法,并在本质上初始化变量

下面是一个简化的示例:

public abstract class Enemy {
    protected int x = getX();
    protected int y = getY();

    protected abstract int getX();
    protected abstract int getY();
}

public class Skeleton extends Enemy {
    @Override
    protected int getX() { return 10; }

    @Override
    protected int getY() { return 10; }
}
它更详细,但可能达到了您所期望的可读性。

根据注释(尽管我会使用超类上的构造函数),一种方法是将敌方类声明为抽象类(如果您只想在那里定义常见行为,可能应该这样做)并将变量初始化为对抽象方法的调用。 这样,扩展类将被迫实现这些方法,并在本质上初始化变量

下面是一个简化的示例:

public abstract class Enemy {
    protected int x = getX();
    protected int y = getY();

    protected abstract int getX();
    protected abstract int getY();
}

public class Skeleton extends Enemy {
    @Override
    protected int getX() { return 10; }

    @Override
    protected int getY() { return 10; }
}

它更详细,但可能达到了您所期望的可读性。

我认为您应该创建一个类型接口

interface Type
{
    int getX();
    int getY();
    int getWidth() ;
    int getHeight();
    int getHitpoints();
    int getSpeed();
}

然后编译器将执行执行工作。

我认为您应该创建一个类型接口

interface Type
{
    int getX();
    int getY();
    int getWidth() ;
    int getHeight();
    int getHitpoints();
    int getSpeed();
}

然后编译器将执行强制工作。

要强制子类在构造函数中设置值并使构造函数调用可读,您必须在超类中编写更多的代码。这是我思考问题的一种方式(仅显示
x
y
):

更新:如果使用封装相关值的复合类型是有意义的,那么它们可以使代码变得更好:

class Skeleton extends Enemy {
  public Skeleton() {
    super(position(12, 13), size(300, 300), ...);
  }
}

为了强制子类在构造函数中设置值并使构造函数调用可读,您必须在超类中编写更多的代码。这是我思考问题的一种方式(仅显示
x
y
):

更新:如果使用封装相关值的复合类型是有意义的,那么它们可以使代码变得更好:

class Skeleton extends Enemy {
  public Skeleton() {
    super(position(12, 13), size(300, 300), ...);
  }
}

若尔多回答的另一种选择是使用:


如果某些参数可能是默认的,则在
SkeletonBuilder
构造函数中设置它们。如果需要其他参数,则您可以在生成器中设置
布尔
标志,或者使用装箱对象,如果未设置,则在
build()
方法中失败。

若尔多的答案的一个替代方法是使用:


如果某些参数可能是默认的,则在
SkeletonBuilder
构造函数中设置它们。如果其他参数是必需的,那么您可以在生成器中设置一个
boolean
标志,或者使用装箱对象,如果未设置,则在
build()
方法中失败。

设置所有变量,如果不是在构建时?您可以发布一个您现在正在做的示例吗,解释一下有什么问题?我确实想在构造时设置它们,我的问题围绕着在扩展类中分配多个重要变量的方式。@Acid:那么为什么不作为超类构造函数参数?为什么不使用构造函数?我希望你想从你的敌人类扩展,因为你想要多态行为,而不仅仅是重用代码。设置所有变量的时间,如果不是在构建时?你能发布一个你现在正在做的事情的例子,并解释它的错误吗?我确实想在构建时设置它们,我的问题围绕着我应该如何在一个扩展类中分配多个重要变量来展开。我的问题是:那么为什么不作为超类构造函数参数?为什么不使用构造函数?我希望您希望从您的敌人类扩展,因为您希望多态行为,而不仅仅是重用代码。我知道我不必这样做,我只是隐藏扩展类的成员。至于在构造函数中设置它们。。。像这样的一行代码对我来说不是很愉快:
super(50100,60,20,30,4)我最近没做过,但你知道你不必叫super?继承的字段将成为骨架的一部分,因此可以在骨架构造函数中指定它们,而无需将它们传递给超级构造函数。我不确定什么是最佳实践。一个(更糟糕的是,IMO)替代方法是将所有值设置为一个“奇怪”的数字(如-1或Integer.MIN_值),然后在使用对象之前的某个“适当”时间检查所有值是否已更改。如果不是,抛出一个异常。但确定“适当”的时间可能很棘手,强制检查也很困难。我想你可以通过要求getter和check来实现。还有另一个选择