我如何将这个if-else块转换为开关盒?(JAVA)

时间:2019-01-30 19:27:20

标签: java switch-statement

我一直在试图找出答案,但是我发现在Controller.vehicle上切换时存在问题,因为它是一个浮点值。我尝试将其转换为String,但是它确实起作用,并且将其转换为整数,恐怕会降低精度。

    if(Controller.vehicle instanceof Boat) {
        file = new File(System.getProperty("user.dir")+"/src/img/boat.png");
    }
    else if(Controller.vehicle instanceof Ship) {
        file = new File(System.getProperty("user.dir")+"/src/img/ship.png");
    }
    else if(Controller.vehicle instanceof Truck) {
        file = new File(System.getProperty("user.dir")+"/src/img/truck.png");
    }
    else if(Controller.vehicle instanceof Motorcycle) {
        file = new File(System.getProperty("user.dir")+"/src/img/motorcycle.png");
    }
    else if(Controller.vehicle instanceof Bus) {
        file = new File(System.getProperty("user.dir")+"/src/img/bus.png");
    }
    else if(Controller.vehicle instanceof Car) {
        file = new File(System.getProperty("user.dir")+"/src/img/car.png");
    }
    else if(Controller.vehicle instanceof Bicycle) {
        file = new File(System.getProperty("user.dir")+"/src/img/bicycle.png");
    }
    else if(Controller.vehicle instanceof Helicopter) {
        file = new File(System.getProperty("user.dir")+"/src/img/helicopter.png");
    }
    else if(Controller.vehicle instanceof Airplane) {
        file = new File(System.getProperty("user.dir")+"/src/img/airplane.png");
    }
    else if(Controller.vehicle instanceof Tram) {
        file = new File(System.getProperty("user.dir")+"/src/img/tram.png");
    }
    else if(Controller.vehicle instanceof Train) {
        file = new File(System.getProperty("user.dir")+"/src/img/train.png");
    }

4 个答案:

答案 0 :(得分:4)

使用多个instanceof操作通常意味着您的设计不好。

无论车辆类别是什么,它都应具有抽象的getImageFile()方法,并且其每个子类(Ship,Truck等)都应重写该方法以获得正确的图像。因此,您上面的方法将只包含一行:

  file = Controller.vehicle.getImageFile();

这将解决其中某些图像文件可能是.jpg,某些可能是.png等问题的可能性。

答案 1 :(得分:0)

在这种情况下,您可以尝试执行以下操作:

file = new File(System.getProperty("user.dir") + "/src/img/" + 
Controller.vehicle.getClass().getSimpleName().toLowerCase() + ".png");

答案 2 :(得分:0)

不要上课, 而是让类公开文件名。

某些代码:

public interface ThingWithImage
{
  public string getImageFileName();
}


public class Boat implements ThingWithImage
{
  @Override
  public string getImageFileName()
  {
     return "boat.png";
  }
}

花点功夫, 您还可以使每个类的图像文件名可配置。 例如(使用Spring):

public class Boat implements ThingWithImage
{
  @Value("${image.file.name.boat}")
  private String boatImageFileName;

  @Override
  public string getImageFileName()
  {
     return boatImageFileName;
  }
}

答案 3 :(得分:0)

我认为,出于最佳做法,您应该阅读this帖子。 正如Leo和Fred所写的那样,车辆类(可能是抽象或接口)应具有一个名为getName()的函数,并且每次植入均应重写此方法并返回其自己的名称。

abstract class Vehicle{

public abstract String getName();

}

class Airplane extends Vehicle{

public String getName(){ return "airplane";}

}

,您应该这样使用它:

file = new File(System.getProperty("user.dir")+"/src/img/"+Controller.vehicle.getName()+".png");