Java构造函数或新类

时间:2012-02-27 21:46:39

标签: java

嘿,我是新的java,请原谅我,如果我要问的是显而易见的,但我会尽力解释。

它只是一个为大学设定的项目,所以它不是一个严肃的方式。

我有一个名为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];
}

8 个答案:

答案 0 :(得分:2)

我要说你应该在这里添加工厂方法

基本上,保留你的构造函数,但添加像

这样的方法
static Room createLaundryRoom(laundryRoomParameters) {
  return new Room(...laundry room parameters plus defaults
    common to all laundry rooms...);
}

答案 1 :(得分:1)

面向对象编程的一大好处是可以不在代码中重复自己。因此,对象定义数据(成员)和功能(方法),并且不需要在运行时使用硬值创建这些“原型”的实例。为每个房间创建一个新类

  

可能只与另一个房间的墙壁上的几米不同

将通过重复拒绝OOP(和Java)。我坚持使用构造函数,如果类似的房间最终出现,请尝试使用其中一种静态工厂方法,或使用inheritanceOracle分解常用功能。

答案 2 :(得分: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创建一个对象,在它中你有高度和宽度,另一个用于天花板,你不应该有一些东西作为一个字段,你应该有一个数组来存储加热器对象,和等等,但这很快,符合你的要求。

答案 3 :(得分:1)

您没有显示MarsRoom的字段,但是对于每个功能,我都会有一个子对象集合。 MarsRoom有一个Windows列表。 MarsRoom有一个墙壁列表。等等...然后为每个添加setter和getter以及添加这些功能的新实例的方法。

因为这是为了学校,我只包括一些伪代码。

 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

}

答案 4 :(得分: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);

当然,如果你想以这种方式设置所有参数,它比单个构造函数更长(你可能更具可读性)。但是如果你只设置10个中的2个参数,通常会更方便。

答案 5 :(得分:0)

如果你要做的就是不复制你传递构造函数的参数,你可以简单地将它们放在一个单独的静态方法中,如下所示:

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

答案 6 :(得分:0)

你也可以使用一些多态或者有不同类型的房间或类似的东西,然后有一个超类,其中包含所有房间都有的公共值。

您还可以拥有多个构造函数,并根据房间类型等为您希望设置的值设置不同的构造函数。

答案 7 :(得分: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;
}