我想知道使用Java的Object类的一般意见是什么:
private Car myCar;
private String myCarBrand;
public void set(String variableToSet, Object valueToSet){
if(myCarBrand.equals("AUDI")){
if(varibleToSet.equals("COLOR"))
(Audi myCar).setColor((Color) valueToSet);
...
}
...
}
不知怎的,我觉得我不应该使用Object类。但是我这样做的原因是并非所有汽车都具有相同的setter功能,现在我可以将它拆分为多个具有相同名称的setter,但使用不同类型的valueToSet
,但是需要更多的代码,尤其是如果我valueToSet
的类型大不相同。
由于
勘误表
Audi extends Car
setColor应该代表一个不适用于所有汽车的类,turnOnBackSeatDiscoLights
之类的东西可能更适合。
答案 0 :(得分:4)
我不同意您编写O-O编程的代码设计。
你应该将你的类设计为Car类,在car对象中,你应该有一个设置颜色的方法
public Car{
//attributes of your car class
private brandName;
private color;
....
....
...constructor...
public setColor(String color)
this.color = color;
public setbrandName(String brandName)
this.brandName = brandName;
}
从你的问题来看,我不知道你的班级实际指的是什么,但是,你的功能不应该只有一个名称“设置”,这是不合适的,很难猜出它意味着什么,做什么。记住在编写OO编程时,你应该记得做抽象。
具体到你的答案,我可以建议
利用基类(Car)的继承。您可以将您的Car类视为抽象类。 对于包含特定属性或方法的汽车的特定品牌名称,您应该对Car类进行子类化。
要记住的一点是,对于您声明的每个方法属性,它们必须对您的类具有一些“含义”。这是OO的重要概念,否则,您的代码将不会被其他人轻易维护,一个糟糕的例子就是您的设置功能。
答案 1 :(得分:3)
简短的回答,不要编写自己的代码来执行此操作 - 使用java bean。
你打算如何调用set()方法?它是由一些xml或属性文件驱动的吗?
考虑使用类java.beans.Introspector。
答案 2 :(得分:1)
至少有一些情况是在标准库中完成的(例如Container.add(Component comp, Object constraints)
),所以这不是史无前例的。
答案 3 :(得分:1)
此代码的问题在于您正在失去类型安全性。请考虑以下代码:
Car car = new car();
car.setBrand("AUDI");
car.set("COLOR", "red"); //ka-boom
您可以使用继承来定义基础车,然后从中进行扩展。
public class Car {
//....
}
public class Audi extends car {
//....
}
答案 4 :(得分:1)
在我看来,这不是一个好主意。您正在抛弃Java编译时类型检查的所有优点。
如果颜色属性与所有汽车相关,则应该能够设置或获取它而不会转换为类似Audi
的子类。如果您的对象具有不同的行为和不同类型的属性,则无论如何都需要更多代码来处理此问题,即使您有一个非常通用的set
方法。
答案 5 :(得分:1)
然而我这样做的原因是并非所有汽车都具有相同的setter功能,现在我可以将它分成多个具有相同名称的setter,但是使用不同类型的valueToSet,但是需要更多的代码,特别是如果我的valueToSet有很多不同的类型。
处理具有不同属性/ getter / setter的不同类型事物(在本例中为Cars)的方法是定义类的层次结构。
这需要更多代码,但代码更简单,并且它是静态类型的,因此更可靠。