在缺少#ifdef预处理器的情况下定义变量 我有C++背景。在我的java项目中间,我需要定义一个变量,它的类型依赖于布尔值(我之前已经定义)。 我可以这样做吗: if(Main.NEW_STYLE) ArrayList<LogFileLine> lineBuffer = new ArrayList<LogFileLine>(); else ArrayList<String> lineBuffer = new ArrayList<String>(); if(Main.NEW_样式) ArrayList lineBuffer=新的ArrayList(); 其他的 ArrayList lineBuffer=新的ArrayList();

在缺少#ifdef预处理器的情况下定义变量 我有C++背景。在我的java项目中间,我需要定义一个变量,它的类型依赖于布尔值(我之前已经定义)。 我可以这样做吗: if(Main.NEW_STYLE) ArrayList<LogFileLine> lineBuffer = new ArrayList<LogFileLine>(); else ArrayList<String> lineBuffer = new ArrayList<String>(); if(Main.NEW_样式) ArrayList lineBuffer=新的ArrayList(); 其他的 ArrayList lineBuffer=新的ArrayList();,java,Java,如果没有,请问解决方案是什么? 谢谢我建议您创建一个界面,从String和LogFileLine捕获您所依赖的方法。将其称为LogLine或其他什么,由两个不同的类实现,StringLogLine和FileLogLine,然后执行以下操作 List<LogStyle> lineBuffer = new ArrayList<LogLine>(); List lineBuffer=new ArrayList(); 您可以使用原始类型(只是ArrayList),但我强烈建议不

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

我建议您创建一个界面,从
String
LogFileLine
捕获您所依赖的方法。将其称为
LogLine
或其他什么,由两个不同的类实现,
StringLogLine
FileLogLine
,然后执行以下操作

List<LogStyle> lineBuffer = new ArrayList<LogLine>();
List lineBuffer=new ArrayList();
您可以使用原始类型(只是
ArrayList
),但我强烈建议不要这样做,因为原始类型的存在只是为了向后兼容预泛型代码


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

Java没有编译器预处理器

我相信你是想在这句话的结尾有一个ArrayList。因此,以下是您应该如何做到这一点:

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

lineBuffer.add(something);
arraylistlinebuffer;
如果(…)
lineBuffer=newarraylist();
其他的
lineBuffer=newarraylist();
lineBuffer.add(某物);
然而,
add
可能会导致运行时问题,那么为什么不直接执行呢

ArrayList lineBuffer=new ArrayList()


它基本上可以保存任何东西?

你可以这样做,但对你没有多大帮助。因为那些
ArrayList
的范围是if语句的主体

您可以执行以下操作:

ArrayList<Object> lineBuffer;
if(Main.NEW_STYLE) lineBuffer = new ArrayList<LogFileLine>();
else lineBuffer = new ArrayList<String>();
然后,您将实现两个版本的
LogInterface
,一个持有
字符串(
LogInterface\u String
),另一个持有
LogFileLine
LogInterface\u LogFileLine

但是,由于您将布尔
命名为NEW_STYLE
,我想它会在某种程度上完全取代“旧样式”,因此我建议您按照我的第一个建议进行操作。如果(Main.NEW_样式),则必须执行此
if;否则访问
lineBuffer
的所有位置。但是,一旦你不再需要旧的东西,就可以更容易地把它踢出去。

这是使用原始类型(
ArrayList
),这几乎总是一个坏主意(除非你需要向后兼容)。
ArrayList<LogInterface> lineBuffer = new ArrayList<LogInterface>();
lineBuffer.add(new LogInterface_LogFileLine(aLogFileLine));
lineBuffer.add(new LogInterface_String("lalelu"));