1.C#項目Java化注意事項

 

1.工具:C#to Java Converter

(1)不能轉框架相關代碼,比如C#使用SqlSugar框架所帶的DAL層Lambda

(2)不會轉換命名方式,比如C#代碼基本首字母大寫的駝峯命名,Java基本是首字母小寫的駝峯命名

(3)單文件翻譯,不會主動生成註解,不會主動生成Java框架;總之,只是翻譯代碼,所得結果可以複製粘貼減少部分工作量,具體得架構設計及框架引入得工作少不了。

 

2.比較符

C#比較操作可參考https://www.cnblogs.com/Aaxuan/p/9520883.html

Java有三種方式:==比較引用,equals比較值,compareTo比較對象

一般我們的代碼比較的都是值的大小,不論值類型和引用類型C#基本使用==來比較。Java需改正過來,引用類型需使用equals,對象的比較要使用compareTo(比如Date對象比較)。

 

3.實體

C#不需要單獨定義get和set,C#的屬性定義本身就實現setter和getter。

Java需要在定義變量之後,定義get和set方法。

mybatis框架不允許變量帶_,如果表的字段設計上有_需使用註解來映射。舉個例子:

 1 /**
 2  * @Desc 實體類
 3  * @Author generator
 4  * @Date <2019年02月15日>
 5  * @version 1.0
 6  */
 7 @TableName("agent_goods")
 8 public class TaAgentGoods extends BaseEntity{
 9     private static final long serialVersionUID = 1L;
10     
11     /** 主鍵 */
12     @TableId(type=IdType.AUTO)
13     private Integer id;
14     /** 運單號 */
15     @TableField("OrderNo")
16     private String orderNo;
17     /** 代理單號 */
18     @TableField("AgentOrderNo")
19     private String agentOrderNo;
20     /** 派送人 */
21     @TableField("Col_008")
22     private String col008;
23     /** 派送人ID */
24     @TableField("Col_009")
25     private String col009;
26     /** 取派類型 */
27     @TableField("ActionType")
28     private Integer actionType;
29     
30     public void setId(Integer id) {
31         this.id = id;
32     }    
33     public Integer getId() {
34         return this.id;
35     }
36     public void setOrderNo(String orderNo) {
37         this.orderNo = orderNo;
38     }    
39     public String getOrderNo() {
40         return this.orderNo;
41     }
42     public void setAgentOrderNo(String agentOrderNo) {
43         this.agentOrderNo = agentOrderNo;
44     }    
45     public String getAgentOrderNo() {
46         return this.agentOrderNo;
47     }
48     public void setCol008(String col008) {
49         this.col008 = col008;
50     }    
51     public String getCol008() {
52         return this.col008;
53     }
54     public void setCol009(String col009) {
55         this.col009 = col009;
56     }    
57     public String getCol009() {
58         return this.col009;
59     }
60     public void setActionType(Integer actionType) {
61         this.actionType = actionType;
62     }    
63     public Integer getActionType() {
64         return this.actionType;
65     }
66     
67     @Override
68     public String toString() {
69         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
70             .append("id",getId())
71             .append("orderNo",getOrderNo())
72             .append("agentOrderNo",getAgentOrderNo())
73             .append("col008",getCol008())
74             .append("col009",getCol009())
75             .append("actionType",getActionType())
76             .toString();
77     }
78 }
View Code

 

4.API入參

因爲接口入參已經定義好了,並且之前的項目入參定義五花八門,導致Java代碼需要額外的代碼處理入參。

C#MVC項目,API入參默認不區分大小寫,只要字符對應,不論大小寫都可以對應。

Java默認嚴格遵守大小寫規則,入參名和定義的方法參數無法一一對應,將無法接收到參數值。

不過都可以使用第三方來調整,C#可以使用Newtonsoft.json特性來規定入參規則,Java也可以使用fastJson的註解@JsonProperty來轉換。

