首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中选择不带switch语句的子类

在Java中选择不带switch语句的子类
EN

Stack Overflow用户
提问于 2016-06-11 02:59:39
回答 5查看 874关注 0票数 3

我有一个名为Enemy的基类和各种Enemy类型的子类,如BigEnemy、LazerEnemy、AvoidingEnemy等。

我有一个队形类,它的目的是创建敌人的特殊队形,比如直线,网格,金字塔。

我希望编队能接受我想要创建的敌人的子类类型作为参数。

代码语言:javascript
复制
Formation f = new Formation("LazerEnemy","triangle", 4); // makes a triangle formation of lazer enmies
Formation f = new Formation("BigEnemy","line", 10); // makes a line of big enemies

目前,我打算传递一个名为enemyType的字符串(或者它可能只是一个整数并执行switch语句),但由于我有如此多的敌对类型,我想知道是否有更好的方法来传递我想实例化的对象的类型,而不需要使用switch语句。

也许这与工厂和this问题有关,但我不太理解它。

谢谢

EN

回答 5

Stack Overflow用户

发布于 2016-06-11 03:15:09

如果我理解正确的话,编队构造器必须能够创建给定类型敌人的多个实例。而不是传递类型的敌人作为字符串或类,您应该简单地给队形一种方法来创建敌人,即工厂,或供应商的敌人:

代码语言:javascript
复制
public clas Formation<E extends Enemy> {

    // we'll store them in a list
    private List<T> enemies;

    public Formation(Supplier<E> enemySupplier, int count) {
        enemies = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            enemies.add(enemySupplier.get());
        }
    }
}

如果LazerEnemy有一个无参数的构造器,你可以这样创建一个LazerEnemy的构造器:

代码语言:javascript
复制
Formation<LazerEnemy> f = new Formation<>(LazerEnemy::new, 10);

假设LazerEnemy构造函数的lazer需要一个强度,您可以使用

代码语言:javascript
复制
int strenth = 5;
Formation<LazerEnemy> f = new Formation<>(() -> new LazerEnemy(strength), 10);

因此,简而言之,让呼叫者决定并指定如何创建队形中的敌人,而不是强迫队形知道如何创建所有类型的敌人。

票数 4
EN

Stack Overflow用户

发布于 2016-06-11 03:22:01

您可以将类型作为参数传递给方法。

代码语言:javascript
复制
Formation f = new Formation(LazerEnemy.class, Shape.LINE, 4)

public formation(Class<? extends Enemy> enemyType, Shape shape, int num) {
    Enemy enemy1 = enemyType.newInstance(); 
    ...
}

不过,你需要一个try

票数 2
EN

Stack Overflow用户

发布于 2016-06-11 03:06:53

有很多方法可以解决这个问题。其中之一就是使用Dependency Inversion principle。也就是说,new Formation()构造函数的调用者也可以创建敌人:

代码语言:javascript
复制
Formation f1 = new Formation(new LazerEnemy(), "triangle", 4);
Formation f2 = new Formation(new BigEnemy(), "line", 10);

如果这些敌人有很长的构造函数,那么你可以使用依赖注入框架。Google guice是相对容易设置的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37755446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档