OSDN Git Service

OSDN.JP 対応
[jovsonz/Jovsonz.git] / src / main / java / jp / sourceforge / jovsonz / JsPair.java
1 /*
2  * JSON pair in object
3  *
4  * License : The MIT License
5  * Copyright(c) 2009 olyutorskii
6  */
7
8 package jp.sourceforge.jovsonz;
9
10 import java.io.IOException;
11
12 /**
13  * OBJECT型Value内に列挙される、名前の付いたValueとの組(PAIR)。
14  * PAIRはValueではない。
15  *
16  * <pre>
17  * {
18  *     "PairName1" : 99.9 ,
19  *     "PairName2" : "textValue"
20  * }
21  * </pre>
22  *
23  */
24 public class JsPair {
25
26     private final String name;
27     private final JsValue value;
28
29     /**
30      * コンストラクタ。
31      * @param name PAIR名
32      * @param value PAIR名に対応付けられるValue
33      * @throws NullPointerException 引数のいずれかがnull
34      */
35     public JsPair(String name, JsValue value)
36             throws NullPointerException{
37         super();
38
39         if(name  == null || value == null) throw new NullPointerException();
40
41         this.name = name;
42         this.value = value;
43
44         return;
45     }
46
47     /**
48      * コンストラクタ。
49      * STRING型をValueに持つPAIRが生成される。
50      * @param name PAIR名
51      * @param text PAIR名に対応付けられる文字列データ。
52      * エスケープされる前段階の表記。
53      * @throws NullPointerException 引数がnull
54      */
55     public JsPair(String name, CharSequence text)
56             throws NullPointerException{
57         this(name, (JsValue) new JsString(text) );
58         return;
59     }
60
61     /**
62      * コンストラクタ。
63      * BOOLEAN型をValueに持つPAIRが生成される。
64      * @param name PAIR名
65      * @param bool PAIR名に対応付けられる真偽値
66      * @throws NullPointerException PAIR名がnull
67      */
68     public JsPair(String name, boolean bool)
69             throws NullPointerException{
70         this(name, JsBoolean.valueOf(bool));
71         return;
72     }
73
74     /**
75      * コンストラクタ。
76      * NUMBER型をValueに持つPAIRが生成される。
77      * @param name PAIR名
78      * @param number PAIR名に対応付けられる整数値
79      * @throws NullPointerException PAIR名がnull
80      */
81     public JsPair(String name, long number)
82             throws NullPointerException{
83         this(name, new JsNumber(number));
84         return;
85     }
86
87     /**
88      * コンストラクタ。
89      * NUMBER型をValueに持つPAIRが生成される。
90      * @param name PAIR名
91      * @param number PAIR名に対応付けられる実数値
92      * @throws NullPointerException PAIR名がnull
93      */
94     public JsPair(String name, double number)
95             throws NullPointerException{
96         this(name, new JsNumber(number));
97         return;
98     }
99
100     /**
101      * PAIR名を返す。
102      * @return PAIR名
103      */
104     public String getName(){
105         return this.name;
106     }
107
108     /**
109      * Valueを返す。
110      * @return Value
111      */
112     public JsValue getValue(){
113         return this.value;
114     }
115
116     /**
117      * {@inheritDoc}
118      * ハッシュ値を返す。
119      * PAIR名とValue双方のハッシュ値から合成される。
120      * @return {@inheritDoc}
121      */
122     @Override
123     public int hashCode(){
124         int nameHash = this.name.hashCode();
125         int valHash = this.value.hashCode();
126         return nameHash ^ valHash;
127     }
128
129     /**
130      * {@inheritDoc}
131      * 等価判定を行う。
132      * PAIR名とValue双方が一致する場合のみ真となる。
133      * @param obj {@inheritDoc}
134      * @return {@inheritDoc}
135      */
136     @Override
137     public boolean equals(Object obj){
138         if(this == obj) return true;
139
140         if( ! (obj instanceof JsPair) ) return false;
141         JsPair target = (JsPair) obj;
142
143         if( ! this.name .equals(target.name)  ) return false;
144         if( ! this.value.equals(target.value) ) return false;
145
146         return true;
147     }
148
149     /**
150      * 文字列表現を返す。
151      * JSON表記の一部としての利用も可能。
152      * @return {@inheritDoc}
153      */
154     @Override
155     public String toString(){
156         StringBuilder result = new StringBuilder();
157         try{
158             JsString.dumpString(result, this.name);
159         }catch(IOException e){
160             assert false;
161             throw new AssertionError(e);
162         }
163
164         result.append(':')
165             .append(this.value.toString());
166
167         return result.toString();
168     }
169
170 }