注意fastjson的Json.parseObject要按照正規的get/set定義纔可以轉換,get/set方法命名大小寫需要嚴格。

  1 package com.kye.ats.asm.model.Request;
  2 
  3 import com.fasterxml.jackson.annotation.JsonProperty;
  4 import com.kye.ats.asm.model.BaseRequest;
  5 
  6 public class VoiceMsgReportNewRequest extends BaseRequest
  7 {
  8     /** 
  9      用戶的請求ID Sn 唯一ID
 10      
 11     */
 12     @JsonProperty("voiceId")
 13     private String voiceId;
 14     public final String getVoiceId()
 15     {
 16         return voiceId;
 17     }
 18     public final void setVoiceId(String value)
 19     {
 20         voiceId = value;
 21     }
 22     /** 
 23      被叫號碼
 24      
 25     */
 26     @JsonProperty("caller")
 27     private String caller;
 28     public final String getCaller()
 29     {
 30         return caller;
 31     }
 32     public final void setCaller(String value)
 33     {
 34         caller = value;
 35     }
 36     /** 
 37      強顯號碼
 38      
 39     */
 40     @JsonProperty("callee")
 41     private String callee;
 42     public final String getCallee()
 43     {
 44         return callee;
 45     }
 46     public final void setCallee(String value)
 47     {
 48         callee = value;
 49     }
 50     /** 
 51      語音通知業務時用戶反饋的按鍵值
 52      
 53     */
 54     @JsonProperty("dtmf")
 55     private String dtmf;
 56     public final String getDtmf()
 57     {
 58         return dtmf;
 59     }
 60     public final void setDtmf(String value)
 61     {
 62         dtmf = value;
 63     }
 64     /** 
 65      通話時長(秒)
 66      
 67     */
 68     @JsonProperty("holdTime")
 69     private int holdTime;
 70     public final int getHoldTime()
 71     {
 72         return holdTime;
 73     }
 74     public final void setHoldTime(int value)
 75     {
 76         holdTime = value;
 77     }
 78     /** 
 79      接聽狀態
 80      
 81     */
 82     @JsonProperty("answerStatus")
 83     private long answerStatus;
 84     public final long getAnswerStatus()
 85     {
 86         return answerStatus;
 87     }
 88     public final void setAnswerStatus(long value)
 89     {
 90         answerStatus = value;
 91     }
 92     /** 
 93      通話開始時間
 94      
 95     */
 96     @JsonProperty("startTime")
 97     private java.util.Date startTime = new java.util.Date(0);
 98     public final java.util.Date getStartTime()
 99     {
100         return startTime;
101     }
102     public final void setStartTime(java.util.Date value)
103     {
104         startTime = value;
105     }
106     /** 
107      通話結束時間
108      
109     */
110     @JsonProperty("endTime")
111     private java.util.Date endTime = new java.util.Date(0);
112     public final java.util.Date getEndTime()
113     {
114         return endTime;
115     }
116     public final void setEndTime(java.util.Date value)
117     {
118         endTime = value;
119     }
120     /** 
121      歸屬地
122      
123     */
124     @JsonProperty("location")
125     private String location;
126     public final String getLocation()
127     {
128         return location;
129     }
130     public final void setLocation(String value)
131     {
132         location = value;
133     }
134     /** 
135      呼叫失敗錯誤碼
136      
137     */
138     @JsonProperty("failCode")
139     private String failCode;
140     public final String getFailCode()
141     {
142         return failCode;
143     }
144     public final void setFailCode(String value)
145     {
146         failCode = value;
147     }
148     /** 
149      呼叫失敗原因
150      
151     */
152     @JsonProperty("failCause")
153     public String failCause;
154     public final String getFailCause()
155     {
156         return failCause;
157     }
158     public final void setFailCause(String value)
159     {
160         failCause = value;
161     }
162     /** 
163      呼叫時間
164      
165     */
166     @JsonProperty("callTime")
167     private java.util.Date callTime = new java.util.Date(0);
168     public final java.util.Date getCallTime()
169     {
170         return callTime;
171     }
172     public final void setCallTime(java.util.Date value)
173     {
174         callTime = value;
175     }
176     /** 
177      狀態返回時間
178      
179     */
180     @JsonProperty("responseTime")
181     private java.util.Date responseTime = new java.util.Date(0);
182     public final java.util.Date getResponseTime()
183     {
184         return responseTime;
185     }
186     public final void setResponseTime(java.util.Date value)
187     {
188         responseTime = value;
189     }
190 }
View Code

 

5.new對象與註解

 實體類在兩個語言中都是一樣的寫法,即使用new來實力化對象。

Java目前一般引入註解來實現調用其他包的方法,這樣有好處,你會發現同一個類調用其他類不能到處new對象了。

 

6.枚舉

 .Net枚舉是值類型,Java枚舉是類。Java需要實現.Net枚舉值操作需要定義更多的方法來實現。

Java代碼:

