我有C ++背景。在我的java项目中间的某个地方,我需要定义一个变量,其类型取决于一个布尔值(我之前已经定义过) 我可以这样做:
if(Main.NEW_STYLE)
ArrayList<LogFileLine> lineBuffer = new ArrayList<LogFileLine>();
else
ArrayList<String> lineBuffer = new ArrayList<String>();
如果没有,请问有什么解决方案? 谢谢
答案 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
的两个版本,一个版本持有String
(LogInterface_String
),另一个版本持有LogFileLine
(LogInterface_LogFileLine
)
但是,既然你命名了你的布尔NEW_STYLE
,我想它会完全取代“旧式”,所以我建议你做第一个建议。然后,您必须在访问if (Main.NEW_STYLE) ; else ;
的任何位置lineBuffer
执行此操作。但是,一旦你不再需要它就会更容易把旧东西踢出去。
答案 2 :(得分:0)
我建议您创建一个界面,捕捉您依赖String
和LogFileLine
所依赖的方法。称之为LogLine
或其他内容,由两个不同的类StringLogLine
和FileLogLine
实现,然后执行
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>()
基本上可以保留什么?