我可以拥有一个接口

时间:2017-01-11 07:08:23

标签: java android architecture singleton

在我的Android应用程序中,我有一个类,它给我静态字符串值;像这样的东西:

public class VehicleInfo {

    public static String getVehicleEnginePower(boolean isNew) {
        return isNew ? "1800CC" : "1600CC";
    }
}

现在我有另一个类别,所以我将不得不传递另一个布尔值,我将得到我需要的值。但是,这些类别将继续增加。所以我调查了Open/Closed principle看起来有希望快速增强的内容。为了确保这一点,我将VehicleInfo类作为接口,然后我将有其他类实现VehicleInfo

public interface VehicleInfo {
    String getVehicleEnginePower();
}

public class NewVehicle implements VehicleInfo {
    @Override
    public String getVehicleEnginePower() {
        return "1800CC";
    }
}

和其他类别类也将是这样的。通过这种方式,我将为所有新类别添加另一个类。

我想问的问题是:有没有办法让我可以拥有这个界面的单个实例?因为在整个应用程序流程中,用户只能在切换到另一个类别之前才能看到一个类别。

我不想在多个点实例化这些类。为了澄清我的问题,我想在申请开始时做这样的事情:

if (isNew) {
    VehicleInfo vehicleInfor = new NewVehicle();
}

在整个应用程序中,每当我调用VehicleInfo.getVehicleEnginePower时,它应始终从NewVehicle类返回引擎功率。

这样的事情可能吗?或者我只是愚蠢而且我必须在多个点上实例化这个界面?

2 个答案:

答案 0 :(得分:2)

也许你需要一个单身人士

public class VehicleInfoManager {
    private static VehicleInfoManager INSTANCE = new VehicleInfoManager();

    private VehicleInfo currentVehicleInfo;

    public static VehicleInfoManager getInstance() {
        return INSTANCE;
    }

    public void setCurrentVehicleInfo(VehicleInfo info) {
        this.currentVehicleInfo = info;
    }

    public String getVehicleEnginePower() {
        return this.currentVehicleInfo.getVehicleEnginePower();
    }

    private VehicleInfoManager() {
        // Constructor private by default
    }
}

然后你可以像这样从任何地方调用它

VehicleInfoManager.getInstance().getVehicleEnginePower()

//Or set current info like this
VehicleInfoManager.getInstance().setCurrentVehicleInfo(new NewVehicle())

请注意,默认情况下currentVehicleInfo为null,因此您需要处理空指针案例。

答案 1 :(得分:1)

如果我理解你的问题。

我的解决方案是Enum

public enum VehicleEnginePower {
    NEW ("1800CC"),
    OLD ("1600CC"),

    private final String name;       

    private Modes(String s) {
        name = s;
    } 

    public String toString() {
       return this.name;
    }
}

然后你可以

if (isNew) {
   String powerOfEngine = VehicleEnginePower.NEW.toString();
}