Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> наиболее гибкое задание параметров, работа с enam'ами 
:(
    Опции темы
Che0
Дата 1.11.2010, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Пишу программу отображающую работу автомата с напитками. 
сначала задаю набор доступных напитков,и их марки(чай:Липтон,кофе:Neckafe,сахар:Свекольный и тд.) 
Код
Machine m1=new Machine("coffee:COFFEE1","tea:TEA3","sugar:SUGAR2");
 
 тип напитка это отдельный енам, а марка -это  его параметр соответственно
на основе этого уже хочу  как бы делать заказ, Создовая обьект(напиток) с параметрами(сливки, сахар и тд.)
Код

Drink tea1=new Tea("no sugar",m1);


туплю вот над чем: как мне сделать что бы в Machine можно было гибко задавать параметры .т.е что бы можно было задать только кофе и сахар, Или же и кофе и сахар и чай и пиво и все это в любой последовательности. Как бы создавать разные автоматы по функционалу.

PM MAIL   Вверх
aleksandy
Дата 2.11.2010, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 4
Всего: 5



Все параметры реализуют один интерфейс. А конструкторы принимают на вход массив объектов этого типа. Вместо явного указания массива можно использовать переменное количество аргументов. Как-то так...
PM   Вверх
Che0
Дата 2.11.2010, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Цитата(aleksandy @ 2.11.2010,  14:22)
Все параметры реализуют один интерфейс. А конструкторы принимают на вход массив объектов этого типа. Вместо явного указания массива можно использовать переменное количество аргументов. Как-то так...

с интерфейсами я пока не умею работать,но если я правильно понял то так не пойдет, так как в этом случае при изменнении порядка(количесство)набора доступных напитков в Machine , мне придется в каждом классе напитка изменять индекс массива для нужного енама:
если например так
Код

Machine m1=new Machine("tea:TEA3","sugar:SUGAR2");

то индекс 0
Код

public class Tea extends HotDrink  {
        
    public double calcPrice(){
        
        // работа с machine.massiv[0];
        
    }
        
}

а если так
Код

Machine m1=new Machine("coffee:COFFEE1","tea:TEA3","sugar:SUGAR2");

то индекс надо менять на 1
Код

public class Tea extends HotDrink  {
        
    public double calcPrice(){
        
        // работа с machine.massiv[1];
        
    }

а надо что б всегда обращатся, к чему то одному, чтоб не переделывать весь код, при изменнени задачи набора доступных напитков
PM MAIL   Вверх
Astoret
Дата 2.11.2010, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 16.4.2009

Репутация: нет
Всего: 1



Я бы сделал примерно так, если я тебя правильно понял:
Код

package ru.vingrad.forum.evilmachine;

import java.util.HashSet;
import java.util.Set;

public class HotDrink  {

    private double myPrice;
    private double additionPrice;
    private Set<Addition> listOfValidAddition = new HashSet<Addition>();
    private String name;
    
    public HotDrink(String name) {
        this.name = name;
    }
    
    public HotDrink(String name, double myPrice) {
        this.name = name;
        this.myPrice = myPrice;
    }
    
    public String getName() {
        return name;
    }
    
    public void setMyPrice(double myPrice) {
        this.myPrice = myPrice;
    }
    public String getMyPrice() {
        return name;
    }
    
    public double getFullPrice() {
        return myPrice + additionPrice;
    }
    public void addAdditionPrice(Addition addition) {
        if(validateAddition(addition)) {
            additionPrice += addition.getPrice();
        } else {
            System.out.println("Invalid addition!!!");
        }
    }
    
    public void addValidAddition(Addition addition) {
        listOfValidAddition.add(addition);
    }
    
    private boolean validateAddition(Addition addition) {
        return listOfValidAddition.contains(addition);
    }
}



Код

package ru.vingrad.forum.evilmachine;

public class Addition {
    
    private double price;
    private String name;

    public Addition(String name) {
        super();
        this.name = name;
    }

    public Addition(String name, double price) {
        super();
        this.price = price;
        this.name = name;
    }

    public double getPrice() {
     return price;
    }

    public void setPrice(double price) {
     this.price = price;
    }

    public String getName() {
     return name;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Addition other = (Addition) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    
    
}

Ну класс машины с настройкой валидации напитков еще прикрутить можно, но мне лень уже
Код

package ru.vingrad.forum.evilmachine;

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Addition sugar = new Addition("sugar:SUGAR2", 22.2);
        Addition lime = new Addition("lime:Lime1", 13.4);
        Addition milk = new Addition("milk:MILK1", 40.4);

        //Tea setup
        HotDrink tea = new HotDrink("tea:TEA3", 80.1);
        tea.addValidAddition(sugar);
        tea.addValidAddition(lime);
        tea.addValidAddition(milk);
        
        //Coffee setup
        HotDrink coffee = new HotDrink("coffee:COFFEE1", 99.9);
        coffee.addValidAddition(sugar);
        coffee.addValidAddition(milk);
        
        
        // Simulating the process of buying
        
        //Select coffee
        // add sugar
        coffee.addAdditionPrice(sugar);
        // add invalid addition
        coffee.addAdditionPrice(lime);
        
        // Get price
        System.out.println("Full Price = " + coffee.getFullPrice());
        
    }

}

PM MAIL WWW   Вверх
_Y_
Дата 2.11.2010, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Цитата(Che0 @  2.11.2010,  15:30 Найти цитируемый пост)
так как в этом случае при изменнении порядка(количесство)набора доступных напитков в Machine , мне придется в каждом классе напитка изменять индекс массива для нужного енама:


А если в качестве входных данных использовать коллекцию? Или уже внутри конструктора складывать все это в отсортированную коллекцию? Тогда последовательность каждый раз будет одной и той же.

Или такой вариант: По умолчанию создавать TreeMap с ключами, соответствующими полному списку доступных удовольствий (сахар, лимон, и.т.п). Потом загонять входные параметры в TreeMap:

Содержние TreeMap после создания (ключ - значение):
Код

coffe:NULL
tea:NULL
sugar:NULL
lime:NULL
milk:NULL
bear:NULL


Предположим, входные параметры содержат значения ("coffee:COFFEE1","sugar:SUGAR2", "lime:green") в любой последовательности. Грузим их в тот же TreeMap:
Код

coffe:COFFEE1
tea:NULL
sugar:SUGAR2
lime:green
milk:NULL
bear:NULL


При обработке TreeMap пропускаем шаги содержащие NULL. 






--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0806 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.