2012-02-27 2 views
1

Привет, я новый java, простите меня, если то, что я собираюсь спросить, очевидно, но я постараюсь объяснить как можно лучше.Java Constructors или новый класс

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

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

Проблема, с которой я столкнулась, - это то, что лучше практики или решения, передать атрибуты размера комнаты в конструкторе (но это может быть довольно длинным по размеру, поскольку ниже приведены не только те, Мне может понадобиться) или создать совершенно другой класс специально для этой комнаты, такой как ROOM TYPE U? и установите атрибуты там.

Как бы то ни было, я могу создать совершенно новую комнату, просто создав комнату с новыми значениями, но она будет немного длинной, в то время как я предпочел бы создать совершенно новый класс для другой комнаты, которая может отличаются от другой комнаты на несколько метров на одной из стен !.

Так что я действительно пытаюсь понять это, так это хорошо передать многие атрибуты конструктору при создании экземпляра?

//the instantiation in the runnable 
MarsRoom room1 = new MarsRoom("RoomU", 40, 40, 20, 20, 8, 2, 4); 

//the constructor in the MarsRoom class 
public MarsRoom(String roomname, int windowsH, int windowsW, int wallsH, int wallsW, int windowC, int heaters, int lights){ 
    name = roomname; 
    TotalWindowHeight = windowsH; 
    TotalWindowWidth = windowsW; 
    TotalWallHeight = wallsH; 
    TotalWallWidth = wallsW; 
    windowCeiling = windowC; 
    numheaters = heaters; 
    numlights = lights; 
    roomheaters = new Heaters[numheaters]; 
} 
+0

