在没有#ifdef预处理器的情况下定义变量

时间:2012-07-25 08:40:07

标签: java

我有C ++背景。在我的java项目中间的某个地方,我需要定义一个变量,其类型取决于一个布尔值(我之前已经定义过) 我可以这样做:

if(Main.NEW_STYLE)
            ArrayList<LogFileLine> lineBuffer = new ArrayList<LogFileLine>();
        else
            ArrayList<String> lineBuffer = new ArrayList<String>();

如果没有,请问有什么解决方案? 谢谢

4 个答案:

答案 0 :(得分:1)

可能使用原始类型(仅ArrayList),但我强烈不鼓励因为原始类型仅用于向后兼容预通用代码

适当的解决方案可能是将该列表封装到一个接口中,并有两个独立的实现类(并根据布尔值选择实现类)。

答案 1 :(得分:1)

你可以做到这一点,但它对你没有多大帮助。因为ArrayList的范围是if语句的主体。

您可以执行以下操作:

ArrayList<Object> lineBuffer;
if(Main.NEW_STYLE) lineBuffer = new ArrayList<LogFileLine>();
else lineBuffer = new ArrayList<String>();

然后相应地投射你的物体。另一种方法是创建一个容器界面,然后它将是ArrayList

的类型
ArrayList<LogInterface> lineBuffer = new ArrayList<LogInterface>();
lineBuffer.add(new LogInterface_LogFileLine(aLogFileLine));
lineBuffer.add(new LogInterface_String("lalelu"));

然后,您将实现LogInterface的两个版本,一个版本持有StringLogInterface_String),另一个版本持有LogFileLineLogInterface_LogFileLine

但是,既然你命名了你的布尔NEW_STYLE,我想它会完全取代“旧式”,所以我建议你做第一个建议。然后,您必须在访问if (Main.NEW_STYLE) ; else ;的任何位置lineBuffer执行此操作。但是,一旦你不再需要它就会更容易把旧东西踢出去。

答案 2 :(得分:0)

我建议您创建一个界面,捕捉您依赖StringLogFileLine所依赖的方法。称之为LogLine或其他内容,由两个不同的类StringLogLineFileLogLine实现,然后执行

List<LogStyle> lineBuffer = new ArrayList<LogLine>();

答案 3 :(得分:0)

Java没有编译器预处理器。

我相信你正试图在这个语句的末尾有一个ArrayList。所以这就是你应该怎么做的:

ArrayList lineBuffer;
if (...)
    lineBuffer = new ArrayList<String>();
else
    lineBuffer = new ArrayList<LogFileLine>();

lineBuffer.add(something);

但是add可能会导致运行时问题,所以为什么不这样做呢

ArrayList lineBuffer = new ArrayList<Object>()

基本上可以保留什么?