这里不谈什么框架、模式、架构等,仅从一个初级程序员说说个人在使用过程中发现的Java许多不爽的地方。当然作为初级Java爱好者,不敢说得太过火,可能我学艺不精,也可能是我没理解Java不设计得我认为更好的真正原因。
1、Java方法只能返回一个基本类型的值,如果想返回一个数组的最大值及最大值的位置,Java实现起来至少需两句话以上;
2、Java方法不能为参数设置默认值,每个方法如果要定义不同的参数组合得写一堆类似的方法,维护起来相当费劲;
3、父类中的的构造方法一定要在子类中重复写一遍后才能在子类中使用,我写了一个类,构造方法有十来个,当我扩展该类时,子类也要写十来个相同的构造方法才能在子类中使用;
4、Java Gui中模态对话框在显示三层时,程序基本是死的,这个我确实不知道为什么,也没有仔细研究过源代码中的线程阻塞细节。
5、Java中自带对话框显示位置设置有时很不合理。
6、JDBC中使用PreparedStatemet实现查询时,在数据量较大,查询系数较多时Web服务器会因为资源没有释放而崩溃。这个在SQLServer200及Oracle中屡试不爽,只好得出结论,PreparedStatemet不适用于查询。当然,这个不能怪Java。
先说这么多,其实使用过程中还发现很多类似不爽的问题,一时实在很难记起。
不管说好说坏,凡参与讨论者,有分,呵呵。

