1

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

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

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

4

4 回答 4

1

可以使用原始类型(仅ArrayList),但我强烈反对这种做法,因为原始类型的存在只是为了与前通用代码向后兼容。

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

于 2012-07-25T08:43:16.307 回答
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)。

但是,既然你命名了你的 boolean NEW_STYLE,我想它会在某个时候完全取代“旧风格”,所以我建议你做我的第一个建议。然后,您必须if (Main.NEW_STYLE) ; else ;在访问lineBuffer. 但是一旦你不再需要它,将旧东西踢出去会容易得多。

于 2012-07-25T08:49:04.533 回答
0

Java 没有编译器预处理器。

我相信您正试图在此语句的末尾添加一个 ArrayList。所以你应该这样做:

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

lineBuffer.add(something);

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

ArrayList lineBuffer = new ArrayList<Object>()

这基本上可以保留任何东西?

于 2012-07-25T08:43:28.367 回答
0

我建议您创建一个接口来捕获您依赖的方法 fromString和 from LogFileLine。调用它LogLine什么的,由两个不同的类实现,StringLogLineand FileLogLine,然后做

List<LogStyle> lineBuffer = new ArrayList<LogLine>();
于 2012-07-25T08:42:36.227 回答