2014-01-29 67 views
1

我不想問這麼瑣碎的事情,但是我無法完成這一項。 我試圖創建一個基本對象爲了方便,這樣的:Java中的類似於JSON的對象語法

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 */ 
} 
+0

你可以只使用三個'double'值的數組嗎? –

+0

您需要定義一個Triangle類。而且,一般來說,除非你有充分的理由這樣做,否則它不應該被嵌套。 –

+0

我可以爲邊和角度製作單獨的陣列,但我喜歡x.side.a的組織結構; x.angle.b代替side [0];角[1];我想這是要走的路。那麼,正確的做法是在一個單獨的文件中定義一個新的類來使用該對象一次?也許地圖就是要走的路。 – Gary

回答

1

嘗試2更接近。您需要嵌套靜態類:

public static class triangle{ int test; } 

(或triangle可以在一個單獨的文件)。

與Java在其靜態類型系統上的運行方式相距甚遠。

2

理想情況下,我想只是動態創建一個通用對象。

那麼你不應該使用靜態類型的語言。

的唯一途徑在Java中做到這一點是

  • 使用反射(不是你想要的),或
  • 使用JSON庫,
  • 完全放棄打字和使用Map<String, Integer>.

就你而言,聽起來像你只需要一個實際的Triangle類。 Java需要大量的輸入,更好的去適應它,而不是編寫錯誤的代碼來避免它。

0

事實上,您應該使用像Groovy這樣的基於JVM的腳本語言來實現這種動態的開箱即用功能。您將創建一個MetaClass的實例,並即時添加所有字段。 良好的Java'的另一個選擇是創建一個簡單的(marker?)接口,並將其作爲一個anonymous inner class在您需要的地方實現。

1
public class Triangle { 
    double sideA; 
    double sideB; 
    double sideC; 
    double[] angles = new double[3]; 
    double calcAngle() { 
     something; 
     return somethingElse; 
    } 
}