Возможно, [Образец Builder] (http://en.wikipedia.org/wiki/Builder_pattern) – GriffeyDog

ответ

2

I скажите, что вы должны добавить заводские методы здесь.

В основном, сохранить свой конструктор, но добавлять методы как

static Room createLaundryRoom(laundryRoomParameters) { 
    return new Room(...laundry room parameters plus defaults 
    common to all laundry rooms...); 
} 
+0

, поэтому, когда я вызываю этот метод, он изменит атрибуты на атрибуты прачечной ?. и этот метод будет помещен в класс MarsRoom? – user969729

+0

Спасибо за ваше время! – user969729

+0

Вы должны передавать только те параметры, которые отличаются в разных прачечных. Затем метод должен заполнить все значения, которые одинаковы для всех прачечных. –

0

Если то, что вы пытаетесь сделать, это просто не дублирует параметры вы передаете конструктор, вы можете просто поместить их в отдельный статический метод, например, так:

public static MarsRoom newRoomU() { 
    return new MarsRoom("RoomU", 40, 40, 20, 20, 8, 2, 4); 
} 
1

Одним из больших преимуществ объектно-ориентированного программирования является возможность не повторять себя в коде. Следовательно, объекты, которые определяют данные (элементы) и функциональность (методы), и не требуют создания экземпляров этих «прототипов» с жесткими значениями до времени выполнения. Для того, чтобы создать новый класс для каждой комнаты, когда он

может только отличаться от другой комнаты на несколько метров на одной из стен

будет отрицать ООП (и Java) по валовому повторению. Я бы придерживался конструкторов, и если подобные виды комнат в конечном итоге появятся, попробуйте один из предложенных статических методов производства или разделите общую функциональность, используя inheritanceOracle.

+0

+1 мне очень помог !. – user969729

+0

@ user969729 в ​​любое время – paislee

0

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

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

1

Создание карты с ключами быть

Map<String, Integer> map = new HashMap(); 
map.put("TotalWindowHeight", new Integer(10)); 
map.put("TotalWindowWidth", new Integer(5)); 
... 
map.put("NumberOfHeaters", new Integer(3)); 

MarsRoom room1 = new MarsRoom("RoomU", map); 

Конструктор будет как:

public MarsRoom(String roomname, HashMap<String, Integer> params) { 
    name = roomname; 
    TotalWindowHeight = map.get("TotalWindowHeight").intValue(); 
    TotalWindowWidth = map.get("TotalWindowWidth").intValue; 
    ... 
    roomheaters = new Heaters[map.get("NumberOfHeaters").intValue()]; 
} 

это не хорошо OO однако, но кажется, что вы ищете что-то быстро. Если вы хотите хороший OO, вам нужно создать объект для Window, и в нем вы имеете ширину и ширину, другую для потолка, и вы не должны иметь число чего-то в качестве поля, у вас должен быть массив для хранения объектов нагревателя и так и так далее, но это быстро и отвечает вашим требованиям.

+0

также использовать подходящие переменные форматы, я даже скопировал ваш .. плохое влияние: p вы должны написать totalWindowHeight вместо TotalWindowHeight и roomName вместо имени комнаты – Isaac

+0

haha, спасибо большое за ваше время! так много ответов, которые мне помогли! но мог выбрать только один, так что я плюнул на все, что помогло. – user969729

1

Вы не показываете поля MarsRoom, но для каждой функции у меня будет коллекция под-объектов. В MarsRoom есть список Windows. У MarsRoom есть список Стены. и т. д. Затем у вас есть сеттеры и геттеры для каждого и методы добавления новых экземпляров этих функций.

Поскольку это для школы, я включаю лишь немного псевдокода.

public class MarsWindow { 
    int  height; 
    int  length; 

    // Setters & Getters 
    // standard getters & setters go here 

    int getArea() { 
     return this.height * this.width; 
    } 
} 

public class MarsRoom { 
    List<MarsWindow> windows; 
    List<MarsWall>  walls; 
    List<MarsLight> lights; 
    List<MarsHeater> heaters; 

    public List<MarsWindow> addWindow(MarsWindow window) { 
     // Add a window to the "windows" list here 
    } 

    public List<MarsWall> addWall(MarsWall wall) { 
     // Add a wall to the "walls" list here 
    } 

    // Do this for the other fields 

    int getTotalWindowArea() { 
     int area = 0; 
     // Iterate over all windows 
     for(MarsWindow window : windows) { 
      area += window.getArea(); 
     } 
     return area; 
    } 

    // Add other calculation methods here 

} 
+0

Большое спасибо! это тоже помогло. Есть так много разных способов приблизиться к нему. – user969729

0

Его всегда лучше работать с объектами, а не с примитивами, вы можете использовать фабрику для создания объектов.

//the constructor in the MarsRoom class 
public MarsRoom(String roomname, WindowDimension windowDimension, WallsDimensions wallDimension, RoomAmbience ambience){ 
    } 

    public class WindowDimension{ 
private int height; //int windowsH 
private int width; //int windowsW 
private int circumference; //assumed windowC is circumference 
} 

public class WallsDimension{ 
private int height; //int wallsH 
private int width; //int wallsW 
} 

public class RoomAmbience{ 
    private int heaters; 
    private int lights; 
} 
1

Хотя технически законные, конструкторы с очень длинными списками аргументов могут быть неудобны в использовании. Это также зависит от того, может ли этот список появиться в будущем или в подклассах.

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

public MarsRoom() { 
    //empty or just basic stuff set here 
} 

public MarsRoom setTotalWindowHeight(int TotalWindowHeight) { 
    this.TotalWindowHeight = TotalWindowHeight; 
    return this; 
} 

public MarsRoom setTotalWindowWidth(int TotalWindowWidth) { 
    this.TotalWindowWidth = TotalWindowWidth; 
    return this; 
} 

... 

тогда, вы можете позвонить:

MarsRoom room1 = new MarsRoom() 
    .setTotalWindowHeight(20) 
    .setTotalWindowWidth(40); 

Конечно, если вы хотите установить все параметров таким образом, это длиннее (возможно, более читаемо), чем единственный конструктор. Но если вы установите только 2 параметра из 10, это, как правило, будет более удобным.

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