十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
hotspot 虚拟机(咱们平时开发用的sun公司的虚拟机,其他两大商用虚拟机是BEA的JRockit和IBM的J9)里面两个字节来限制大小,所以最多65536行,超过javac会无法编译。而且一个Java方法不能超过64k。一般一个Java类不要有太多行数,如果一个Java代码超过几千甚至过万,个人觉得应该考虑一些代码优化方式,比如继承;或者重新构思这个类。代码行数太多可读性查,不利于维护。
成都创新互联公司的客户来自各行各业,为了共同目标,我们在工作上密切配合,从创业型小企业到企事业单位,感谢他们对我们的要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。专业领域包括成都做网站、成都网站制作、电商网站开发、微信营销、系统平台开发。
说实话,理论上来说 一个类可以有无数个方法,方法多到一定地步的话(怎么也得起码近千吧)会影响电脑运行;建议一个方法的最佳状态应该在20~30行之间,当你的方法太长时,你就应该想想是不是要另外提取方法,或者有没有别的思路····
毫无影响,java编译时就会确定方法的偏移量。java会自动装载,所以方法数量不是问题。
不过过多的方法和行数会对解读造成影响,造成可读性差。另外一些计算测试代码覆盖率的程序无法处理过多行的代码。
外界处于可读性的考虑,要求处理类的代码不可以超过2000行,一个方法不可以超过500行。
java中的一个方法体内的代码多长是被限制的!
具体是怎么被限制的呢?
一般咱们都知道.java文件最后会经过javac编译成.class文件,方法体会编译成java虚拟机识别的指令。在java中规定了指令的最大条数,用4字节去存储这个数字,可以想象一下这是一个很大的数(2的32次方减1),但是这是一个理论值,在java中明确规定一个方法的指令最多是65535条。具体你写的代码几行编译成一条指令,或是一行代码编译成几条指令,这个就得看自己的代码是怎么构造的了。
例如在一个特别复杂的jsp页面中,所有页面内容等都编译到一个方法中,会出现编译器拒绝的现象,这很有可能是编译之后指令的条数太多了。
建议34: 构造函数尽量简化
我们知道在通过new关键字生成对象时必然会调用构造函数,构造函数的简繁情况会直接影响实例对象的创建是否繁琐。在项目开发中,我们一般都会制订构造函数尽量简单,尽可能不抛异常,尽量不做复杂算法等规范,那如果一个构造函数确实复杂了会怎么样?我们来看一段代码:
1 public class Client {
2 public static void main(String[] args) {
3 Server s = new SimpleServer(1000);
4 }
5 }
6
7 // 定义一个服务
8 abstract class Server {
9 public final static int DEFAULT_PORT = 40000;
10
11 public Server() {
12 // 获得子类提供的端口号
13 int port = getPort();
14 System.out.println("端口号:" + port);
15 /* 进行监听动作 */
16 }
17
18 // 由子类提供端口号,并做可用性检查
19 protected abstract int getPort();
20 }
21
22 class SimpleServer extends Server {
23 private int port = 100;
24
25 // 初始化传递一个端口号
26 public SimpleServer(int _port) {
27 port = _port;
28 }
29
30 // 检查端口号是否有效,无效则使用默认端口,这里使用随机数模拟
31 @Override
32 protected int getPort() {
33 return Math.random() 0.5 ? port : DEFAULT_PORT;
34 }
35 }
该代码是一个服务类的简单模拟程序,Server类实现了服务器的创建逻辑,子类只要在生成实例对象时传递一个端口号即可创建一个监听该端口的服务,该代码的意图如下:
通过SimpleServer的构造函数接收端口参数。
子类的构造函数默认调用父类的构造函数。
父类构造函数调用子类的getPort方法获得端口号。
父类构造函数建立端口监听机制。
对象创建完毕,服务监听启动,正常运行。
貌似很合理,再仔细看看代码,确实也和我们的意图相吻合,那我们尝试多次运行看看,输出结果要么是“端口号:40000”,要么是“端口号:0”,永远不会出现“端口号:100”或是“端口号:1000”,这就奇怪了,40000还好说,但那个0是怎么冒出来的呢?代码在什么地方出现问题了?
要解释这个问题,我们首先要说说子类是如何实例化的。子类实例化时,会首先初始化父类(注意这里是初始化,可不是生成父类对象),也就是初始化父类的变量,调用父类的构造函数,然后才会初始化子类的变量,调用子类自己的构造函数,最后生成一个实例对象。了解了相关知识,我们再来看上面的程序,其执行过程如下:
子类SimpleServer的构造函数接收int类型的参数:1000。
父类初始化常变量,也就是DEFAULT_PORT初始化,并设置为40000。
执行父类无参构造函数,也就是子类的有参构造中默认包含了super()方法。
父类无参构造函数执行到“int port = getPort()”方法,调用子类的getPort方法实现。
子类的getPort方法返回port值(注意,此时port变量还没有赋值,是0)或DEFAULT_PORT(此时已经是40000)了。
父类初始化完毕,开始初始化子类的实例变量,port赋值100。
执行子类构造函数,port被重新赋值为1000。
子类SimpleServer实例化结束,对象创建完毕。
终于清楚了,在类初始化时getPort方法返回的port值还没有赋值,port只是获得了默认初始值(int类的实例变量默认初始值是0),因此Server永远监听的是40000端口了(0端口是没有意义的)。这个问题的产生从浅处说是由类元素初始化顺序导致的,从深处说是因为构造函数太复杂而引起的。构造函数用作初始化变量,声明实例的上下文,这都是简单的实现,没有任何问题,但我们的例子却实现了一个复杂的逻辑,而这放在构造函数里就不合适了。
问题知道了,修改也很简单,把父类的无参构造函数中的所有实现都移动到一个叫做start的方法中,将SimpleServer类初始化完毕,再调用其start方法即可实现服务器的启动工作,简洁而又直观,这也是大部分JEE服务器的实现方式。
注意 构造函数简化,再简化,应该达到“一眼洞穿”的境界。
你把重复的代码提取出来封装成一个方法不就是了,无非就是
private void SendData(int screenid,int controlid,String info)
{
UpdateTextData data=new UpdateTextData();
data.setScreen_id(screenid);
data.setControl_id(controlid);
data.SetStrings(info);
ListByte.......
RS232.write.......
}
之后在你的popupAlertWindow里就可以写
SendData(7,5,String.valueOf(code));
SendData(7,5,type);
SendData(7,5,info);