解决方案 »

  1.   

    4问题没有发现过
    6问题可能是你没有close旧的记录集
      

  2.   

    java的这种设计不见得就是瑕疵,任何东西都有两面性 ...
      

  3.   

    明显是学C的啊...
    C用指针用的舒服吧,JAVA看着就不爽吧6.这个是你自己的问题吧,你自己也说了没有释放资源
    或者你的查询SQL语句写的就有问题
    比如说你一次查询出10W条数据再牛B的系统也档不住
    好好优化一下查询语句
      

  4.   

    刚转型吧,正常,慢慢适应吧,不是都一样的.
    1.我没觉得这有什么区别,看你习惯不习惯
    2.我同意你,很方便
    3.Java会自动调用父类的默认构造方法,也可以指明,如果你不写明要调用父类的哪个,编译器怎么知道是这个,而不是那个
    4.不明白你说的3层是什么意思
    5.不知你发现的是哪里,我觉得还好
      

  5.   

    我对微软的所有语言猫屁不通(vbscript除外),也从没打算学C
    1、其实类似的需求很多,Java实现时只能构造数组,或构造一个没什么屁用的数据结构
    3、仅仅默认构造方法肯定不能满足需求
    4、当程序显示一层模态对话框,然后在该模态对话框上再显示一层模态对话框,接着在第二层对话框上显示第三层模态对话框,第三层模态对话框没有响应。非模态的不存在这类问题。
    5、关于Java对话框显示我查了一下源代码,觉得他的思路有问题,它是按组件大小取中间位置,所以当在由几千行或几千列的表格上显示对话框时,对话框会显示在屏幕的最右下方,别拗得很。
      

  6.   

    6、我查过很多类似的问题,大家好像有类似的结论,PreparedStatemet不适合批量的海量数据查询,具体原因一直没弄明白。这与SQL语句的优化无关,我想与JDBC也无关,因为在SQLServer与Oracle中都有类似的问题。
      

  7.   

    1. 这个确实没办法,像你说的构造数组或者写个小的包装类吧。习惯了就好
    2. 这个比C++ 是要麻烦一些,不过一般也用不着写重复的代码,在java里一般这样做:
    class A {
    public int fun(int param1, int param2, int param3) {
    ..........
    .........
    ...........

    return xxx; 
    } public int fun(int param1, int param2) {
    fun(param1, param2, 0);
    }

    public int fun(int param1) {
    fun(param1, 0, 0);
    }
    }
    后面两个方法里的0就相当于实现了缺省参数。3. 这个是比较麻烦,所以我建议你用eclipse或者其它IDE里提供的工具来自动生成这些构造方法。在Eclipse里面把光标放在你的子类里面,然后选择菜单上的 Source -> Generate Constructors From Super Classes... 选择你要继承的父类构造方法,然后Eclipse就帮你自动生成了,很方便。4. 这个可能是你构造Dialog的时候父窗口指定错了,记住第三层的模态对话框的父窗口要指定为第2层的对话框,不能是第1层的窗口。看看下面这个例子,只要你把父窗口写对了,要多少层都没问题,最上面一个对话框肯定不会没响应的。import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;public class T {
    public static void main(String[] args) {
    final JFrame f = new JFrame();
    JButton btn = new JButton("Show Dialog");
    btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    new TestDialog(f).setVisible(true);
    }
    });
    f.getContentPane().add(btn, BorderLayout.CENTER);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    }
    }class TestDialog extends JDialog {
    public TestDialog(JDialog d) {
    super(d, "Test", true);

    initDialog();
    } public TestDialog(JFrame f) {
    super(f, "Test", true);

    initDialog();
    } private void initDialog() {
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    JButton btn = new JButton("Show Dialog");
    btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    new TestDialog(TestDialog.this).setVisible(true);
    }
    });
    getContentPane().add(btn, BorderLayout.CENTER);
    pack();
    setLocation(getOwner().getX() + 10, getOwner().getY() + 10);
    }
    }5. 这个你说的对,所以你调用JOptionPane.showMessageDialog()的时候不能用table做为父组件,要用table所在的滚动框或者窗口、对话框做为父组件, 例子:import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.*;public class T {
    public static void main(String[] args) {
    final JTable table = new JTable(1000, 100);
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    final JScrollPane scrollPane = new JScrollPane(table);
    final JFrame f = new JFrame();

    JButton btn = new JButton("错误的方法");
    btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    JOptionPane.showMessageDialog(table, "Hello!", "Test", 
    JOptionPane.INFORMATION_MESSAGE);
    }
    });

    JButton btn1 = new JButton("正确的方法1");
    btn1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    JOptionPane.showMessageDialog(f, "Hello!", "Test", 
    JOptionPane.INFORMATION_MESSAGE);
    }
    }); JButton btn2 = new JButton("正确的方法2");
    btn2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    JOptionPane.showMessageDialog(scrollPane, "Hello!", "Test", 
    JOptionPane.INFORMATION_MESSAGE);
    }
    });

    JPanel p = new JPanel();
    p.add(btn);
    p.add(btn1);
    p.add(btn2);

    f.getContentPane().add(scrollPane, BorderLayout.CENTER);
    f.getContentPane().add(p, BorderLayout.SOUTH);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    }
    }如果你无法直接得到frame的引用,可以这样
    JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(table), "Hello!", "Test", JOptionPane.INFORMATION_MESSAGE);6. 这个不熟,不发表意见。
      

  8.   

    补充gtlang78() 
    lz的前3个问题总的说来就是想节省代码
    做oop的程序,无为的节省代码是大忌1:java不是只可以返回基本类型,可以是一个Object。而且C++里面也是一样的,只不过它可以通过引用或者指针作为参数将需要的数据得出。对于java来说,这样实现也可以做到,比如你将ArrayList作为参数传入,在方法里面将数值放到ArrayList这样的Object里,也可以得到。oo的概念让java对于基本类型控制的很严格,必须通过对象形式来传递引用从而得到需要的结果。2:对于默认值来说也有同感。c++中的fun(int a,int b,int c=1;int d=2)非常方便,不过对于阅读代码的人来说就不方便了。C++中的...作为参数尤其如此。这就是为什么一说c++是面向对象的语言,java就笑了。当你习惯了java的许多强制要求后会觉得其实这样很好,非常清晰3:java是单一继承,尚且要求的如此严格,C++中的多继承,你在用时就没觉得比较混乱吗?我是从java转到C++的,说实话,对于这些c++中很多要求不严的东西都不太放心。4:你说得问题我也遇到过,不过我知道那是自己的问题。在C++中想这样扣毛病,那我能扣出一大堆。A窗口把B窗口挡住了,而B窗口是活动窗口5就不说了6:你说得耗尽资源是什么意思?如果你每次操作都close了句柄,然后还会出现这种现象,那多半是OutofMemory错。你查询的数据是多少个?怎么存放的。干脆单开个帖子,我们帮你找问题吧。这和java绝没关系。
    BTW:java最让我动心的还是他的debug能力,vc里面已经吃尽苦头了,你不觉得吗?
      

  9.   

    lz的前3个问题总的说来就是想节省代码
    做oop的程序,无为的节省代码是大忌
    =============================
    不是节省代码,重复或类似的东西太多绝对显示不出一种语言的优越性。
      

  10.   

    vc和java之间这些细节差异确实很不习惯,从java转到vc的,还是从vc转到java的,都会遇到这样的问题。尤其对于已经习惯的东西。你还没说析构涵数呢,这点差别我觉得最不爽。
    没法子,这东西,我们说他好,你觉得不方便,都没办法。习惯就好了。
      

  11.   

    父类中的的构造方法一定要在子类中重复写一遍后才能在子类中使用,我写了一个类,构造方法有十来个,当我扩展该类时,子类也要写十来个相同的构造方法才能在子类中使用;  实力化子类自动跑父类无参构造  或用super有选择调用  构造方法是不可以继承的...何来重写!!
      

  12.   

    我发现linux下的jre和windows下的jre是有所不同的,
    同一个软件,在windows下没问题,但在linux下出现问题。
    jre版本完全一样的。