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

猜你喜欢

转载自www.cnblogs.com/wenthing/p/10675586.html
今日推荐