【问题标题】:JSON-like Object Syntax In JavaJava中的类JSON对象语法
【发布时间】:2014-02-21 19:50:23
【问题描述】:

我讨厌问这么琐碎的事情,但我无法解决这个问题。 为了方便起见,我正在尝试创建一个基本对象,如下所示:

triangle = {
  side: { A: 0, B: 0, C: 0 },
  angle: { a, b, c },

  function calcAngle(){}
}

理想情况下,我只想动态创建一个通用对象。我只创建一个“三角形”,我必须为一个实例创建一个完整的类吗?我确信这在某个地方得到了回答,但我似乎无法正确地用任何有用的方式来表达这个问题。为了您的娱乐,我将发布我的一些失败:

public class TGUI{

// Attempt One
   public Object triangle = new Object(){ int test; };
   public static void main(String[] args) {
     triangle.test = 1;
     // ^- Cannot make a static reference to the non-static field triangle

     triangle tri = new triangle();
     // ^- Made the compiler cry; triangle cannot be resolved to as type
   }

// Attempt Two
   public class triangle{ int test; }
   public static void main(String[] args) {
       triangle tri = new triangle();
       /* ^- No enclosing instance of TGUI is accessible.  Must qualify the allocation with an enclosing instance of type TGUI (eg x.new A() where x is an instance of TGUI) */
   }

// Attempt Three
   public void triangle(){ int test = 1; }
   public static void main(String[] args) {
     triangle tri = new triantle();
     // ^- triangle cannot be resolved to a type
   }

// Attempt Four
   public TGUI(){ int test; }
   /* I'm gonna quit here, you get the idea */
}

【问题讨论】:

  • 你可以使用一个包含三个double 值的数组吗?
  • 你需要定义一个三角形类。而且,一般来说,它应该嵌套,除非你有充分的理由这样做。
  • 我可以为边和角度制作单独的数组,但我喜欢 x.side.a 的组织; x.angle.b 而不是 side[0];角度[1];我想这就是要走的路。那么,正确的做法是在一个完整的单独文件中定义一个新类,只是为了使用该对象一次?也许地图就是要走的路。
  • 您始终可以选择将其保留为 JSON 格式。您失去了能够在其上调用方法的“经典性”,但数据值仍然可以以相当有意义的方式访问。

标签: java class object constructor instance


【解决方案1】:

理想情况下,我只想动态创建一个通用对象。

那么你不应该使用静态类型语言。

在 Java 中做到这一点的唯一方法是

  • 使用反射(不是你想要的),或者
  • 使用 JSON 库,
  • 完全放弃打字并使用Map<String, Integer>.

在您的情况下,听起来您只需要一个实际的 Triangle 类。 Java 需要大量的输入,最好习惯它而不是编写糟糕的代码来避免它。

【讨论】:

    【解决方案2】:

    尝试 2 更接近。你需要一个嵌套的 static 类:

    public static class triangle{ int test; }
    

    (或triangle 可以在单独的文件中)。

    它与 Java 在其静态类型系统上的运行方式还有很长的路要走。

    【讨论】:

      【解决方案3】:
      public class Triangle {
          double sideA;
          double sideB;
          double sideC;
          double[] angles = new double[3];
          double calcAngle() {
              something;
              return somethingElse;
          }
      }
      

      【讨论】:

        【解决方案4】:

        确实,您应该使用像 Groovy 这样的基于 JVM 的脚本语言来实现这种开箱即用的动态事物。您将创建一个MetaClass 的实例并即时添加所有字段。 好的 ol' Java 的另一个选择是创建一个简单的(标记?)接口并将其实现为 anonymous inner class,就在您需要的地方。

        【讨论】:

          猜你喜欢
          • 2018-08-28
          • 2015-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多