2015-01-20 2 views
-2

Я нахожусь в стадии обучения Java.Объекты как переменные экземпляра - где использовать новый оператор

Я занимаюсь некоторыми практическими упражнениями и немного замешаны в использовании переменных экземпляра для хранения объектов, в частности, создавая «новые» экземпляры этих объектов.

Одно упражнение начального уровня просит меня создать проект, позволяющий заказать бронирование билетов в месте проведения. Меня попросили настроить следующее:

i) Перечислимый тип, представляющий тип одного события, которое должно быть организовано в месте проведения.

ii) Класс (простой) Дата, обозначающая дату события.

iii) A (простой) класс Цена, представляющая стоимость билета.

iv) A (простой) класс с открытым методом getSeatingCapacity(), который возвращает емкость места.

я застрял именно на этот вопрос:

Далее, реализовать класс событий для представления одного события. i) Определите и реализуйте поля и конструктор (ы), которые вам понадобятся (см. Выше);

v) Используйте свой ответ для a) ii) для представления даты события;

vi) Используйте свой ответ для a) iii) для представления цены билета;

vii) Используйте свой ответ для a) iv) для представления места проведения.

Данный ответ выглядит следующим образом:

public class Event 

{ 
    private EventType eventType; 
    private String eventTitle; 
    private int numberOfAvailableTickets; 
    private Date eventDate; 
    private Price ticketPrice; 
    private Venue venue; 

public Event(EventType typeOfEvent, String titleOfEvent, Venue venue, Date dateOfEvent, Price priceOfTicket) 
    { 
     eventType = typeOfEvent; 
     eventTitle = titleOfEvent; 
     this.venue = venue; 
     eventDate = dateOfEvent; 
     ticketPrice = priceOfTicket; 
     numberOfAvailableTickets = venue.getSeatingCapacity(); 
    } 

Однако мой ответ заключается в следующем:

private Venue location; 
    private String title; 
    private int totalTickets; 
    private EventType genre; 
    private Date date; 
    private Price price; 

public Event(String title, int totalTickets, EventType genre) 
    { 
     location = new Venue(); 
     this.title = title; 
     this.totalTickets = totalTickets 
     this.genre = genre; 
     price = new Price(90); 
     date = new Date(""); 
    } 

Я думал, что я должен был создать экземпляры каждого из этих объектов в конструкторе, используя новый оператор, иначе как они будут созданы? И тогда я мог бы использовать set methods для установки новых значений. Но, похоже, это неправильно? Может ли кто-нибудь помочь в разработке?

+3

Пожалуйста, переформатируйте свой вопрос. – Maroun

+0

Инициализация полей по параметру конструктора или путем создания объекта в конструкторе являются действительными решениями для разных вариантов использования. –

ответ

2

В основном вы бы установить значение этих параметров, например, в несколько способах:

  • Инициализировать их, передавая значения в качестве параметров конструкторов.
  • Инициализация их путем создания новых экземпляров со значениями по умолчанию внутри вашего конструктора (например, new Date() создает новую дату из текущей временной метки системы).
  • Инициализировать их в блоке инициализатора или во время объявления.

Сетчаты обычно используются для изменения значений, например. при установке новой даты или новой цены. Общим подходом было бы оставить переменные экземпляра с нулевым значением и использовать установщик для изменения тех, которые необходимо изменить.

Обратите внимание, что переменные не-примитивных типов (например, все, что не является int, long и т. Д.) являются ссылками на другие объекты, поэтому в основном, когда вы их устанавливаете, вы ссылаетесь на объекты, которые существуют в другом месте. Используя new для создания нового экземпляра объекта, просто сделайте это и верните ссылку на этот новый экземпляр, то есть Date date = new Date() сначала создаст новый экземпляр Date в куче, а затем назначит ссылку на этот экземпляр переменной date.

Так как я предполагаю, что вы не совсем знакомы с инициализатором блоками, вот что я имею в виду:

class SomeClass { 
    private int i; //will be initialized to 0 
    private Date date; //will be initialized to null 
    private String s = "hello"; //will create a new String object with the value "hello" and assign that instance to variable s 

    //the following block is an instance initializer block which is called before the constructor 
    { 
    date = new Date(); 
    } 

    //This is a static initializer block which is called when the class is loaded, 
    //but which cannot be used to initialize instances 
    static 
    { 
    System.out.println("class has been loaded"); 
    } 
} 
+0

Преодоление сеттеров и геттеров означает победить цель программирования OO - вы просто нарушаете инкапсуляцию. – slnowak

+0

@slnowak, конечно, это всегда о чем подумать, но поскольку OP является новым для Java, я бы оставил эти более продвинутые темы на данный момент;) – Thomas

+0

Да, вы, вероятно, правы. Но я помню время, когда я изучал основы Java и программирование OO - они просто сказали мне использовать сеттеры/геттеры для доступа к свойствам, и в то же время они говорили об инкапсуляции. Это, конечно, совсем не совпадает. Поэтому я думаю, что OP должен знать об этом. – slnowak

1

Считает, что несколько событий могут иметь место в том же Venue. В этом случае несколько объектов Event могут использовать один и тот же объект Venue. В вашем коде каждый Event будет иметь уникальный объект Venue. Ваш подход был бы более подходящим, если Venue был уникальным свойством Event (т. Е. Не используется другими пользователями Event).

Поэтому имеет смысл либо передать Venue объект в конструктор Event или иметь setVenue метод, который будет принимать Venue объект.

1

Оба являются действительными в этом очень простом примере, который у вас здесь, но представьте себе ситуацию, когда класс Price, например, имел более сложную настройку, требующую информации, к которой у вас не было доступа в контенте Event.

Тогда вам нужно будет установить фиктивную цену и снова использовать setPrice(), чтобы исправить это. Это требует дополнительного шага, которого можно было бы избежать, передав уже инициализированный объект в конструктор Event.

Я считаю, что в конечном итоге преимущество заключается в том, чтобы сохранить конструктор простым и релевантным классу.

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