【问题标题】:Can I have a single instance of Interface我可以有一个接口实例吗
【发布时间】:2017-05-25 21:08:25
【问题描述】:

在我的 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 类返回引擎功率。

这样的事情可能吗?或者我只是很傻,我将不得不在多个点上实例化这个接口?

【问题讨论】:

  • 你是在问如何创建单例?
  • 你为什么不试试enum
  • 根据您的要求,您可以使用 Builder Pattern 。这是相同link的示例的很好解释
  • @shamosel 是这样的。

标签: java android architecture singleton


【解决方案1】:

也许你需要一个单例

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,因此您需要处理空指针情况。

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题。

    我的解决方案是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();
    }
    

    【讨论】:

    • 我不想使用 Enum,因为我没有多个字符串值,我有很多规格,例如 EnginePower、Color、NumberOfSeats 等等。根据这个链接,developer.android.com/topic/performance/memory.html 你应该严格避免在 Android 上使用枚举。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    相关资源
    最近更新 更多