<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Vietnamese Developers' Blog &#187; Java</title>
	<atom:link href="http://openandfree.wordpress.com/category/programming/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://openandfree.wordpress.com</link>
	<description>There are 10 types of people in the world: Those who know the binary system and those who don't</description>
	<lastBuildDate>Sat, 22 Nov 2008 00:47:09 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='openandfree.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/caa4770bbad32f97d95cfd98b414dfc1?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Vietnamese Developers' Blog &#187; Java</title>
		<link>http://openandfree.wordpress.com</link>
	</image>
			<item>
		<title>Gọi repaint() nhiều lần trong JFrame và JApplet</title>
		<link>http://openandfree.wordpress.com/2008/11/22/g%e1%bb%8di-repaint-nhi%e1%bb%81u-l%e1%ba%a7n-trong-jframe-va-japplet/</link>
		<comments>http://openandfree.wordpress.com/2008/11/22/g%e1%bb%8di-repaint-nhi%e1%bb%81u-l%e1%ba%a7n-trong-jframe-va-japplet/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 00:47:09 +0000</pubDate>
		<dc:creator>kiennguyen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[frame]]></category>
		<category><![CDATA[repaint()]]></category>

		<guid isPermaLink="false">http://www.openandfree.org/blog/?p=78</guid>
		<description><![CDATA[Khi học Java, chúng ta thường bắt gặp những chương trình đơn giản về animation trong các sách dạy AWT và Swing, chẳng hạn như chương trình sau đây:
import java.awt.*;
import javax.swing.*;

public class Animation1 {

  public static void main( String[] args ) {

     Animation1 gui = new Animation1();
    [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openandfree.wordpress.com&blog=1590880&post=93&subd=openandfree&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Khi học Java, chúng ta thường bắt gặp những chương trình đơn giản về animation trong các sách dạy AWT và Swing, chẳng hạn như chương trình sau đây:</p>
<pre>import java.awt.*;
import javax.swing.*;

public class Animation1 {

  public static void main( String[] args ) {

     Animation1 gui = new Animation1();
     gui.go();

  }

  private void go() {

     JFrame frame = new JFrame();
     frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

     panel_ = new MyPanel();
     frame.getContentPane().add( panel_, BorderLayout.CENTER );

     frame.setSize( 500, 500 );
     frame.setVisible( true );

     for( int i = 0; i &lt; 400; i++ ) {

        x_++;
        y_++;

        panel_.repaint();

        try {
          Thread.sleep( 10 );
        } catch( Exception ex ) { }

     }

  }

  class MyPanel extends JPanel {

     public void paintComponent( Graphics g ) {

         g.setColor( Color.white );
         g.fillRect( 0, 0, this.getWidth(), this.getHeight() );

         g.setColor( Color.green );
         g.fillOval( x_, y_, 40, 40 );

     }

  }

  private JPanel panel_;
  private int x_ = 0;
  private int y_ = 0;

}</pre>
<p style="text-align:justify;">Chương trình này vẽ ra một vòng tròn trên một panel, tính toán lại tọa độ của nó rồi gọi repaint() để vẽ lại vòng tròn. Phương thức repaint() yêu cầu các component trên frame tự vẽ lại.Thao tác vẽ lại liên tục với các vị trí khác nhau sẽ tạo ra cảm giác vòng tròn chạy trên panel. Câu lệnh Thread.sleep(10) làm giảm tốc độ di chuyển của vòng tròn giúp người dùng dễ theo dõi.</p>
<p style="text-align:justify;">Chúng ta thử sáng tạo thêm một chút bằng cách thêm vào frame một button dùng kể kích hoạt animation (học event handler và inner class luôn). Animation sẽ được kích hoạt khi người dùng ấn nút &#8220;Start animation&#8221;. Chương trình được cải tiến như sau:<span id="more-93"></span></p>
<pre>import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Animation2 {

    public static void main( String[] args ) {

	Animation2 gui = new Animation2();
	gui.go();

    }

    private void go() {

	JFrame frame = new JFrame();
	frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

	panel_ = new MyPanel();
	frame.getContentPane().add( panel_, BorderLayout.CENTER );

	button_ = new JButton( "start animation" );
	button_.addActionListener( new StartAnimationAction() );
	frame.getContentPane().add( button_, BorderLayout.SOUTH );

	frame.setSize( 500, 500 );
	frame.setVisible( true );

    }

    class MyPanel extends JPanel {

	public void paintComponent( Graphics g ) {

	    g.setColor( Color.white );
	    g.fillRect( 0, 0, this.getWidth(), this.getHeight() );

	    g.setColor( Color.green );
	    g.fillOval( x_, y_, 40, 40 );

	}

    }

    class StartAnimationAction implements ActionListener {

	public void actionPerformed( ActionEvent e ) {

	    for( int i = 0; i &lt; 400; i++ ) {

		x_++;
		y_++;

		panel_.repaint();

		try {
		  Thread.sleep( 10 );
		} catch( Exception ex ) { }

	    }

	}

    }

  private JPanel panel_;
  private JButton button_;
  private int x_ = 0;
  private int y_ = 0;

}</pre>
<p style="text-align:justify;">Phiên bản mới nhìn qua thì rất &#8220;đẹp&#8221;, nhưng thực ra nó không chạy đúng như chúng ta mong đợi!  Chúng ta không nhìn thấy vòng tròn di chuyển trên panel mà chỉ thấy nó nhảy  từ vị trí ban đầu đến vị trí cuối cùng, các trạng thái trung gian đã bị mất. Vậy đâu là nguyên nhân của hành vi kì lạ này?</p>
<p style="text-align:justify;">Thực ra, khi chúng ta đặt phương thức repaint() vào trong một vòng lặp, AWT sẽ trộn các lời gọi repaint() lại với nhau và chỉ có lời gọi repaint() cuối cùng được thực hiện. Bởi vậy chúng ta không thể nhìn thấy các trạng thái trung gian của vòng tròn trên panel.</p>
<p style="text-align:justify;">Vậy làm thế nào giải quyết vấn đề này? Một giải pháp là đưa các lời gọi repaint() sang một thread khác như sau:</p>
<pre>import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Animation3 {

    public static void main( String[] args ) {

	Animation3 gui = new Animation3();
	gui.go();

    }

    private void go() {

	JFrame frame = new JFrame();
	frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

	panel_ = new MyPanel();
	frame.getContentPane().add( panel_, BorderLayout.CENTER );

	button_ = new JButton( "start animation" );
	button_.addActionListener( new StartAnimationAction() );
	frame.getContentPane().add( button_, BorderLayout.SOUTH );

	frame.setSize( 500, 500 );
	frame.setVisible( true );

    }

    class MyPanel extends JPanel {

	public void paintComponent( Graphics g ) {

	    g.setColor( Color.white );
	    g.fillRect( 0, 0, this.getWidth(), this.getHeight() );

	    g.setColor( Color.green );
	    g.fillOval( x_, y_, 40, 40 );

	}

    }

    class StartAnimationAction implements ActionListener, Runnable {

	public void actionPerformed( ActionEvent e ) {

	    Thread thread = new Thread( this );
	    thread.start();

	}

	public void run() {

	    for( int i = 0; i &lt; 400; i++ ) {

		x_++;
		y_++;

		panel_.repaint();

		try {
		  Thread.sleep( 10 );
		} catch( Exception ex ) { }

	    }

	}

    }

  private JPanel panel_;
  private JButton button_;
  private int x_ = 0;
  private int y_ = 0;

}</pre>
<p>Bây giờ thì chương trình của chúng ta đã chạy ngon lành. Để giải thích cặn kẽ về vấn đề gọi repaint() nhiều lần có lẽ cần đến những hiểu biết nhất định về thread trong Java. Bởi vậy &#8220;tác giả&#8221;, với trình độ còn rất hạn chế, đành tạm thời hài lòng với giải pháp nói trên <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Tài liệu tham khảo: <a href="http://www.ryerson.ca/~dgrimsha/courses/cps840/repaint.html">The repaint() method and the GUI thread</a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/openandfree.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/openandfree.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/openandfree.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/openandfree.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/openandfree.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/openandfree.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/openandfree.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/openandfree.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/openandfree.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/openandfree.wordpress.com/93/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openandfree.wordpress.com&blog=1590880&post=93&subd=openandfree&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://openandfree.wordpress.com/2008/11/22/g%e1%bb%8di-repaint-nhi%e1%bb%81u-l%e1%ba%a7n-trong-jframe-va-japplet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0b7240ced9e7e663cff734d741f37158?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">kiennguyen</media:title>
		</media:content>
	</item>
		<item>
		<title>vim plugin for NetBeans</title>
		<link>http://openandfree.wordpress.com/2008/11/20/vim-plugin-for-netbeans/</link>
		<comments>http://openandfree.wordpress.com/2008/11/20/vim-plugin-for-netbeans/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 01:09:34 +0000</pubDate>
		<dc:creator>kiennguyen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[vim plugin]]></category>

		<guid isPermaLink="false">http://www.openandfree.org/blog/?p=77</guid>
		<description><![CDATA[Khi đã quen viết code trên vi/vim rồi thì chuyển sang editor khác thật khó chịu. Phiền hà nhất là các thao tác di chuyển con trỏ (phải dùng các phím mũi tên lên xuống rất mất thời gian), xóa một từ hoặc một dòng (phải giữ Backspace mỏi cả tay), nhảy giữa các từ&#8230;Tóm [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openandfree.wordpress.com&blog=1590880&post=92&subd=openandfree&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Khi đã quen viết code trên vi/vim rồi thì chuyển sang editor khác thật khó chịu. Phiền hà nhất là các thao tác di chuyển con trỏ (phải dùng các phím mũi tên lên xuống rất mất thời gian), xóa một từ hoặc một dòng (phải giữ Backspace mỏi cả tay), nhảy giữa các từ&#8230;Tóm lại với những ai đã quen lập trình trên vi/vim thì việc phải chuyển sang các IDE khác sẽ không khác gì cực hình.</p>
<p>Giải pháp cho vấn đề này là cài đặt vim plugin cho IDE đang sử dụng. Một IDE đang được sử dụng rộng rãi là NetBeans. Để cài đặt vim plugin cho NetBeans, vào link dưới đây để tải về file cài đặt:</p>
<p><a href="http://sourceforge.net/projects/viex/">http://sourceforge.net/projects/viex/</a></p>
<p>Giải nén để nhận được file start-module-myvim.nbm. Từ menu của NetBeans, chọn Tools-&gt;Plugins-&gt;Downloaded-&gt;Add Plugins rồi chọn file start-module-myvim.nbm. Chúng ta sẽ thấy biểu tượng của vim nằm bên cạnh các icon khác như trong hình dưới đây. (Chú ý hình dáng của con trỏ, chúng ta đang ở chế độ lệnh của vim).</p>
<p><img class="alignnone" src="http://farm4.static.flickr.com/3173/3044058495_7b05091433_o.jpg" alt="" width="600" height="400" /></p>
<p>Bây giờ thì chúng ta đã có thể tận hưởng sự tiện lợi trong việc viết code bằng vim kết hợp với những tính năng phức tạp cung cấp bởi NetBeans. Tuy nhiên, plugin này vẫn chưa hỗ trợ một số thao tác edit trong vim như</p>
<p>- Không tự động indent khi xuống dòng bằng phím o.</p>
<p>- Không hỗ trợ shift-o</p>
<p>- Không hỗ trợ ctrl-r (redo).</p>
<p>- Không hỗ trợ xoá nhiều từ liền nhau (d 2 w, d 3 w, d $,&#8230;)</p>
<p>Tuy nhiên với những tính năng hiện có của plugin này thì công việc lập trình trên NetBeans đã trở nên thú vị hơn rất nhiều. Hi vọng những khiếm khuyết nói trên sẽ được khắc phục trong những phiên bản sau.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/openandfree.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/openandfree.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/openandfree.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/openandfree.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/openandfree.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/openandfree.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/openandfree.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/openandfree.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/openandfree.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/openandfree.wordpress.com/92/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openandfree.wordpress.com&blog=1590880&post=92&subd=openandfree&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://openandfree.wordpress.com/2008/11/20/vim-plugin-for-netbeans/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0b7240ced9e7e663cff734d741f37158?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">kiennguyen</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3173/3044058495_7b05091433_o.jpg" medium="image" />
	</item>
		<item>
		<title>[Java] Pass-by-value or Pass-by-reference?</title>
		<link>http://openandfree.wordpress.com/2007/12/06/java-pass-by-value-or-pass-by-reference/</link>
		<comments>http://openandfree.wordpress.com/2007/12/06/java-pass-by-value-or-pass-by-reference/#comments</comments>
		<pubDate>Thu, 06 Dec 2007 07:34:40 +0000</pubDate>
		<dc:creator>Hoang Tran</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[pass-by-reference]]></category>
		<category><![CDATA[pass-by-value]]></category>

		<guid isPermaLink="false">http://www.openandfree.org/blog/?p=38</guid>
		<description><![CDATA[Một trong những điểm khó khăn (và gây tranh cãi) cho những lập trình viên C++ khi lập trình Java là việc pass-by-value hay pass-by-reference. Ví dụ:

Object a = new Object("Object A"); //kỳ quặc với C++: Object* a = new ...
Object b = a;
b.setNewName("Object B");

Theo cách hiểu của C++ devs thì rõ ràng Object b [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openandfree.wordpress.com&blog=1590880&post=42&subd=openandfree&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">Một trong những điểm khó khăn (và gây tranh cãi) cho những lập trình viên C++ khi lập trình Java là việc pass-by-value hay pass-by-reference. Ví dụ:</p>
<pre>
Object a = new Object("Object A"); //kỳ quặc với C++: Object* a = new ...
Object b = a;
b.setNewName("Object B");
</pre>
<p align="justify">Theo cách hiểu của C++ devs thì rõ ràng Object b thay đổi tên chẳng liên quan gì đến Object a cả. Thực tế theo Java thì khác, Object a sẽ có name là &#8220;Object B&#8221; chẳng khác gì Object b cả.</p>
<p align="justify">Để Object b hoàn toàn &#8220;độc lập&#8221; với Object a thì:</p>
<pre>
Object b = a.clone();
</pre>
<p align="justify">Thế nhưng hàm swap() trong Java lại chẳng hoạt động theo cách pass-by-reference.</p>
<pre>
private void swap(Type arg1, Type arg2) {
    Type temp = arg1;
    arg1 = arg2;
    arg2 = temp;
}
</pre>
<p align="justify">Vậy đấy!!! Java thực sự đã làm như thế nào? Ẩn sau những cái lằng nhằng gây tranh cãi như vậy là gì?</p>
<p><span id="more-42"></span></p>
<p align="justify">Trước hết cần hiểu rằng pass-by-value là cách truyền bằng cách copy giá trị của tham số vào một &#8220;biến&#8221; được sử dụng trong nội hàm đó. Do đó khi hàm trả về thì sẽ hủy đi các tham số copied, và các tham số truyền vào thì không bị ảnh hưởng thay đổi gì. Trái ngược với nó là pass-by-reference thì thực sự tạo ra một alias tới các tham số thực sự. Khi trong hàm thay đổi các tham số đó thì nó cũng thay đổi trực tiếp các tham số truyền vào. Việc không phải tạo một bản copy ở trong C++ nhiều khi tiết kiệm được CPU với object lớn, có quá trình copy/khởi tạo phức tạp.</p>
<p align="justify">Tuy nhiên thì ở trong Java hàm swap không hoạt động vì nó hoạt động theo cách thức pass-by-value. Sau khi hàm swap trả về thì arg1 và arg2 không đổi chỗ cho nhau. Nhưng kỳ lạ hơn nếu trong thân hàm swap gọi một phương thức của Type làm thay đổi object, ví dụ như:</p>
<pre>
arg1.setValue("Change");
</pre>
<p align="justify">Theo cách nghĩ pass-by-value thì sau khi thoát khỏi hàm swap thì arg1 chẳng bị thay đổi gì. Thực tế lại khác, arg1 đã gọi phương thức setValue() do đó khi thoát khỏi hàm thì value của arg1 đã thay đổi.</p>
<p align="justify">Hãy nhớ lại rằng trong C cũng không có khái niệm reference (&amp;). Thế nhưng C lại có pointer (con trỏ) và nó làm cho C mạnh mẽ uyển chuyển không cần có reference. Java có pointer không?</p>
<p align="justify">Nhiều người cho rằng: Object thì là pass-by-reference còn các kiểu primitive thì là pass-by-value (<em>In Java, Objects are  passed by reference, and primitives are passed by value.)</em> Mệnh đề này chỉ đúng một nửa. Object không phải được pass-by-reference mà là object reference được pass-by-value. Chúng ta sẽ hiểu rõ ở câu trả lời:</p>
<p align="justify">Câu trả lời cho tất cả các sự kỳ quặc trên ở Java đó chính là Java đã &#8220;làm sạch&#8221; cú pháp pointer trong C. Java có pointer nhưng pointer được khai báo và sử dụng một cách rất clean. Và tất nhiên nó tuy không mạnh bằng pointer trong C nhưng nó cũng &#8220;fix&#8221; tất cả những lỗi tiềm tàng và nguy hiểm (casting, releasing pointer hay pointer arithmetic) của pointer trong C.</p>
<p align="justify">Trong Java,</p>
<pre>
Object a;
</pre>
<p align="justify">giống như trong C/C++</p>
<pre>
Object* a;
</pre>
<p align="justify">Do đó khi</p>
<pre>
Object b = a;
</pre>
<p align="justify">có nghĩa trong C/C++</p>
<pre>
Object* b = a; // b và a đều là pointer
</pre>
<p align="justify">và</p>
<pre>
b.setName("Object B");
</pre>
<p align="justify">tương đương với</p>
<pre>
b-&gt;setName("Object B");
</pre>
<p align="justify">Thế nên b.setName(&#8220;Object B&#8221;) cũng đặt object &#8220;trỏ&#8221; bởi a có tên là &#8220;Object B&#8221; vì a và b trỏ cùng vào một object.</p>
<p align="justify">Và</p>
<pre>
private void swap(Object a, Object b)
{
     Object temp = a;
     a = b;
     b = temp;
}
</pre>
<p align="justify">tương ứng với</p>
<pre>
void swap(Object* a, Object* b)
{
     Object* temp = a;
     a = b;
     b = temp;
}
</pre>
<p align="justify">Rõ ràng hàm này trong C không hoạt động trừ phi thay đổi thế này:</p>
<pre>
void swap(Object* a, Object* b)
{
     Object temp = *a;
     *a = *b;
     *b = temp;
}
</pre>
<p align="justify">&#8220;Con trỏ&#8221; a và b được truyền theo kiểu pass-by-value (có thể hiểu rằng Java giống như C, tất cả các tham số được truyền theo kiểu pass-by-value) nên sau khi hàm swap trả về thì a, b không bị thay đổi hay phép gán a = b không có ý nghĩa. Thế nhưng a.setValue(&#8220;&#8230;&#8221;) thì đã thay đổi object trỏ bởi con trỏ.</p>
<p align="justify">Tham khảo</p>
<ul>
<li>http://javadude.com/articles/passbyvalue.htm</li>
<li>http://www.ibm.com/developerworks/library/j-praxis/pr1.html</li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/openandfree.wordpress.com/42/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/openandfree.wordpress.com/42/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/openandfree.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/openandfree.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/openandfree.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/openandfree.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/openandfree.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/openandfree.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/openandfree.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/openandfree.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/openandfree.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/openandfree.wordpress.com/42/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openandfree.wordpress.com&blog=1590880&post=42&subd=openandfree&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://openandfree.wordpress.com/2007/12/06/java-pass-by-value-or-pass-by-reference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f6f88159a87ae5eb23d369e775bf0e4a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">hoangtran</media:title>
		</media:content>
	</item>
		<item>
		<title>C++ vs. Java: Mutability</title>
		<link>http://openandfree.wordpress.com/2007/09/19/c-vs-java-mutability/</link>
		<comments>http://openandfree.wordpress.com/2007/09/19/c-vs-java-mutability/#comments</comments>
		<pubDate>Wed, 19 Sep 2007 04:14:37 +0000</pubDate>
		<dc:creator>Hoang Tran</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://openandfree.wordpress.com/2007/09/19/c-vs-java-mutability/</guid>
		<description><![CDATA[Nguồn: http://mannu.livejournal.com/131085.html
Bài viết này là một thảo luận nhỏ được đề cập đến trong bài báo của Tahir rằng tại sao anh ta thích C++ hơn Java: “Why I Program in C++” (mà tôi sẽ đề cập khi có dịp).
Java thiếu rất nhiều đặc điểm của C++ và ngược lại. Nhưng có một đặc điểm [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openandfree.wordpress.com&blog=1590880&post=13&subd=openandfree&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Nguồn: <a href="http://mannu.livejournal.com/131085.html">http://mannu.livejournal.com/131085.html</a></span></p>
<p style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Bài viết này là một thảo luận nhỏ được đề cập đến trong bài báo của Tahir rằng tại sao anh ta thích C++ hơn Java: “Why I Program in C++” (mà tôi sẽ đề cập khi có dịp).</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Java thiếu rất nhiều đặc điểm của C++ và ngược lại. Nhưng có một đặc điểm của C++ mà tôi vẫn chưa quen được trong Java là <em>khả năng có một const reference tới objects, làm cho những object là immutable khi sử dụng những references như vậy</em>. Trong Java thì không phải tất cả instances (thể hiện) của một class nào là immutable (ví dụ java.lang.String) hoặc bất cứ một thể hiện nào là immutable. Mutability của một object được xác đính bởi design (thiết kế) của class đó và không có cách nào để nó chịu ảnh hưởng bởi cái reference đến trong hệ thống. Do đó tất cả đối tượng “String” trong Java là immutable, trong khi tất cả ArrayLists là mutable. </span></p>
<p style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Để rõ hơn, sau đây là một lớp contact trong C++:</span><span id="more-13"></span></p>
<pre><font size="2"><tt><strong><font color="#0000ff">class</font></strong> Contact
<font color="#ff0000">{</font>
<strong><font color="#0000ff">private</font></strong><font color="#990000">:</font>
    string name<font color="#990000">;</font>
<strong><font color="#0000ff">public</font></strong><font color="#990000">:</font>
    <font color="#009900">void</font> <strong><font color="#000000">setName</font></strong><font color="#990000">(</font><strong><font color="#0000ff">const</font></strong> string<font color="#990000">&amp;</font> name<font color="#990000">)</font>
    <font color="#ff0000">{</font>
        <strong><font color="#0000ff">this</font></strong><font color="#990000">-&gt;</font>name <font color="#990000">=</font> name<font color="#990000">;</font>
    <font color="#ff0000">}</font>
    <strong><font color="#0000ff">const</font></strong> string<font color="#990000">&amp;</font> <strong><font color="#000000">getName</font></strong><font color="#990000">()</font> <strong><font color="#0000ff">const</font></strong>
    <font color="#ff0000">{</font>
        <strong><font color="#0000ff">return</font></strong> name<font color="#990000">;</font>
    <font color="#ff0000">}</font>
<font color="#ff0000">}</font><font color="#990000">;</font></tt></font></pre>
<p class="MsoNormal" style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Một vài đoạn mã C++ mà một đối tượng của Contact được tạo ra và refer đến. </span></p>
<pre><font size="2"><tt><font color="#009900">void</font> <strong><font color="#000000">print</font></strong><font color="#990000">(</font><strong><font color="#0000ff">const</font></strong> Contact<font color="#990000">&amp;);</font>
Contact myContact<font color="#990000">;</font>

myContact<font color="#990000">.</font><strong><font color="#000000">setName</font></strong><font color="#990000">(</font><font color="#ff0000">"Manish"</font><font color="#990000">);</font>
<strong><font color="#000000">print</font></strong><font color="#990000">(</font>myContact<font color="#990000">);</font>
<font color="#009900">void</font> <strong><font color="#000000">print</font></strong><font color="#990000">(</font><strong><font color="#0000ff">const</font></strong> Contact<font color="#990000">&amp;</font> c<font color="#990000">)</font>
<font color="#ff0000">{</font>
    cout <font color="#990000">&lt;&lt;</font> c<font color="#990000">.</font><strong><font color="#000000">getName</font></strong><font color="#990000">()</font> <font color="#990000">&lt;&lt;</font> endl<font color="#990000">;</font>
<font color="#ff0000">}</font></tt></font></pre>
<p class="MsoNormal" style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Khi đoạn mã bên trên gọi void print(const Contact&amp;) thì đã đảm bảo rằng đối tượng Contact truyền vào sẽ tiếp tục không được thay đổi, vì vậy sẽ là không hợp lệ khi gọi một hàm không phải const như void Contact::setName(const string&amp;) trong một const reference. Bằng cách này, lập trình viên có thể chắc chắn rằng hàm void print(const Contact&amp;) không làm ảnh hưởng gì đến dữ liệu của đối tượng Contact. Điều đó rất quan trọng, cho dù là cái cách mà hàm làm thay đổi một đối tượng được truyền tới nó là một phần thỏa thuận giữa hàm gọi và đối tượng được gọi.</span></p>
<p class="MsoNormal" style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Không thể viết được một đoạn mã tương ứng với đoạn mã trên trong Java: </span></p>
<pre><font size="2"><tt><strong><font color="#0000ff">class</font></strong> Contact
<font color="#ff0000">{</font>
    <strong><font color="#0000ff">private</font></strong> String name<font color="#990000">;</font>
    <strong><font color="#0000ff">public</font></strong> <font color="#009900">void</font> <strong><font color="#000000">setName</font></strong><font color="#990000">(</font>String name<font color="#990000">)</font>
    <font color="#ff0000">{</font>
        <strong><font color="#0000ff">this</font></strong><font color="#990000">.</font>name <font color="#990000">=</font> name<font color="#990000">;</font>
    <font color="#ff0000">}</font>

    <strong><font color="#0000ff">public</font></strong> String <strong><font color="#000000">getName</font></strong><font color="#990000">()</font>
    <font color="#ff0000">{</font>
        <strong><font color="#0000ff">return</font></strong> name<font color="#990000">;</font>
    <font color="#ff0000">}</font>
<font color="#ff0000">}</font>
<font color="#990000">...</font>

Contact myContact <font color="#990000">=</font> <strong><font color="#0000ff">new</font></strong> <strong><font color="#000000">Contact</font></strong><font color="#990000">();</font>
myContact<font color="#990000">.</font><strong><font color="#000000">setName</font></strong><font color="#990000">(</font><font color="#ff0000">"Manish"</font><font color="#990000">);</font>
<strong><font color="#000000">print</font></strong><font color="#990000">(</font>myContact<font color="#990000">);</font>

<font color="#009900">void</font> <strong><font color="#000000">print</font></strong><font color="#990000">(</font>Contact c<font color="#990000">)</font>
<font color="#ff0000">{</font>
    System<font color="#990000">.</font>out<font color="#990000">.</font><strong><font color="#000000">println</font></strong><font color="#990000">(</font>c<font color="#990000">.</font><strong><font color="#000000">getName</font></strong><font color="#990000">());</font>
    <em><font color="#9a1900">/* XXX: It is possible to call c.setName(String) here */</font></em>
    <em><font color="#9a1900">/* Vẫn có thể gọi c.setName(String) ở đây */</font></em>
<font color="#ff0000">}</font></tt></font></pre>
<p class="MsoNormal" style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Trong Java, khi một reference tới một đối tượng Contact được truyền trong chương trình thì không có cách nào để đối tượng đó là không được thay đổi. Trong C++, thì truyền const reference sẽ làm việc này. Đó là khả năng của C++ để chia rẽ các phương thức mutator từ phương thức non-mutator; trong Java, toàn bộ class cẩn phải là immutable – java.lang.String là một ví dụ tốt nhất – điều đó rất lãng phí, bởi vì mỗi khi một đối tượng immutable cần phải thay đổi, một bản copy mới của nó sẽ cần phải được khởi tạo với nội dung được thay đổi. Bên cạnh đó, trong Java, không có cách nào để nói một mutable class từ một immutable class mà không nhìn vào tài liệu của nó. Mutability (immutability) không phải là một đặc điểm ngôn ngữ của Java, giống như <em>vtables</em> (dùng để enable tính đa hình trên C++) không phải là đặc điểm ngôn ngữ của C (có thể hack được nhưng rất phức tạp). </span></p>
<p class="MsoNormal" style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Java newbies (và tương tự C++ newbies) có khuynh hướng so sánh từ khóa “final” trong Java với từ khóa “const” trong C++. Trong khi “final” đáp ứng một trong những mục đích của const là có một giá trị không đổi của một biến (primitives và references), nhưng nó không làm một đối tượng là “không thay đổi”. </span></p>
<p class="MsoNormal" style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Hãy nhìn vào đoạn mã Java, khi mà lớp Contact được sử dụng</span></p>
<pre><font size="2"><tt><strong><font color="#0000ff">class</font></strong> AddressBook
<font color="#ff0000">{</font>
    <em><font color="#9a1900">/** A list of {</font></em><font color="#009900">@link</font><em><font color="#9a1900"> Contact} objects. */</font></em>
    <strong><font color="#0000ff">private</font></strong> List contacts<font color="#990000">;</font>
    <strong><font color="#0000ff">public</font></strong> <font color="#009900">void</font> <strong><font color="#000000">addContact</font></strong><font color="#990000">(</font>Contact c<font color="#990000">)</font>
    <font color="#ff0000">{</font>
        contacts<font color="#990000">.</font><strong><font color="#000000">add</font></strong><font color="#990000">(</font>c<font color="#990000">);</font>
    <font color="#ff0000">}</font>
    <strong><font color="#0000ff">public</font></strong> Contact <strong><font color="#000000">getContactByName</font></strong><font color="#990000">(</font>String name<font color="#990000">)</font>
    <font color="#ff0000">{</font>
        Contact c <font color="#990000">=</font> <strong><font color="#0000ff">null</font></strong><font color="#990000">;</font>

        <em><font color="#9a1900">/* find contact by name */</font></em>
        <strong><font color="#0000ff">return</font></strong> c<font color="#990000">;</font>
    <font color="#ff0000">}</font>
<font color="#ff0000">}</font></tt></font></pre>
<p class="MsoNormal" style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Giờ thì bất kỳ một reference tới AddressBook, final hay không thì: </span></p>
<p class="MsoNormal" style="margin-left:0.5in;text-align:justify;text-indent:-0.25in;"><!--[if !supportLists]--><span style="font-size:10pt;font-family:Verdana;"><span>-<span style="font-family:'Times New Roman';font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;">         </span></span></span><!--[endif]--><span style="font-size:10pt;font-family:Verdana;">Có thể được sử dụng để thay đổi trạng thái của đối tượng bằng cách thêm vào contacts.</span></p>
<p class="MsoNormal" style="margin-left:0.5in;text-align:justify;text-indent:-0.25in;"><!--[if !supportLists]--><span style="font-size:10pt;font-family:Verdana;"><span>-<span style="font-family:'Times New Roman';font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;">         </span></span></span><!--[endif]--><span style="font-size:10pt;font-family:Verdana;">Có thể được sử dụng để thay đổi tất cả đối tượng được chứa (contact), bằng cách gọi getContactByName và gọi hàm setName của đối tượng contact đó. </span></p>
<p class="MsoNormal" style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Một thiết kế lớp nghèo nàn như vậy làm cho kiến trúc public-private trong Java dường như rất hời hợt (Chúng không giúp ích nhiều trong việc để Contact.name và AddressBook.contacts trở nên <em>private</em>, đúng không? Tôi vẫn chưa thể có thời gian giải thích chúng với Java programmers). </span></p>
<p class="MsoNormal" style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Với C++, thậm chí có thể có 2 version của phương thức getContactByName, một gọi thông qua non-const reference và một gọi qua const-reference:</span></p>
<pre><font size="2"><tt>Contact<font color="#990000">&amp;</font> <strong><font color="#000000">getContactByName</font></strong><font color="#990000">(</font><strong><font color="#0000ff">const</font></strong> string<font color="#990000">&amp;</font> name<font color="#990000">);</font>

<strong><font color="#0000ff">const</font></strong> Contact<font color="#990000">&amp;</font> <strong><font color="#000000">getContactByName</font></strong><font color="#990000">(</font><strong><font color="#0000ff">const</font></strong> string<font color="#990000">&amp;</font> name<font color="#990000">)</font> <strong><font color="#0000ff">const</font></strong><font color="#990000">;</font>
<em><font color="#9a1900">/* Note the difference in return types (const-ness) */</font></em></tt></font></pre>
<p style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Trong Java thì hiệu quả mong muốn của việc tạo ra một đối tượng AddressBook như là mutable với phần chắc chắn của hệ thống và immutable của với các phần khác có thể đạt được bằng cách sử dụng các <em><span style="font-family:Verdana;">access specifiers</span></em> (private, public, protected, và package-level). Phương thức addContact có thể được tạo ở mức package, và những phần kia của mã mà phải thêm contacts vào một AddressBook có thể trở thành một phần của cùng package đó. Chúng được gọi là phần đáng tin cậy của hệ thống. Phương thức getContactByName có thể trả về một copy của đối tượng Contact. (Gợi ý: Chồng phương thức clone).</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Tôi tin rằng đây là một đặc điểm hết sức cơ bản của C++ mà đã được loại bỏ khỏi Java để tránh cho ngôn ngữ trở nên quá phức tạp (có thể nhằm làm dễ dàng hơn khi nó mới và phát triển ngày càng phình ra). Tuy vậy thì rất khó khi không có đặc điểm này.</span></p>
<p style="text-align:justify;"><span style="font-size:10pt;font-family:Verdana;">Ngôn ngữ ảnh hưởng đến cách chúng ta nghĩ, và nhiều như cách những người theo chủ nghĩa thuần túy thích từ chối nó, một ngôn ngữ lập trình ảnh hưởng rất lớn đến những quyết định thiết kế chương trình. </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;"> </span></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/openandfree.wordpress.com/13/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/openandfree.wordpress.com/13/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/openandfree.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/openandfree.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/openandfree.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/openandfree.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/openandfree.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/openandfree.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/openandfree.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/openandfree.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/openandfree.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/openandfree.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openandfree.wordpress.com&blog=1590880&post=13&subd=openandfree&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://openandfree.wordpress.com/2007/09/19/c-vs-java-mutability/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f6f88159a87ae5eb23d369e775bf0e4a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">hoangtran</media:title>
		</media:content>
	</item>
	</channel>
</rss>