【问题标题】:Primitive variable type in compile time编译时的原始变量类型
【发布时间】:2013-03-06 18:20:21
【问题描述】:

不确定我的措辞是否正确。如果您需要更多信息,请告诉我。 我们有一个需求,需要根据系统环境变量来确定变量的类型。

所以,假设我们有以下类

class Test
{
    DUMMY_TYPE testVariable;
}

DUMMY_TYPE 是根据系统变量确定的。那么当Java编译时,是否可以让Java在编译类型时使用系统环境变量来确定类型呢?

另外,是否可以在 Eclipse 上以某种方式进行设置,无论我在哪里使用,Eclipse 都会继续在 IDE 上向我显示 DUMMY_TYPE,但是在编译和构建它时,可以根据环境变量将 DUMMY_TYPE 替换为正确的类型?

【问题讨论】:

  • 很酷的问题。出于好奇,您介意我问一下这是什么用例吗?
  • 简而言之,答案是否定的,但在不知道您要做什么的情况下,很难知道是否有合理的替代方案。
  • 这是内部使用的 API 的一部分,通过套接字与专有系统交互。内部系统可以为同一变量流式传输整数或双精度数。它使用环境变量来确定。因此,如果我们能够确定这一点,而不是在编译时维护单独的代码库,将会省去很多麻烦:)。我们能够在 C++ 和 C# 中实现这一点,但 Java 一直给我们带来一些痛苦。
  • 你需要的是一个预处理器! [/我鸭子]
  • 我还没有使用注释处理的源代码生成部分,但我想您可以使用注释处理器来执行此操作。注释处理器工具 (APT) 在编译之前运行,但在源解析之后运行,它允许您操作源代码。有谁可以通过一些具体的例子来扩展这个想法?我在想像@ResolveType("env_var_name") Object obj; 这样的注释会变成EnvVarValue obj;

标签: java eclipse compilation primitive-types


【解决方案1】:

我有个主意。

创建Object 类型的testVariable(或扩展ObjectDummyType 类)。然后,您可以根据从系统变量中读取的内容,使用原始包装类使用您想要的任何数据加载变量。

所以:

public class Test {

    Object testVariable;

    {
        String whichType = null;

        //Logic to read your system variable from wherever and store it in whichType

        if(whichType.equals("int")) {
            testVariable = new Integer(intVal);
        }
        else if(whichType.equals("double")) {
            testVariable = new Double(doubleVal);
        }
        //etc.
    }

当然,这并不是 Java 在编译时像你想要的那样“确定”它是哪种类型,这是必然的(并且分配将在运行时发生,当创建 Test 对象时),但它似乎是替代方案的合理框架。

你也可以在初始化时适当地设置testVariable的值,自然而然。

或者,您可以有一个像这样的方法,它接受输入作为 String(从您的系统变量中读取)并在原始类型的适当包装类中返回它:

public Object getPrimitiveValue(String type, String value) {
    if(type.equals("int")) {
        return new Integer(Integer.parseInt(value));
    }
    else if(type.equals("double")) {
        return new Double(Double.parseDouble(value));
    }
    //etc.
}

【讨论】:

  • 这似乎是所问内容的合理近似值。此外,由于类型是IntegerDouble,超类可以是Number,而不是Object
  • 杰夫,我们确实考虑过这个问题。但是,我们在 API 中使用的库使用变量的原始版本。因此,我们无法为应用程序执行此操作。 Butt 我同意 Nathaniel 的观点,这绝对是一个可行的解决方案,没有我们的其他限制。谢谢。
  • @user1524088 由于自动拆箱或显式调用IntegerintValue() 方法(以及所有包装器的类似方法),它们接受原始版本的事实不应该成为问题类)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多