2015-03-03 2 views
2

Сейчас я работаю над базовой java-программой, которая принимает несколько параметров в конструктор для чашки кофе. Это достаточно легко, но у меня возникла проблема с созданием метода суммирования количества чашек кофе, которые я создал.Как суммировать количество экземпляров объекта в Java?

До сих пор это класс UseCoffee я создал:

public class UsesCoffee{ 
    public static void main(String args[]) { 
    System.out.println("cups created: " + Coffee.totalCups()); 

    Coffee cup1 = new Coffee(350, "mint", true); 
    System.out.println("cup1: " + cup1); 
    Coffee cup2 = new Coffee(500, "mocha", false); 
    System.out.println("cups created: " + Coffee.totalCups()); 
    System.out.println("cup2: " + cup2); 
    Coffee cup3 = new Coffee(350, "no flavour used", false); 
    cup3.doubleSize(); 
    System.out.println("cup3: " + cup3); 

    Coffee cup4 = new Coffee(-10, "mocha", false); 
    System.out.println("cup4: " + cup4); 

    System.out.println("cups created: " + Coffee.totalCups()); 

    if (Coffee.bigger(cup3,cup2)) 
    System.out.println("cup3 is bigger than cup2"); 

    if (Coffee.bigger(cup1,cup2)) 
    System.out.println("cup1 is bigger than cup3"); 

    if (Coffee.bigger(cup1,cup1)) 
    System.out.println("cup1 is bigger than itself"); 
} // end main 
} // end UsesCoffee 

И это кофе класса я создал:

public class Coffee { 
    private int coffeeVol; 
    private String coffeeFlav; 
    private boolean yesCream; 

    public Coffee(int volume, String flavour, boolean cream) { 
     this.coffeeFlav = flavour; 
     this.coffeeVol = volume; 
     this.yesCream = cream; 
     if (volume < 0) { 
      System.out.println("error: negative size. Defaultsize of 250 ml used"); 
      coffeeVol = 250; 
     } 

    } 

    public String toString() { 
     return coffeeVol +"ml, " + coffeeFlav + ", " + yesCream; 
    } // end toString 

public static int totalCups() { 
     //THIS IS WHERE I'M HAVING TROUBLE 
    } 

public int doubleSize() { 
     coffeeVol = coffeeVol*2; 
     return coffeeVol; 
    } 


} 

Есть ли способ суммировать количество чашек кофе? Я действительно потерян в этом отношении, и любая помощь приветствуется!

+2

возможно дубликат [? Как подсчитать количество экземпляров определенного класса в дереве наследования, созданный явно] (http://stackoverflow.com/questions/21013349/how- to-count-the-number-of-the-the-specific-class-in-inheritance-tree) –

+0

Я ничего здесь не расширяю, просто звоню из другого класса. –

+3

Да, но решение должно по-прежнему применяться. Трюк заключается в объявлении статической переменной счетчика и приращении ее в конструкторе. –

ответ

3

Вы можете добавить статическую переменную в свой класс Coffee и увеличить его в своем конструкторе.

Нечто подобное:

public class Coffee { 
    private static int numberOfCups = 0; 
    private int coffeeVol; 
    private String coffeeFlav; 
    private boolean yesCream; 

    public Coffee(int volume, String flavour, boolean cream) { 
     this.coffeeFlav = flavour; 
     this.coffeeVol = volume; 
     this.yesCream = cream; 
     if (volume < 0) { 
      System.out.println("error: negative size. Defaultsize of 250 ml used"); 
      coffeeVol = 250; 
     } 
     numberOfCups++; 
    } 

    public String toString() { 
     return coffeeVol +"ml, " + coffeeFlav + ", " + yesCream; 
    } // end toString 

    public static int totalCups() { 
     return numberOfCups; 
    } 

    public int doubleSize() { 
     coffeeVol = coffeeVol*2; 
     return coffeeVol; 
    } 

    public static boolean bigger(Coffee cup1, Coffee cup2) { 
     if (cup1.coffeeVol > cup2.coffeeVol) { 

      return true; 
     } 
     return false; 
    } 
} 
+0

Если вы хотите быть точным, вы должны переопределить finalize() с totalCups - чтобы отброшенные чашки не были частью общего количества чашек. – Clashsoft

+1

Я бы сказал, это зависит. Он хотел, чтобы количество экземпляров было создано, а не количество экземпляров, находящихся в настоящее время в памяти;) – Marvin

1

То, что вы хотите сделать, это создать статическое поле и увеличивать его каждый раз, когда вызывается конструктор.

public class Coffee { 

    private static int totalCups; 

    // rest of the code ... 

    public Coffee(int volume, String flavour, boolean cream) { 
     totalCups++; 
     // rest of the code... 
    } 

    public static int getTotalCups() { 
     return totalCups; 
    } 
} 
// rest of the code ... 

Вы хотите сделать поле и метод статичными, потому что они будут доступны всем экземплярам Coffee. Вы хотите сделать totalCups частным полем из-за инкапсуляции данных (вы не хотите, чтобы кто-то мог изменить общее количество чашек, которое может быть логически модифицировано только через конструктор), а затем получить его с помощью общедоступного метода getter (который позволяет вы должны выполнить дополнительную проверку данных)

+0

Возможно использование совпадающих имен переменных для предотвращения ошибок компиляции (вы забыли его даже после редактирования)? – Marvin

+0

«totalCups не был инициализирован» –

1

Возможно, вы захотите использовать что-то, называемое блоком инициализации, и статическое целочисленное поле для хранения текущего количества экземпляров вашего класса. На мой взгляд, это лучший способ сделать то, что вы хотите.

public class Coffee 
{ 
    // Hold the number of instances. 
    private static int instances; 

    // This snippet of code will run whenever one of the // 
    // constructors below is called. All subclasses will // 
    // automatically inherit this too, by the way. // 
    { 
     instances++; 
    } 

    // first constructor 
    public Coffee() {} 
    // second constructor 
    public Coffee(int Foo) {} 
    // third constructor 
    public Coffee(double Bar) {} 

    // return the number of instances you have. 
    public static int totalCups() 
    { 
     return instances; 
    } 
} 
+0

Это неправильно. Для каждого экземпляра класса 'Cofee' поле' экземпляры 'будет всегда '1', так как это нестатический атрибут, то есть он не будет использоваться для разных экземпляров класса. Кроме того, он должен быть 'private', так что он не изменяется из-за пределов класса' Cofee'. –

+1

Спасибо, что рассказали мне, я утверждал, что требуется статическое поле, но я забыл использовать его в фрагменте кода. Тем более, что я делаю это. – zxgear

+0

Ваш вопрос действителен, и я согласен. Теперь проголосовали за то, что вы исправили свой код. –

1

Если вы хотите, чтобы сосчитать #/чашки ... и вы хотите сравнить каждую из чашек друг с другом («который чашка является крупнейшим») ... тогда вы действительно должны рассмотреть возможность использования a Collection.

Пример:

public class UsesCoffee{ 

    public static void main(String args[]) { 
    ArrayList<Coffee> cups = new ArrayList<Coffee>(); 
    System.out.println("cups created: " + cups.size()); 

    cups.add(new Coffee(350, "mint", true)); 
    cups.add(new Coffee(500, "mocha", false)); 
    System.out.println("cups created: " + cups.size()); 

    Coffee biggestCup = cups.get(0); 
    for (Coffee cup : cups) { 
     if (cup.coffeeVol > biggestCup.coffeeVol) 
     biggestCup = cup; 
    } 
    System.out.println("biggest cup is " + biggestCup.coffeeVol); 
    } 
} 
Смежные вопросы