你會發現字段和枚舉之間根本沒什麼關係,如果不是文字描述,誰知道這個字段可以用枚舉來描述。

 1         /** 是否特殊客戶 0:否 1:是 */
 2     @TableField("Col_013")
 3     private Integer col013;
 4 
 5         public void setCol013(Integer col013) {
 6         this.col013 = col013;
 7     }
 8 
 9     public Integer getCol013() {
10         return this.col013;
11     }
12         
13 
14         /// <summary>
15     /// 是否特殊客戶
16     /// </summary>
17     public enum EnumSpecialCompany {
18         /// <summary>
19         /// 否
20         /// </summary>
21         No(0, "否"),
22         /// <summary>
23         /// 是
24         /// </summary>
25         Yes(1, "是");
26         public int code;
27         public String name;
28 
29         EnumSpecialCompany(int code, String name) {
30             this.code = code;
31             this.name = name;
32         }
33 
34         public static String getValueByCode(Integer code) {
35             for (EnumSpecialCompany platformFree : EnumSpecialCompany.values()) {
36                 if (code.equals(platformFree.getCode())) {
37                     return platformFree.getName();
38                 }
39             }
40             return null;
41         }
42 
43         public int getCode() {
44             return code;
45         }
46 
47         public void setCode(int code) {
48             this.code = code;
49         }
50 
51         public String getName() {
52             return name;
53         }
54 
55         public void setName(String name) {
56             this.name = name;
57         }
58     }
View Code

C#代碼:

一般的寫法,有明顯的關聯痕跡。

 1         /// <summary>
 2         /// 是否特殊客戶
 3         /// </summary>
 4         public enum EnumSpecialCompany
 5         {
 6             /// <summary>
 7             /// 8             /// </summary>
 9             [Description("")]
10             No = 0,
11             /// <summary>
12             ///13             /// </summary>
14             [Description("")]
15             Yes = 1,
16 
17         }   
18 
19         /// <summary>
20         ///是否特殊客戶 0:否  1:是
21         /// </summary>
22         public EnumSpecialCompany Col_013 { get; set; }     
View Code

 

7.DateTime

 .Net:2019/4/10 17:21:47

Java:Wed Apr 10 17:26:27 CST 2019

可以使用JSONField來格式化

1     @JSONField(name = "TrackDT",format = "yyyy-MM-dd HH:mm:ss")
2     private Date trackDT;
View Code

 

8.Redis

 C#:使用的是StackExchange.Redis

Java:使用的是org.springframework.data.redis.core

需要注意的是Java Redis set方法,入參是Object,所以一定要注意入參的類型,Interger和String保存的Redis是不一樣的。

 1 public boolean set(String key, Object value) {
 2         try {
 3             redisTemplate.opsForValue().set(key, value);
 4             return true;
 5         } catch (Exception e) {
 6             e.printStackTrace();
 7             return false;
 8         }
 9 
10     }
View Code

 

9.Json反序列化

.Net的Newtonsoft.json DeserializeObject可以將json字符串轉換爲實體,並且不論實體是否是多層嵌套實體。

Java中的fastjson Json.parseObject能轉換簡單的json字符串,但是如果json字符串含多層嵌套,無法轉換,要使用另一種方式來處理。

 1 private Recordset GetRecordset(Map<String, Object> dic, String url) {
 2         String res = OpenApi.request(url, dic);
 3         if (StringUtils.isNotBlank(res)) {
 4             ObjectMapper mapper = new ObjectMapper();
 5             mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
 6             Response<ResponseResult<RecordSetResponseModel>> responseModel = null;
 7             try {
 8                 responseModel = mapper.readValue(res, new com.fasterxml.jackson.core.type.TypeReference<Response<ResponseResult<RecordSetResponseModel>>>() {
 9                 });
10             } catch (IOException e) {
11                 e.printStackTrace();
12             }
13             if (responseModel == null || responseModel.isFail() || responseModel.getData() == null || responseModel.getData().getRows() == null)
14                 return null;
15 
16             List<RecordSetResponseModel> models = responseModel.getData().getRows();
17 
18             Collections.sort(models, new Comparator<RecordSetResponseModel>() {
19                 @Override
20                 public int compare(RecordSetResponseModel o1, RecordSetResponseModel o2) {
21                     return o2.getCol_006() > o1.getCol_006() ? 1 : -1;
22                 }
23             });
24             
25             if(models!=null && models.size()>0)
26             {
27                 return RecordSetConverter.ToEntity(models.get(0));
28             }            
29         }
30         return null;
31     }
View Code

 

10.Lamda

C#:

var taskDriver = tasks.Where(t => t.Col_032 == Const.BringDevice_NO).Where(t => t.Col_028 > dtstart).Where(t => t.Col_040 == dtstart).Where(t => t.Sort > 0).FirstOrDefault();

Java:

1 TaTask taskDriver = tasks.stream().filter(
2                 t -> Const.BringDevice_NO.equals(t.getCol032()) && t.getCol028().after(dtstart) && dtstart.equals(t.getCol040()) && t.getSort() > 0)
3                 .findFirst().orElse(null);
View Code

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章