我有一个名为“Cell”的类,其中我(认为我)需要多个构造函数
目标是稍后将单元格添加到 excel 工作表中,当添加到 excel 工作表时,您需要添加要将 excell-cell 设置为的数据类型,因此我想从单元格类中检索数据类型
public Object val;
public Cell (BigDecimal val)
{
this.val = val;
}
public Cell (String val)
{
this.val = val;
}
public Cell (int val)
{
this.val = val;
}
我有2个问题
或者我是否完全离开这里,是否有完全不同的方式来解决这个问题?
实现此目的的最佳方法是定义一个
Cell
接口并实现多个扩展该接口的类。
public interface Cell {}
之后是每个单元格类型的实现类:
public class StringCell implements Cell {
private String value;
public StringCell(String value){
this.value = value;
}
// ... getters and setters etc
}
你可以稍后根据你的实现类的类型找出值是什么类型。
也许
Cell
在您的情况下太笼统了。例如,您可能会考虑为 NumericCell
和 StringCell
设置不同的类:
class NumericCell implements Cell {
private BigDecimal val;
public NumericCell (BigDecimal val) {
this.val = val;
}
public NumericCell (int val) {
this(BigDecimal.valueOf(val));
}
}
class StringCell implements Cell {
private String val;
public StringCell (String val) {
this.val = val;
}
}
您可以将
Cell
保留为抽象类或接口,并将您希望所有单元执行的通用方法放在那里,例如
interface Cell {
String content();
}
现在 StringCell 可以实现它并简单地返回 val,而
NumericCell
知道它在 BigDecimal 上运行,因此它可以执行一些格式化,例如只显示 2 位小数和四舍五入的数字:
@Override
public String content() {
return val.setScale(2, RoundingMode.FLOOR).toString();
}
这叫做多态性,它是 OOP 中非常强大的工具。你可以在这里阅读更多相关信息:https://www.w3schools.com/java/java_polymorphism.asp
如果您确实需要对其执行特定操作或需要知道变量当前存储的确切数据类型,那么使用泛型类型将任意数据存储在变量中并不是一个好主意。
你可以做一些事情来修复它。一个想法:为您的班级使用继承。 IE。定义
public class StringCell extends Cell {
public String val;
public StringCell (String val) {
this.val = val;
}
// getType() and getValue() function
// some specific operations for StringCell
}
然后您可以使父类抽象并定义一个
getType()
和getValue()
函数。由于您使用的是不同的类型,因此我不会将val
存储在父类中。然后,如果您需要数据的特定功能,您可以在子类中实现它(即addIntCell(IntCell c2)
等)。
这种方法还可以让您处理字符串数据的任意字符串。如果您只进行数字运算,您也可以进行类型转换,例如
BigDecimal
(因为它具有高分辨率)然后存储另一个变量type
。这可以是来自枚举的值。然后,检索值的函数可以尊重 type
变量并相应地获得输出。
重要提示:输出值必须是通用的/兼容的。因此,即使您知道该变量是字符串值的,当该值可以从多个来源检索时您也应该小心(即在另一个实例中它产生一个整数)。所以要小心假设并时不时停下来进行一些健全性检查。具体来说,上面提到的
getValue
函数需要为所有子类返回相同的数据类型。