2017-01-11 6 views
0

В моем приложении 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.

Возможно ли это как можно? Или я просто глуп, и мне придется создавать этот интерфейс на нескольких точках?

+0

Вы спрашиваете, как создать синглтон? – shmosel

+0

Почему бы вам не попробовать 'enum' –

+1

В соответствии с вашим требованием вы можете использовать шаблон Builder. Вот это хорошее объяснение с примером для того же [link] (https://sourcemaking.com/design_patterns/builder) –

ответ

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 по умолчанию не имеет значения, поэтому вам нужно обрабатывать случаи с нулевым указателем.

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(); 
} 
+0

Я не хочу использовать Enum, поскольку у меня нет нескольких строковых значений, у меня есть много таких функций, как EnginePower, Color, NumberOfSeats и т. Д. И в соответствии с этой ссылкой https://developer.android.com/topic/performance/memory.html Вам следует строго избегать использования перечислений на Android. – Raheel

 Смежные вопросы

  • Нет связанных вопросов^_^