tag:blogger.com,1999:blog-27568902790962743142024-03-05T20:57:21.360+03:00Binnur Kurt's BlogDr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.comBlogger123125tag:blogger.com,1999:blog-2756890279096274314.post-62817702976126133502020-04-14T20:26:00.004+03:002020-04-17T13:35:16.706+03:00Java 9+'da Modüler Uygulama Geliştirmek<div style="text-align: justify;">
<span style="font-family: "trebuchet ms" , sans-serif;"> <b>J</b>ava Development Kit (<b>JDK</b>), Java uygulaması geliştirmek, geliştirdiğimiz uygulamaları çalıştırmak ve en nihayetinde uygulamamızın dağıtımını yapmak için çeşitli araçlar (<b>javac</b>, <b>java</b>, <b>javadoc</b>, <b>jar</b>, <b>jlink </b>gibi) sunuyor. Uygulamaların dağıtımını yapmak için <b>jar </b>komutundan ve jar formatından yararlanıyoruz. jar komutu projede yer alan .class uzantılı dosyaları tek bir dosyaya arşivleyip, bu arşiv dosyasını jar uzantılı bir dosyaya sıkıştırıyor. Ağırlıklı olarak Linux sistemlerde yer alan tar ve zip komutunun yaptığı işlemi bize sunuyor. Daha sonra bu jar uzantılı uygulamayı java komutu ile çalıştırıyoruz. jar uzantılı dosyada bir uygulama olabileceği gibi bir çok projede ortak olarak kullanılan bir kütüphane de olabilir. </span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
<h2 style="text-align: justify;">
<span style="font-family: "trebuchet ms" , sans-serif;"><span style="font-weight: 400;">MODÜL</span></span></h2>
<div>
<span style="font-family: "trebuchet ms" , sans-serif;"><span style="font-weight: 400;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="font-family: "trebuchet ms" , sans-serif;"> <b>Y</b>azılım Mimarisi yazılımı parçalara ayırmakla ilgilidir. Yazılımı öyle birimlere ya da parçalara ayıralım ve daha sonra bu birimleri öyle birleştirelim ki işlevsel olmayan özellikleri sağlasın. İşlevsel olmayan özellikler ölçeklenebilirlik, her zaman erişebilirlik, değiştirilebilirlik gibi yazılımın verdiği hizmetin kalitesine yönelik tanımlar içerir. Örneğin <b><i>İstemci-Sunucu mimarisinde</i></b> bu parçalar ya da birimler İstemci ve Sunucudur. Örnek olarak <i><b>MySQL İlişkisel Veritabanını</b></i> ele alalım. <b>MySQL</b> <i>İstemci-Sunucu</i> mimarisine sahiptir. Sunucu <b>mysqld</b> prosesi olarak bir makinada çalışırken, istemciler ise <i>Java</i>, <i>C</i>/<i>C++</i>, <i>.Net</i>, <i>PHP</i>, <i>Python</i> ya da <i>node.js</i> platformarından birinde yazılmış birer uygulama olabilir. <b>mysqld</b> sunucusu ise <i>Katmanlı Mimariye</i> (=<i>Layered Architecture</i>) sahiptir. Bu katmanlar, <b>mysqld</b> örneğinde aşağıda verildeği şekildedir: i. Bağlantı katmanı, ii. Ayrıştırıcı (=Parser) ve Sorgu Cep Belleği, iii. En İyileyici (=Optimizer) iv. Depolama Motorları (=Storage Engines)</span></div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5EKinsyRMhn4Q7EyJLrPNUKsc_oO6LrTPmLQDiLaa2Hoacd7JHO2Oi6N7wcfF-1VDxppbfBrAQ4VHpNfl0xC6R9xfB5pr5DslUYKNFUTiKatOkhKr3OTNZfcT7438Rr7UyjoABt5__F1v/s1600/mysql-architecture.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="696" data-original-width="458" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5EKinsyRMhn4Q7EyJLrPNUKsc_oO6LrTPmLQDiLaa2Hoacd7JHO2Oi6N7wcfF-1VDxppbfBrAQ4VHpNfl0xC6R9xfB5pr5DslUYKNFUTiKatOkhKr3OTNZfcT7438Rr7UyjoABt5__F1v/s400/mysql-architecture.png" width="262" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small;">MySQL'in Mimarisi</span></td></tr>
</tbody></table>
<div style="text-align: justify;">
<span style="font-family: "trebuchet ms" , sans-serif;"><b>B</b>u katmanların her birini diğerinden ayırt etmek üzere bir birim ya da modül olarak tanımlamak isteriz. Böylelikle uygulamayı geliştirmek, test etmek, değiştirmek, bakımını yapmak daha kolay olacaktır. Bir uygulama <i><b>Yekpare Mimaride</b></i> (=<i><b>Monolithic Architecture</b></i>) olarak geliştirilmiş olsa bile modüler bir yapıda olmasını yeğleriz. Bu birimleri Windows'ta <b>DLL</b> (<b><i>Dynamic Link Library</i></b>) olarak, Linux'da <b>SO</b> (=<b><i>Shared Object</i></b>) dosyası olarak ve Java'da ise JAR dosyası olarak tanımlıyoruz.</span><br />
<h2>
<span style="font-family: "trebuchet ms" , sans-serif; font-weight: normal;">Java 9 ve MODÜLER PROGRAMLAMA</span></h2>
</div>
<div style="text-align: justify;">
<span style="font-family: "trebuchet ms" , sans-serif;"> <b>Java 9</b>'un modüller programlama açısından bakıldığında iki hedefi bulunuyor:</span><br />
<ul>
<li><span style="font-family: "trebuchet ms" , sans-serif;">İlk hedef JDK'nın modüler bir yapıya kavuşturmak getirmek. </span></li>
<li><span style="font-family: "trebuchet ms" , sans-serif;">İkinci hedef JDK üzerinde çalışan onu kullanan uygulamanızın modüler yazılabilmesini sağlamak. </span></li>
</ul>
<h2>
<span style="font-family: "trebuchet ms" , sans-serif; font-weight: normal;">MODÜLER JDK</span></h2>
<span style="font-family: "trebuchet ms" , sans-serif;"><b>J</b>ava'da Java 9'a kadar modülü ayırt edecek herhangi bir gösterim bulunmuyordu. Jar dosyası kavramsal olarak bir modül içerse bile JVM'nin (<i>Java Virtual Machine</i>) ve <b><i>Class Loader</i></b>'ın bunu ayırt etmesini sağlayacak herhangi bir tanımlama jar dosyası içinde yer almaz. Üstelik JVM'nin kendisi modüler değildir: <b>rt.jar</b> ve <b>tools.jar</b>. Platform devasa bu iki jar dosyasından ibarettir ve her yeni sürümde bu jar dosyasının boyutu artmaktadır. Java 9 hem platformun hem de bu platformun üzerinde çalışacak uygulamanın modüler olarak geliştirilmesini sağlayacak yenilikler içeriyor. Bu yazıda bu yenilikler tanıtılmaya çalışılacaktır.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;">Makinanıza JDK 9+ kurduğunuzda artık içinden rt.jar çıkmadığını göreceksiniz. <b>rt.jar</b> içinde sağlanan işlevler modüller halinde yerinden <b>jmods</b> dizini altında düzenlendiğini görüyoruz:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">c:<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\s</span>tage<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\o</span>pt<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>dk-9.0.4>dir
Directory of c:<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\s</span>tage<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\o</span>pt<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>dk-9.0.4
01/19/2020 08:01 AM <DIR> .
01/19/2020 08:01 AM <DIR> ..
01/19/2020 08:00 AM <DIR> bin
01/19/2020 08:00 AM <DIR> conf
12/19/2017 06:31 PM 3,244 COPYRIGHT
01/19/2020 08:00 AM <DIR> include
01/19/2020 08:00 AM <DIR> jmods
01/19/2020 08:00 AM <DIR> legal
01/19/2020 08:01 AM <DIR> lib
11/04/2019 12:40 PM 158 README.html
11/04/2019 12:40 PM 1,950 release
</pre>
</div>
<br />
<span style="font-family: "trebuchet ms" , sans-serif;"><b>jmods</b> dizini içinde 98 adet <b>jmod</b> uzantılı dosya yer alıyor. Bu modüllerin her birinin <i><b>tek bir sorumluluğu</b></i> olacak şekilde düzenlendiğini görüyoruz:</span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">c:<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\s</span>tage<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\o</span>pt<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>dk-9.0.4<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>mods>dir
Directory of c:<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\s</span>tage<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\o</span>pt<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>dk-9.0.4<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>mods
01/19/2020 08:00 AM <DIR> .
01/19/2020 08:00 AM <DIR> ..
11/04/2019 12:40 PM 61,160 java.activation.jmod
11/04/2019 12:40 PM 16,673,580 java.base.jmod
11/04/2019 12:40 PM 111,467 java.compiler.jmod
11/04/2019 12:40 PM 2,689,556 java.corba.jmod
11/04/2019 12:40 PM 51,910 java.datatransfer.jmod
11/04/2019 12:40 PM 13,681,645 java.desktop.jmod
11/04/2019 12:40 PM 127,281 java.instrument.jmod
11/04/2019 12:40 PM 18,864 java.jnlp.jmod
11/04/2019 12:40 PM 120,151 java.logging.jmod
11/04/2019 12:40 PM 880,278 java.management.jmod</pre>
<pre style="line-height: 125%; margin: 0;">.</pre>
<pre style="line-height: 125%; margin: 0;">.</pre>
<pre style="line-height: 125%; margin: 0;">.</pre>
<pre style="line-height: 125%; margin: 0;">11/04/2019 12:40 PM 78,541 jdk.security.auth.jmod
11/04/2019 12:40 PM 24,052 jdk.security.jgss.jmod
11/04/2019 12:40 PM 527,308 jdk.snmp.jmod
11/04/2019 12:40 PM 18,490 jdk.unsupported.jmod
11/04/2019 12:40 PM 1,940,012 jdk.xml.bind.jmod
11/04/2019 12:40 PM 42,434 jdk.xml.dom.jmod
11/04/2019 12:40 PM 741,290 jdk.xml.ws.jmod
11/04/2019 12:40 PM 87,995 jdk.zipfs.jmod
11/04/2019 12:40 PM 2,624 oracle.desktop.jmod
11/04/2019 12:40 PM 8,938 oracle.net.jmod
</pre>
</div>
<br />
<span style="font-family: "trebuchet ms" , sans-serif;"><b>jmod</b> dosyası aslında bir <b>jar</b> dosyasıdır. İçinde modül bilgisi, modülü oluşturan <b><i>class</i></b> dosyaları yer alıyor. Modül bilgisi ve modüller arasındaki bağımlılıklar <b>module-info.class</b> dosyası içinde tanımlıdır. Modül listesini <i>Java Sanal Makinasından </i><b>list-modules</b> seçeneği ile öğrenebilirsiniz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">c:<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\s</span>tage<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\o</span>pt<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>dk-9.0.4>java <b>--list-modules</b>
java.activation@9.0.4
java.base@9.0.4
java.compiler@9.0.4
java.corba@9.0.4
java.datatransfer@9.0.4
java.desktop@9.0.4
java.instrument@9.0.4
java.jnlp@9.0.4
java.logging@9.0.4
java.management@9.0.4</pre>
<pre style="line-height: 125%; margin: 0;">
</pre>
<pre style="line-height: 125%; margin: 0;">.</pre>
<pre style="line-height: 125%; margin: 0;">.</pre>
<pre style="line-height: 125%; margin: 0;">.</pre>
<pre style="line-height: 125%; margin: 0;">jdk.security.auth@9.0.4
jdk.security.jgss@9.0.4
jdk.snmp@9.0.4
jdk.unsupported@9.0.4
jdk.xml.bind@9.0.4
jdk.xml.dom@9.0.4
jdk.xml.ws@9.0.4
jdk.zipfs@9.0.4
oracle.desktop@9.0.4
oracle.net@9.0.4
</pre>
</div>
<br />
<span style="font-family: "trebuchet ms" , sans-serif;">Modül dosyası oluşturmak, modül dosyası içindeki dosyaları listelemek ve açmak ve modüller arasındaki bağımlılığı listelemek için <b>jmod</b> komutunu kullanabilirsiniz. Aşağıda <b>jmod</b> komutunun kullanımları örneklenmiştir:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">c:<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\s</span>tage<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\o</span>pt<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>dk-9.0.4><b>jmod describe</b> jmods<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>ava.sql.jmod
java.sql@9.0.4
exports java.sql
exports javax.sql
exports javax.transaction.xa
requires java.base mandated
requires java.logging transitive
requires java.xml transitive
uses java.sql.Driver
platform windows-amd64
</pre>
</div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">c:<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\s</span>tage<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\o</span>pt<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>dk-9.0.4><b>jmod</b> <b>list</b> jmods<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>ava.sql.jmod
classes/module-info.class
classes/java/sql/Array.class
classes/java/sql/BatchUpdateException.class
classes/java/sql/Blob.class
classes/java/sql/CallableStatement.class
classes/java/sql/ClientInfoStatus.class
classes/java/sql/Clob.class
classes/java/sql/Connection.class
classes/java/sql/ConnectionBuilder.class
classes/java/sql/DatabaseMetaData.class</pre>
<pre style="line-height: 125%; margin: 0;">.</pre>
<pre style="line-height: 125%; margin: 0;">.</pre>
<pre style="line-height: 125%; margin: 0;">.</pre>
<pre style="line-height: 125%; margin: 0;">classes/javax/sql/RowSetReader.class
classes/javax/sql/RowSetWriter.class
classes/javax/sql/StatementEvent.class
classes/javax/sql/StatementEventListener.class
classes/javax/sql/XAConnection.class
classes/javax/sql/XAConnectionBuilder.class
classes/javax/sql/XADataSource.class
classes/javax/transaction/xa/XAException.class
classes/javax/transaction/xa/XAResource.class
classes/javax/transaction/xa/Xid.class
legal/COPYRIGHT
legal/LICENSE
</pre>
</div>
<br />
<span style="font-family: "trebuchet ms" , sans-serif;">JDK'nın bu yeni modüler yapısı sayesinde uygulamanıza özel bir JDK oluşturabilirsiniz. Bunun için öncelikle uygulamanızın ihtiyacı olan modüllerin bir listesini çıkarmanız gerekir. Ardından <b>jlink</b> komutu ile sadece tanımladığınız bu listede yer alan modüllerden oluşan bir JDK oluşturabilirsiniz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">c:<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\s</span>tage<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\o</span>pt<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>dk-9.0.4>jlink --module-path jmods --add-modules java.sql,java.sql.rowset,java.xml --output c:<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\t</span>mp<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>dk9-app42
</pre>
</div>
<br />
<span style="font-family: "trebuchet ms" , sans-serif;">Sadece ihtiyacımız olan modüllerden oluşan <b>JDK</b> <b>c:\tmp\jdk9-app42</b> dizininde oluştu:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">c:<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\t</span>mp<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>dk9-app42>dir
Directory of c:<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\t</span>mp<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>dk9-app42
04/11/2019 10:49 PM <DIR> .
04/11/2019 10:49 PM <DIR> ..
04/11/2019 10:49 PM <DIR> bin
04/11/2019 10:49 PM <DIR> conf
04/11/2019 10:49 PM <DIR> include
04/11/2019 10:49 PM <DIR> legal
04/11/2019 10:49 PM <DIR> lib
04/11/2019 10:49 PM 121 release
</pre>
</div>
<br />
<span style="font-family: "trebuchet ms" , sans-serif;">Bu yeni <b>JDK</b> bir taraftan uygulamanızın daha hızlı açılmasını sağlarken diğer taraftan uygulamanızı kullanmadığı modüllerde oluşabilecek güvenlik açıklarından korumanızı sağlayacaktır. Uygulamanızı çalıştırmak için eskiden olduğu gibi <b>java</b> komutunu kullanacaksınız. Ancak bu kez <b>java</b> komutu olarak yeni <b>JDK</b>'daki <b>bin</b> dizininde yer alan <b>java</b> komutunu kullanacaksınız: </span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">c:<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\t</span>mp<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\j</span>dk9-app42<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\b</span>in>java -jar c:<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\t</span>mp<span style="background-color: #fff0f0; color: #666666; font-weight: bold;">\a</span>pp42.jar</pre>
</div>
<span style="font-family: "trebuchet ms" , sans-serif; font-weight: normal;"><br />
</span> <br />
<h2>
<span style="font-family: "trebuchet ms" , sans-serif; font-weight: normal;">MODÜLER JAVA UYGULAMASI GELİŞTİRMEK</span></h2>
<div>
<span style="font-family: "trebuchet ms" , sans-serif; font-weight: normal;"><br /></span></div>
<span style="font-family: "trebuchet ms" , sans-serif;"><b style="font-family: "Trebuchet MS", sans-serif;">Java 9</b><span style="font-family: "trebuchet ms" , sans-serif;"> öncesinde en üst paketleme yapısı sınıftır. Sınıfı detaylarını gizler dışarıya vereceği hizmetleri ise açarız. Bunu üyeleri public, private ya da protected tanımlayarak sağlarız. private tanımladığınız üyelere dışarıdan bir referans üzerinden ya da türetilmiş sınıftan erişemezsiniz. public tanımladığınız bir üyeye her yerden erişebilirsiniz. Ancak bir projede ya da jar dosyası içinde yer alan bir sınıfın import edilmesini engelleyemezsiniz. Bir sınıf istediği ihtiyaç duyduğu herhangi bir paketteki sınıfı kullanır. Bir paketi paketteki sınıfları nasıl gizleyebilirsiniz? <b>Java 9</b> ile birlikte bir üst paketleme seviyesine kavuştuk: </span><b style="font-family: "Trebuchet MS", sans-serif;">modül</b><span style="font-family: "trebuchet ms" , sans-serif;">. Varsayılan davranış olarak bir modül içindeki tüm sınıflar gizlenmiştir. Modülden dışarıya açmak istediğiniz paketleri, <b>module-info.java</b> dosyasında <b>exports</b> anahtar kelimesini kullanarak tanımlamanız gerekir. Her bir modülün dağıtımı bir jar dosyası olarak gerçekleştirilir. Şimdi modül yapısını ve özelliklerini incelemek için örnek bir uygulama olarak ü</span></span><span style="font-family: "trebuchet ms" , sans-serif;">ç modülden oluşan bir <b>Sayısal Loto</b> uygulaması geliştirelim. Her bir modülün tek bir sorumluluğu olacak şekilde parçalıyoruz: </span><br />
<ul>
<li><span style="font-family: "trebuchet ms" , sans-serif;"><b>Random Module</b>: Sözde rastgele sayı üretmekten sorumlu modül</span></li>
<li><span style="font-family: "trebuchet ms" , sans-serif;"><b>Lottery Module</b>: Sayısal Loto için sayı üretmekten sorumlu modül</span></li>
<li><span style="font-family: "trebuchet ms" , sans-serif;"><b>Application Module</b>: Uygulama modülü</span></li>
</ul>
<h3>
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></h3>
<h3>
<span style="font-family: "trebuchet ms" , sans-serif;">Random Module</span></h3>
<span style="font-family: "trebuchet ms" , sans-serif;"><b><i><br /></i></b></span>
<span style="font-family: "trebuchet ms" , sans-serif;"><b><i>Random modülü</i></b> sözde rastgele sayı üretmekten sorumlu bir modül olarak tasarlanmıştır. Modülün vereceği bu hizmeti dışarıya bir <b><i>Java arayüzü</i></b> (com.example.random.service.<b>RandomService</b>) üzerinden açacağız. Bu arayüzün gerçeklemelerine ait detaylarını (</span><span style="font-family: "trebuchet ms" , sans-serif;">com.example.random.service.business.</span><b style="font-family: "Trebuchet MS", sans-serif;">SimpleRandomService</b><span style="font-family: "trebuchet ms" , sans-serif;"> ve com.example.random.service.business.</span><b style="font-family: "Trebuchet MS", sans-serif;">SecureRandomService</b><span style="font-family: "trebuchet ms" , sans-serif;"> sınıfları</span><span style="font-family: "trebuchet ms" , sans-serif;">) ise modül içinde gizliyoruz.</span><br />
<br />
<span style="font-family: "trebuchet ms" , sans-serif;"><b><u>module-info.java:</u></b></span><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">module com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">random</span> <span style="color: #333333;">{</span>
exports com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">random</span><span style="color: #333333;">.</span><span style="color: #0000cc;">service</span><span style="color: #333333;">;</span>
provides com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">random</span><span style="color: #333333;">.</span><span style="color: #0000cc;">service</span><span style="color: #333333;">.</span><span style="color: #0000cc;">RandomNumberService</span> with com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">random</span><span style="color: #333333;">.</span><span style="color: #0000cc;">service</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">.</span><span style="color: #0000cc;">SimpleRandomNumberService</span><span style="color: #333333;">,</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">random</span><span style="color: #333333;">.</span><span style="color: #0000cc;">service</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">.</span><span style="color: #0000cc;">SecureRandomNumberService</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "trebuchet ms" , sans-serif;"><b><u>QualityLevel.java:</u></b></span><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">random</span><span style="color: #333333;">.</span><span style="color: #0000cc;">service</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">enum</span> QualityLevel <span style="color: #333333;">{</span>
SECURE<span style="color: #333333;">,</span> SIMPLE
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "trebuchet ms" , sans-serif;"><u><b>Quality.java:</b></u></span><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">random</span><span style="color: #333333;">.</span><span style="color: #0000cc;">service</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">static</span> java<span style="color: #333333;">.</span><span style="color: #0000cc;">lang</span><span style="color: #333333;">.</span><span style="color: #0000cc;">annotation</span><span style="color: #333333;">.</span><span style="color: #0000cc;">ElementType</span><span style="color: #333333;">.</span><span style="color: #0000cc;">METHOD</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">static</span> java<span style="color: #333333;">.</span><span style="color: #0000cc;">lang</span><span style="color: #333333;">.</span><span style="color: #0000cc;">annotation</span><span style="color: #333333;">.</span><span style="color: #0000cc;">ElementType</span><span style="color: #333333;">.</span><span style="color: #0000cc;">TYPE</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">static</span> java<span style="color: #333333;">.</span><span style="color: #0000cc;">lang</span><span style="color: #333333;">.</span><span style="color: #0000cc;">annotation</span><span style="color: #333333;">.</span><span style="color: #0000cc;">RetentionPolicy</span><span style="color: #333333;">.</span><span style="color: #0000cc;">RUNTIME</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.lang.annotation.Documented</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.lang.annotation.Retention</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.lang.annotation.Target</span><span style="color: #333333;">;</span>
<span style="color: #555555; font-weight: bold;">@Documented</span>
<span style="color: #555555; font-weight: bold;">@Retention</span><span style="color: #333333;">(</span>RUNTIME<span style="color: #333333;">)</span>
<span style="color: #555555; font-weight: bold;">@Target</span><span style="color: #333333;">({</span> TYPE<span style="color: #333333;">,</span> METHOD <span style="color: #333333;">})</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #555555; font-weight: bold;">@interface</span> Quality <span style="color: #333333;">{</span>
QualityLevel <span style="color: #0066bb; font-weight: bold;">value</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "trebuchet ms" , sans-serif;"><b><u>SecureRandomNumberService.java:</u></b></span><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">random</span><span style="color: #333333;">.</span><span style="color: #0000cc;">service</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.security.SecureRandom</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.Random</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.random.service.Quality</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.random.service.QualityLevel</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.random.service.RandomNumberService</span><span style="color: #333333;">;</span>
<span style="color: #555555; font-weight: bold;">@Quality</span><span style="color: #333333;">(</span>QualityLevel<span style="color: #333333;">.</span><span style="color: #0000cc;">SECURE</span><span style="color: #333333;">)</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">SecureRandomNumberService</span> <span style="color: #008800; font-weight: bold;">implements</span> RandomNumberService <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> Random rand <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> SecureRandom<span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">SecureRandomNumberService</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">err</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"SecureRandomNumberService is created!"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">generate</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> min<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">int</span> max<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">err</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"SECURE implementation is used!"</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">return</span> rand<span style="color: #333333;">.</span><span style="color: #0000cc;">nextInt</span><span style="color: #333333;">(</span>max <span style="color: #333333;">-</span> min<span style="color: #333333;">)</span> <span style="color: #333333;">+</span> min<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<b style="font-family: "trebuchet ms", sans-serif;"><u>SimpleRandomNumberService.java:</u></b><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">random</span><span style="color: #333333;">.</span><span style="color: #0000cc;">service</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.Random</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.concurrent.ThreadLocalRandom</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.random.service.Quality</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.random.service.QualityLevel</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.random.service.RandomNumberService</span><span style="color: #333333;">;</span>
<span style="color: #555555; font-weight: bold;">@Quality</span><span style="color: #333333;">(</span>QualityLevel<span style="color: #333333;">.</span><span style="color: #0000cc;">SIMPLE</span><span style="color: #333333;">)</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">SimpleRandomNumberService</span> <span style="color: #008800; font-weight: bold;">implements</span> RandomNumberService <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> Random rand <span style="color: #333333;">=</span> ThreadLocalRandom<span style="color: #333333;">.</span><span style="color: #0000cc;">current</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">SimpleRandomNumberService</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">err</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"SimpleRandomNumberService is created!"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">generate</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> min<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">int</span> max<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">err</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"CHEAP implementation is used!"</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">return</span> rand<span style="color: #333333;">.</span><span style="color: #0000cc;">nextInt</span><span style="color: #333333;">(</span>max <span style="color: #333333;">-</span> min <span style="color: #333333;">+</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">)</span> <span style="color: #333333;">+</span> min<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "trebuchet ms" , sans-serif;"><b><u>LotteryService.java:</u></b></span><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">random</span><span style="color: #333333;">.</span><span style="color: #0000cc;">service</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">RandomNumberService</span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">generate</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> min<span style="color: #333333;">,</span><span style="color: #333399; font-weight: bold;">int</span> max<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<h3>
<span style="font-family: "trebuchet ms" , sans-serif;">Lottery Module</span></h3>
<span style="font-family: "trebuchet ms" , sans-serif;"><b><br /></b></span>
<span style="font-family: "trebuchet ms" , sans-serif;"><b>Lottery modülü</b> Sayısal Loto için <i>6 tane birbirinden farklı 1 ile 49 arasında sıralı sayı</i> üretmekten sorumlu bir modül olarak tasarlanmıştır. <b><i>Lottery modülü</i></b> rastgele sayı üretmekten sorumlu olan <b><i>Random Modülünü</i></b> kullanıyor. Bu durumu <b>module-info.java</b> dosyasında <b>requires</b> anahtar kelime ile ifade ediyoruz: </span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<b style="font-family: "trebuchet ms", sans-serif;"><u>module-info.java:</u></b><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.random.service.RandomNumberService</span><span style="color: #333333;">;</span>
module com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">lottery</span> <span style="color: #333333;">{</span>
requires com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">random</span><span style="color: #333333;">;</span>
exports com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">lottery</span><span style="color: #333333;">.</span><span style="color: #0000cc;">service</span><span style="color: #333333;">;</span>
uses RandomNumberService<span style="color: #333333;">;</span>
provides com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">lottery</span><span style="color: #333333;">.</span><span style="color: #0000cc;">service</span><span style="color: #333333;">.</span><span style="color: #0000cc;">LotteryService</span> with com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">lottery</span><span style="color: #333333;">.</span><span style="color: #0000cc;">service</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">.</span><span style="color: #0000cc;">SimpleLotteryService</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "trebuchet ms" , sans-serif;"><b><u>LotteryService.java:</u></b></span><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">lottery</span><span style="color: #333333;">.</span><span style="color: #0000cc;">service</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.random.service.RandomNumberService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">LotteryService</span> <span style="color: #333333;">{</span>
List<span style="color: #333333;"><</span>Integer<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">draw</span><span style="color: #333333;">();</span>
List<span style="color: #333333;"><</span>List<span style="color: #333333;"><</span>Integer<span style="color: #333333;">>></span> <span style="color: #0066bb; font-weight: bold;">draw</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> n<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setRandomNumberService</span><span style="color: #333333;">(</span>RandomNumberService randomNumberService<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<br />
<b><u><span style="font-family: "trebuchet ms" , sans-serif;">SimpleLotteryService.java:</span></u></b><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">lottery</span><span style="color: #333333;">.</span><span style="color: #0000cc;">service</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.Collectors</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.IntStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.lottery.service.LotteryService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.random.service.RandomNumberService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">SimpleLotteryService</span> <span style="color: #008800; font-weight: bold;">implements</span> LotteryService <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> RandomNumberService randomNumberService<span style="color: #333333;">;</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setRandomNumberService</span><span style="color: #333333;">(</span>RandomNumberService randomNumberService<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">randomNumberService</span> <span style="color: #333333;">=</span> randomNumberService<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> List<span style="color: #333333;"><</span>Integer<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">draw</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> IntStream<span style="color: #333333;">.</span><span style="color: #0000cc;">generate</span><span style="color: #333333;">(()</span> <span style="color: #333333;">-></span> randomNumberService<span style="color: #333333;">.</span><span style="color: #0000cc;">generate</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">50</span><span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">distinct</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">limit</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">6</span><span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">sorted</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">boxed</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">toList</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> List<span style="color: #333333;"><</span>List<span style="color: #333333;"><</span>Integer<span style="color: #333333;">>></span> <span style="color: #0066bb; font-weight: bold;">draw</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> n<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> IntStream<span style="color: #333333;">.</span><span style="color: #0000cc;">range</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> n<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">mapToObj</span><span style="color: #333333;">(</span>i <span style="color: #333333;">-></span> <span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">draw</span><span style="color: #333333;">())</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">toList</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<h3>
<span style="font-family: "trebuchet ms" , sans-serif;">Application Module</span></h3>
<span style="font-family: "trebuchet ms" , sans-serif;">Uygulama modülü hem Lottery modülüne hem de Random Modülüne bağımlılığı bulunuyor. Bu durumu <b>module-info.java</b> dosyasında <b>requires</b> anahtar kelimesi ile tanımlıyoruz. Uygulamamız ayrıca bu modüllerdeki <b>LotteryService</b> ve <b>RandomNumberService</b> arayüzlerini gerçekleyen <i><b>servis sınıflarını</b></i> kullanacağını ise <b>uses</b> anahtar kelimesi ile tanımlıyoruz: </span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<b style="font-family: "trebuchet ms", sans-serif;"><u>module-info.java:</u></b><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.lottery.service.LotteryService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.random.service.RandomNumberService</span><span style="color: #333333;">;</span>
module com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">lottery</span><span style="color: #333333;">.</span><span style="color: #0000cc;">app</span> <span style="color: #333333;">{</span>
requires com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">lottery</span><span style="color: #333333;">;</span>
requires com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">random</span><span style="color: #333333;">;</span>
uses LotteryService<span style="color: #333333;">;</span>
uses RandomNumberService<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<b style="font-family: "Trebuchet MS", sans-serif;"><u>application.properties:</u></b><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">random.number.service.level<span style="color: #333333;">=</span>SECURE
</pre>
</div>
<br />
<span style="font-family: "trebuchet ms" , sans-serif;"><b><u>LotteryApp.java:</u></b></span><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">app</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.File</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileInputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileNotFoundException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.IOException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.Properties</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.ServiceLoader</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.function.Consumer</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.lottery.service.LotteryService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.random.service.Quality</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.random.service.QualityLevel</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.random.service.RandomNumberService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">LotteryApp</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> FileNotFoundException<span style="color: #333333;">,</span> IOException <span style="color: #333333;">{</span>
Properties props <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> Properties<span style="color: #333333;">();</span>
props<span style="color: #333333;">.</span><span style="color: #0000cc;">load</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> FileInputStream<span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"src"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"application.properties"</span><span style="color: #333333;">)));</span>
QualityLevel level <span style="color: #333333;">=</span> QualityLevel<span style="color: #333333;">.</span><span style="color: #0000cc;">valueOf</span><span style="color: #333333;">(</span>props<span style="color: #333333;">.</span><span style="color: #0000cc;">getProperty</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"random.number.service.level"</span><span style="color: #333333;">));</span>
LotteryService sls <span style="color: #333333;">=</span> ServiceLoader<span style="color: #333333;">.</span><span style="color: #0000cc;">load</span><span style="color: #333333;">(</span>LotteryService<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">).</span><span style="color: #0000cc;">findFirst</span><span style="color: #333333;">().</span><span style="color: #0000cc;">get</span><span style="color: #333333;">();</span>
sls<span style="color: #333333;">.</span><span style="color: #0000cc;">setRandomNumberService</span><span style="color: #333333;">(</span>extractService<span style="color: #333333;">(</span>level<span style="color: #333333;">));</span>
Consumer<span style="color: #333333;"><</span>List<span style="color: #333333;"><</span>Integer<span style="color: #333333;">>></span> println <span style="color: #333333;">=</span> System<span style="color: #333333;">.</span><span style="color: #0000cc;">err</span><span style="color: #333333;">::</span>println<span style="color: #333333;">;</span>
sls<span style="color: #333333;">.</span><span style="color: #0000cc;">draw</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">10</span><span style="color: #333333;">).</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>println<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> RandomNumberService <span style="color: #0066bb; font-weight: bold;">extractService</span><span style="color: #333333;">(</span>QualityLevel level<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
ServiceLoader<span style="color: #333333;"><</span>RandomNumberService<span style="color: #333333;">></span> loader <span style="color: #333333;">=</span> ServiceLoader<span style="color: #333333;">.</span><span style="color: #0000cc;">load</span><span style="color: #333333;">(</span>RandomNumberService<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">);</span>
RandomNumberService randomNumberService <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">null</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span>RandomNumberService rns <span style="color: #333333;">:</span> loader<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
Class<span style="color: #333333;"><?></span> clazz <span style="color: #333333;">=</span> rns<span style="color: #333333;">.</span><span style="color: #0000cc;">getClass</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">if</span><span style="color: #333333;">(</span>clazz<span style="color: #333333;">.</span><span style="color: #0000cc;">isAnnotationPresent</span><span style="color: #333333;">(</span>Quality<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">))</span> <span style="color: #333333;">{</span>
Quality quality <span style="color: #333333;">=</span> clazz<span style="color: #333333;">.</span><span style="color: #0000cc;">getAnnotation</span><span style="color: #333333;">(</span>Quality<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>quality<span style="color: #333333;">.</span><span style="color: #0000cc;">value</span><span style="color: #333333;">()</span> <span style="color: #333333;">==</span> level<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
randomNumberService <span style="color: #333333;">=</span> rns<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">break</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">return</span> randomNumberService<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "trebuchet ms" , sans-serif;">Örnek uygulamaya <a href="https://github.com/deepcloudlabs/modular-programming-example-java9">https://github.com/deepcloudlabs/modular-programming-example-java9</a> adresinden erişebilirsiniz.</span>Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-61492490299164017082020-04-11T17:47:00.000+03:002020-04-11T18:04:46.787+03:00Java 14'de instanceof Kullanımı<span style="font-family: "verdana" , sans-serif;">Çok şekillilik, Nesneye Dayalı Programlamanın en önemli mekanizmasıdır. Aşağıdaki örnekte çok şekilli bir yapı oluşturulmuştur:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">A</span> <span style="color: #333333;">{</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">B</span> <span style="color: #008800; font-weight: bold;">extends</span> A <span style="color: #333333;">{</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">C</span> <span style="color: #008800; font-weight: bold;">extends</span> A <span style="color: #008800; font-weight: bold;">implements</span> X <span style="color: #333333;">{</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">D</span> <span style="color: #008800; font-weight: bold;">extends</span> B <span style="color: #008800; font-weight: bold;">implements</span> Z <span style="color: #333333;">{</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">X</span> <span style="color: #333333;">{}</span>
<span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">Y</span> <span style="color: #333333;">{}</span>
<span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">Z</span> <span style="color: #008800; font-weight: bold;">extends</span> X<span style="color: #333333;">,</span>Y <span style="color: #333333;">{}</span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;">Bu oluşturulan yapıyı UML sınıf diyagramında aşağıdaki şekilde gösterebiliriz:</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ4es_k7Idwe-nS3ltCAXUTsosXJ59wRUrLSr0Y7zFOZzax6jHIjwmpzqnXt9lAabIUyPXh8ts8w7SJH8_26RyIEWVFHGub7GG4qX-3bUwdyMcdr6psC4y81bV8w8h-NxOydlSNGeOx4y6/s1600/java14-figure01-uml.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="307" data-original-width="439" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ4es_k7Idwe-nS3ltCAXUTsosXJ59wRUrLSr0Y7zFOZzax6jHIjwmpzqnXt9lAabIUyPXh8ts8w7SJH8_26RyIEWVFHGub7GG4qX-3bUwdyMcdr6psC4y81bV8w8h-NxOydlSNGeOx4y6/s1600/java14-figure01-uml.png" /></a></div>
<span style="font-family: "verdana" , sans-serif;">Şimdi bu yapıyı kullanarak bir kaç nesne yaratalım ve bu nesneleri kullanmak üzere referans değişkenler tanımlayalım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">A a1 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> A<span style="color: #333333;">();</span>
A a2 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> B<span style="color: #333333;">();</span>
A a3 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> C<span style="color: #333333;">();</span>
A a4 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> D<span style="color: #333333;">();</span>
B b1 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> B<span style="color: #333333;">();</span>
B b2 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> D<span style="color: #333333;">();</span>
C c <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> C<span style="color: #333333;">();</span>
D d <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> D<span style="color: #333333;">();</span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;">Çok şekilliliğin kuralları gereğince</span><br />
<ul>
<li><span style="font-family: "verdana" , sans-serif;"><b>A</b> tipinden bir referans <b>A</b>, <b>B</b>, <b>C</b> ve <b>D</b> tiplerinden nesnelere referans edebilir. </span></li>
<li><span style="font-family: "verdana" , sans-serif;"><b>B</b> tipinden bir referans <b>B</b> ve <b>D</b> tiplerinden nesnelere referans edebilir.</span></li>
<li><span style="font-family: "verdana" , sans-serif;"><b>C</b> tipinden bir referans ancak <b>C</b> tipinden bir nesneye referans edebilir. </span></li>
<li><span style="font-family: "verdana" , sans-serif;"><b>D</b> tipinden bir referans ancak <b>D</b> tipinden bir nesneye referans edebilir.</span></li>
</ul>
<span style="font-family: "verdana" , sans-serif;">Çok şekillilik çalışma zamanı ile ilgili bir mekanizmadır. Dolayısı ile referanslar arasında atama yaparken derleyici herhangi bir statik kontrol yapmaz, yapamaz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">A a1 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> A<span style="color: #333333;">();</span>
A a2 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> B<span style="color: #333333;">();</span>
A a3 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> C<span style="color: #333333;">();</span>
A a4 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> D<span style="color: #333333;">();</span>
D d1<span style="color: #333333;">=</span> <span style="color: #333333;">(</span>D<span style="color: #333333;">)</span> a1<span style="color: #333333;">;</span>
D d2<span style="color: #333333;">=</span> <span style="color: #333333;">(</span>D<span style="color: #333333;">)</span> a2<span style="color: #333333;">;</span>
D d3<span style="color: #333333;">=</span> <span style="color: #333333;">(</span>D<span style="color: #333333;">)</span> a3<span style="color: #333333;">;</span>
D d4<span style="color: #333333;">=</span> <span style="color: #333333;">(</span>D<span style="color: #333333;">)</span> a4<span style="color: #333333;">;</span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;">Yukarıdaki örnekte aslında derleyici statik bir analiz yapmış olsaydı <b>d1</b>, <b>d2</b> ve <b>d3</b> değişkenlerine olan atamaların çalışma zamanında <b>ClassCastException</b> fırlatacağını ve sorunlu olduğu uyarısında bulunabilirdi. Ancak derleyici bu analizi yapmaz çünkü gerçekte nesnenin tipi çalışma zamanında bir veri tabanı sorgusu, kullanıcı seçimi ya da web servisi çağrısı gibi işlemlerin sonucunda dinamik olarak belirlenir. Yürütme zamanında, derleyicinin ürettiği kod, atama işlemlerinin uygun olup olmadığını, tip dönüşümünün geçerliliğini sınar ve dönüşüm uyumlu tipler arasında değilse <b>ClassCastException</b> fırlatır. <b>ClassCastException</b> bir <b>RuntimeException</b> sınıfıdır ve fırlatıldığında uygulamanın sonlanmasına neden olur. Bu tür bir hatadan kaçınmak için atamanın öncesinde tip dönüşümünün güvenli olup olmadığının testini yapmak uygun olur. Bu amaçla <b>instanceof</b> operatöründen yararlanılır:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">D d1 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">null</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">if</span><span style="color: #333333;">(</span>a1 <span style="color: #008800; font-weight: bold;">instanceof</span> D<span style="color: #333333;">)</span>
d1 <span style="color: #333333;">=</span> <span style="color: #333333;">(</span>D<span style="color: #333333;">)</span> a1<span style="color: #333333;">;</span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;"><b>Java 14</b> yukarıdaki kod ile yapılmak istenen işlemi daha yalın bir şekilde ifade etmemize olanak sağlıyor: </span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">if</span><span style="color: #333333;">(</span>a1 <span style="color: #008800; font-weight: bold;">instanceof</span> D d1<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;">Burada referans değişkeni kullanarak daha karmaşık koşullar oluşturulabilinir:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">if</span><span style="color: #333333;">(</span>a1 <span style="color: #008800; font-weight: bold;">instanceof</span> D d1 <span style="color: #333333;">&&</span> Objects<span style="color: #333333;">.</span><span style="color: #0000cc;">nonNull</span><span style="color: #333333;">(</span>d1<span style="color: #333333;">)</span> <span style="color: #333333;">&&</span> d1 <span style="color: #008800; font-weight: bold;">instanceof</span> X<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;">Şimdi <b>instanceof</b> operatörünün bir başka kullanımını görelim:</span><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Customer</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> String identity<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String fullname<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String email<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String phone<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Customer</span><span style="color: #333333;">(</span>String identity<span style="color: #333333;">,</span> String fullname<span style="color: #333333;">,</span> String email<span style="color: #333333;">,</span> String phone<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">identity</span> <span style="color: #333333;">=</span> identity<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">fullname</span> <span style="color: #333333;">=</span> fullname<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">email</span> <span style="color: #333333;">=</span> email<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">phone</span> <span style="color: #333333;">=</span> phone<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">equals</span><span style="color: #333333;">(</span>Object o<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>o <span style="color: #333333;">==</span> <span style="color: #008800; font-weight: bold;">null</span><span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">false</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">if</span><span style="color: #333333;">(</span>o <span style="color: #008800; font-weight: bold;">instanceof</span> Customer<span style="color: #333333;">){</span>
Customer cust <span style="color: #333333;">=</span> <span style="color: #333333;">(</span>Customer<span style="color: #333333;">)</span> o<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(!</span>cust<span style="color: #333333;">.</span><span style="color: #0000cc;">identity</span><span style="color: #333333;">.</span><span style="color: #0000cc;">equals</span><span style="color: #333333;">(</span>identity<span style="color: #333333;">))</span> <span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">false</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(!</span>cust<span style="color: #333333;">.</span><span style="color: #0000cc;">fullname</span><span style="color: #333333;">.</span><span style="color: #0000cc;">equals</span><span style="color: #333333;">(</span>fullname<span style="color: #333333;">))</span> <span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">false</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(!</span>cust<span style="color: #333333;">.</span><span style="color: #0000cc;">email</span><span style="color: #333333;">.</span><span style="color: #0000cc;">equals</span><span style="color: #333333;">(</span>email<span style="color: #333333;">))</span> <span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">false</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(!</span>cust<span style="color: #333333;">.</span><span style="color: #0000cc;">phone</span><span style="color: #333333;">.</span><span style="color: #0000cc;">equals</span><span style="color: #333333;">(</span>phone<span style="color: #333333;">))</span> <span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">false</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span></pre>
<pre style="line-height: 125%; margin: 0;"><pre style="line-height: 16.25px;"><span style="color: #008800; font-weight: bold;"> return</span> <span style="color: #008800; font-weight: bold;">true</span><span style="color: #333333;">;</span></pre>
<span style="color: #333333;"> }</span>
<span style="color: #333333;">.</span>
<span style="color: #333333;">.</span>
<span style="color: #333333;">.</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;"><b>Customer</b> sınıfı içindeki <b><i>equals()</i></b> metodunu <b>instanceof</b> operatörünü kullanarak yeniden tanımlayalım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Customer</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> String identity<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String fullname<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String email<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String phone<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Customer</span><span style="color: #333333;">(</span>String identity<span style="color: #333333;">,</span> String fullname<span style="color: #333333;">,</span> String email<span style="color: #333333;">,</span> String phone<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">identity</span> <span style="color: #333333;">=</span> identity<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">fullname</span> <span style="color: #333333;">=</span> fullname<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">email</span> <span style="color: #333333;">=</span> email<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">phone</span> <span style="color: #333333;">=</span> phone<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">equals</span><span style="color: #333333;">(</span>Object o<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> o <span style="color: #008800; font-weight: bold;">instanceof</span> Customer cust <span style="color: #333333;">&&</span> Objects<span style="color: #333333;">.</span><span style="color: #0000cc;">nonNull</span><span style="color: #333333;">(</span>cust<span style="color: #333333;">)</span>
<span style="color: #333333;">&&</span> cust<span style="color: #333333;">.</span><span style="color: #0000cc;">identity</span><span style="color: #333333;">.</span><span style="color: #0000cc;">equals</span><span style="color: #333333;">(</span>identity<span style="color: #333333;">)</span>
<span style="color: #333333;">&&</span> cust<span style="color: #333333;">.</span><span style="color: #0000cc;">fullname</span><span style="color: #333333;">.</span><span style="color: #0000cc;">equals</span><span style="color: #333333;">(</span>fullname<span style="color: #333333;">)</span>
<span style="color: #333333;">&&</span> cust<span style="color: #333333;">.</span><span style="color: #0000cc;">email</span><span style="color: #333333;">.</span><span style="color: #0000cc;">equals</span><span style="color: #333333;">(</span>email<span style="color: #333333;">)</span>
<span style="color: #333333;">&&</span> cust<span style="color: #333333;">.</span><span style="color: #0000cc;">phone</span><span style="color: #333333;">.</span><span style="color: #0000cc;">equals</span><span style="color: #333333;">(</span>phone<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">.</span>
<span style="color: #333333;">.</span>
<span style="color: #333333;">.</span>
<span style="color: #333333;">}</span>
</pre>
</div>
Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-76848763527247086282020-04-10T18:46:00.000+03:002020-04-11T15:08:49.781+03:00Java 14'de Record Kullanımı<span style="font-family: "verdana" , sans-serif;"><b>Java 14</b>'de gelen yeniliklerden biri <b>Record</b> yapısıdır. <b>Record</b> özünde bir sınıf tanımlamaktadır. Dolayısı ile <b>record</b> tipinden bir nesne yaratabilirsiniz. Ama bu nesnenin durumu değiştirilemez! Bu Java'da yabancısı olmadığımız bir durum. <b>String</b> sınıfı, basit tiplere karşı düşen sınıflarımız (örneğin <b>Integer</b>, <b>Character</b>, <b>Double</b> gibi), <b>BigInteger</b>, <b>BigDecimal</b> sınıflarının hepsi bu türden durumu değiştirilemez (=immutable) nesneler yaratabildiğimiz sınıflardır.</span><br />
<span style="font-family: "verdana" , sans-serif;"><span style="font-family: "verdana" , sans-serif;"><br />
</span> <span style="font-family: "verdana" , sans-serif;"><b>IntelliJ IDEA 2020.1</b>'de yeni bir programlama elemanı yaratmak istediğimizde listede artık <b>Record</b>'da <i>ön izleme kullanımında</i> bir özellik olarak yerini alıyor:</span></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivuYvLkaZgm_2HeRALKlCsLWOwWCehNmSQKFs12x8saEwWHzq3qIcBWFA_pgG2XxCJroNQd-qVAdy2dHnV0lOouKPMGSFDluN_f0bR-cy6qBf-mqDSr-D2GpELlQY-VHpuD-GYCWKaMvJ-/s1600/record-preview-java14.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="218" data-original-width="359" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivuYvLkaZgm_2HeRALKlCsLWOwWCehNmSQKFs12x8saEwWHzq3qIcBWFA_pgG2XxCJroNQd-qVAdy2dHnV0lOouKPMGSFDluN_f0bR-cy6qBf-mqDSr-D2GpELlQY-VHpuD-GYCWKaMvJ-/s1600/record-preview-java14.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-family: "verdana" , sans-serif; font-size: small;"><b>Java 14'de yeni gelen Ön İzlemede bir özellik olarak Record.</b></span></td></tr>
</tbody></table>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">
package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.awt.*</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> record <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span> x<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> y<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> z<span style="color: #333333;">,</span>
Color color<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">implements</span> Comparable<span style="color: #333333;"><</span>Point3D<span style="color: #333333;">>,</span> Translateable<span style="color: #333333;"><</span>Point3D<span style="color: #333333;">></span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> Point3D ORIGIN <span style="color: #333333;">=</span> Point3D<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> Color<span style="color: #333333;">.</span><span style="color: #0000cc;">BLACK</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> Point3D <span style="color: #0066bb; font-weight: bold;">of</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span> x<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> y<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> z<span style="color: #333333;">,</span> Color color<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">(</span>x<span style="color: #333333;">,</span> y<span style="color: #333333;">,</span> z<span style="color: #333333;">,</span> color<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">double</span> <span style="color: #0066bb; font-weight: bold;">l2Distance</span><span style="color: #333333;">(</span>Point3D p1<span style="color: #333333;">,</span> Point3D p2<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> Math<span style="color: #333333;">.</span><span style="color: #0000cc;">sqrt</span><span style="color: #333333;">(</span>Math<span style="color: #333333;">.</span><span style="color: #0000cc;">pow</span><span style="color: #333333;">(</span>p1<span style="color: #333333;">.</span><span style="color: #0000cc;">x</span> <span style="color: #333333;">-</span> p2<span style="color: #333333;">.</span><span style="color: #0000cc;">y</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">.)</span> <span style="color: #333333;">+</span>
Math<span style="color: #333333;">.</span><span style="color: #0000cc;">pow</span><span style="color: #333333;">(</span>p1<span style="color: #333333;">.</span><span style="color: #0000cc;">y</span> <span style="color: #333333;">-</span> p2<span style="color: #333333;">.</span><span style="color: #0000cc;">y</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">.)</span> <span style="color: #333333;">+</span>
Math<span style="color: #333333;">.</span><span style="color: #0000cc;">pow</span><span style="color: #333333;">(</span>p1<span style="color: #333333;">.</span><span style="color: #0000cc;">z</span> <span style="color: #333333;">-</span> p2<span style="color: #333333;">.</span><span style="color: #0000cc;">z</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">.));</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">double</span> <span style="color: #0066bb; font-weight: bold;">l2Distance</span><span style="color: #333333;">(</span>Point3D other<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0066bb; font-weight: bold;">l2Distance</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">,</span> other<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">double</span> <span style="color: #0066bb; font-weight: bold;">l2Distance</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0066bb; font-weight: bold;">l2Distance</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">,</span> ORIGIN<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">compareTo</span><span style="color: #333333;">(</span>Point3D other<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> Double<span style="color: #333333;">.</span><span style="color: #0000cc;">compare</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">l2Distance</span><span style="color: #333333;">(),</span> other<span style="color: #333333;">.</span><span style="color: #0000cc;">l2Distance</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> Point3D <span style="color: #0066bb; font-weight: bold;">move</span><span style="color: #333333;">(</span>Point3D t<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> Point3D<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">x</span> <span style="color: #333333;">+</span> t<span style="color: #333333;">.</span><span style="color: #0000cc;">x</span><span style="color: #333333;">,</span> <span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">y</span> <span style="color: #333333;">+</span> t<span style="color: #333333;">.</span><span style="color: #0000cc;">y</span><span style="color: #333333;">,</span> <span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">z</span> <span style="color: #333333;">+</span> t<span style="color: #333333;">.</span><span style="color: #0000cc;">z</span><span style="color: #333333;">,</span> <span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">color</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">Translateable</span><span style="color: #333333;"><</span>T<span style="color: #333333;">></span> <span style="color: #333333;">{</span>
T <span style="color: #0066bb; font-weight: bold;">move</span><span style="color: #333333;">(</span>T t<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;">Yukarıda <b>Point3D</b> isimli bir <b>record</b> tanımlanmış olduk. <b>record</b>, <b><i>final</i></b> sınıf özelliğindedir. Dolayısı ile <b>record</b> kullanarak yeni bir sınıf türetemezsiniz. <b>record</b> tanıtımı bir kurucu fonksiyon tanımı içerir. Bu kurucu fonksiyonun parametreleri aynı zamanda öznitelikleri tanımlar ve ilklendirir. Bu öz nitelikler de <b><i>final</i></b> tanımlıdır. Onları da nesne yaratıldıktan sonra değerlerini değiştiremezsiniz. Ayrıca record içinde kurucuda verilen parametrelerin belirlediği öz nitelikler dışında başka bir öz nitelik tanımlayamazsınız! Bu üyeler final bile olsa bunu yapamazsınız! Öz niteliklerin değerini dönecek metotlar otomatik olarak üretiliyor. Ancak bu metotların isimlendirilmesinde Java Beans isimlendirme kuralından farklı olarak doğrudan öz niteliğin adı kullanılır: <b>x()</b>, <b>y()</b>, <b>z()</b> ve <b>color()</b>. Ayrıca <b>Object</b> sınıfından gelen <b><i>equals</i></b>, <i><b>hashCode</b></i> ve <b><i>toString</i></b> metotlarına özel olarak bu yapı için özel işlev yüklenmiştir. Bu işlevleri aşağıdaki örnek uygulama üzerinden görmeye ve anlamaya çalışalım:</span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.awt.*</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">StudyRecord</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
var p1 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> Point3D<span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">,</span> Color<span style="color: #333333;">.</span><span style="color: #0000cc;">BLUE</span><span style="color: #333333;">);</span>
var p2 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> Point3D<span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">,</span> Color<span style="color: #333333;">.</span><span style="color: #0000cc;">GREEN</span><span style="color: #333333;">);</span>
var p3 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> Point3D<span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">,</span> Color<span style="color: #333333;">.</span><span style="color: #0000cc;">BLUE</span><span style="color: #333333;">);</span>
var points <span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span>p1<span style="color: #333333;">,</span> p2<span style="color: #333333;">,</span> p3<span style="color: #333333;">);</span>
points<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>p <span style="color: #333333;">-></span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>p<span style="color: #333333;">.</span><span style="color: #0000cc;">x</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>p<span style="color: #333333;">.</span><span style="color: #0000cc;">y</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>p<span style="color: #333333;">.</span><span style="color: #0000cc;">z</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>p<span style="color: #333333;">.</span><span style="color: #0000cc;">color</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>p<span style="color: #333333;">.</span><span style="color: #0000cc;">toString</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>p<span style="color: #333333;">.</span><span style="color: #0000cc;">hashCode</span><span style="color: #333333;">());</span>
<span style="color: #333333;">});</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>p1<span style="color: #333333;">.</span><span style="color: #0000cc;">equals</span><span style="color: #333333;">(</span>p2<span style="color: #333333;">));</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>p1<span style="color: #333333;">.</span><span style="color: #0000cc;">equals</span><span style="color: #333333;">(</span>p3<span style="color: #333333;">));</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>p2<span style="color: #333333;">.</span><span style="color: #0000cc;">equals</span><span style="color: #333333;">(</span>p3<span style="color: #333333;">));</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;">Yukarıdaki uygulama çalıştırıldığında aşağıdaki çıktıyı üretecektir:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">1.0</span>
<span style="color: #888888;">2.0</span>
<span style="color: #888888;">3.0</span>
<span style="color: #888888;">java.awt.Color[r=0,g=0,b=255]</span>
<span style="color: #888888;">Point3D[x=1.0, y=2.0, z=3.0, color=java.awt.Color[r=0,g=0,b=255]]</span>
<span style="color: #888888;">2047344895</span>
<span style="color: #888888;">1.0</span>
<span style="color: #888888;">2.0</span>
<span style="color: #888888;">3.0</span>
<span style="color: #888888;">java.awt.Color[r=0,g=255,b=0]</span>
<span style="color: #888888;">Point3D[x=1.0, y=2.0, z=3.0, color=java.awt.Color[r=0,g=255,b=0]]</span>
<span style="color: #888888;">2047409920</span>
<span style="color: #888888;">1.0</span>
<span style="color: #888888;">2.0</span>
<span style="color: #888888;">3.0</span>
<span style="color: #888888;">java.awt.Color[r=0,g=0,b=255]</span>
<span style="color: #888888;">Point3D[x=1.0, y=2.0, z=3.0, color=java.awt.Color[r=0,g=0,b=255]]</span>
<span style="color: #888888;">2047344895</span>
<span style="color: #888888;">false</span>
<span style="color: #888888;">true</span>
<span style="color: #888888;">false</span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;"><b>record</b>, <b>DDD</b>'deki <b><i>Value Object</i></b>'i gerçeklemek için kullanılabilir. Nesnenin kimliği yoktur ya da nesnenin kimliği tüm öz niteliklerinden oluşur. İki <b>Point3D</b> nesnesinin eşitliği için tüm üyelerinin eşit olmasına bakılır. </span><br />
<span style="font-family: "verdana" , sans-serif;"><br />
</span> <span style="font-family: "verdana" , sans-serif;"><b>record</b> içinde <b>static</b> üye tanıtabilirsiniz. Yukarıdaki <b>Point3D</b> örneğinde olduğu gibi <b>record</b> bir ya da daha fazla arayüzü (örneğimizde <b><i>Comparable</i></b> ve <i><b>Translateable</b></i>) gerçekleyebilir. </span><br />
<span style="font-family: "verdana" , sans-serif;"><br />
</span> <span style="font-family: "verdana" , sans-serif;"><b>record</b> içinde bir sınıf içinde yazabildiğiniz türden sıradan metotlar yazabilirsiniz. Ancak bu metotlar nesnenin durumunuzu doğal olarak değiştiremeyecektir.</span><br />
<span style="font-family: "verdana" , sans-serif;"><br />
</span> <span style="font-family: "verdana" , sans-serif;">Şimdi <b>JDK</b> içinden çıkan <b>javap</b> komutunu kullanarak <b>Point3D</b> sınıfının tüm üyelerine bir göz atalım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">javap <span style="color: #333333;">-</span>classpath <span style="color: #333333;">.</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Point3D</span>
Compiled from <span style="background-color: #fff0f0;">"Point3D.java"</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">final</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">com</span><span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Point3D</span> <span style="color: #008800; font-weight: bold;">extends</span> java<span style="color: #333333;">.</span><span style="color: #0000cc;">lang</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Record</span> <span style="color: #008800; font-weight: bold;">implements</span> java<span style="color: #333333;">.</span><span style="color: #0000cc;">lang</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Comparable</span><span style="color: #333333;"><</span>com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Point3D</span><span style="color: #333333;">>,</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Translateable</span><span style="color: #333333;"><</span>com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Point3D</span><span style="color: #333333;">></span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Point3D</span> ORIGIN<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Point3D</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span><span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span><span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span><span style="color: #333333;">,</span> java<span style="color: #333333;">.</span><span style="color: #0000cc;">awt</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Color</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Point3D</span> <span style="color: #0066bb; font-weight: bold;">of</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span><span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span><span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span><span style="color: #333333;">,</span> java<span style="color: #333333;">.</span><span style="color: #0000cc;">awt</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Color</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">double</span> <span style="color: #0066bb; font-weight: bold;">l2Distance</span><span style="color: #333333;">(</span>com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Point3D</span><span style="color: #333333;">,</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Point3D</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">double</span> <span style="color: #0066bb; font-weight: bold;">l2Distance</span><span style="color: #333333;">(</span>com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Point3D</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">double</span> <span style="color: #0066bb; font-weight: bold;">l2Distance</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">compareTo</span><span style="color: #333333;">(</span>com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Point3D</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">public</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Point3D</span> <span style="color: #0066bb; font-weight: bold;">move</span><span style="color: #333333;">(</span>com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Point3D</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">public</span> java<span style="color: #333333;">.</span><span style="color: #0000cc;">lang</span><span style="color: #333333;">.</span><span style="color: #0000cc;">String</span> <span style="color: #0066bb; font-weight: bold;">toString</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">final</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">hashCode</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">final</span> <span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">equals</span><span style="color: #333333;">(</span>java<span style="color: #333333;">.</span><span style="color: #0000cc;">lang</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Object</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">double</span> <span style="color: #0066bb; font-weight: bold;">x</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">double</span> <span style="color: #0066bb; font-weight: bold;">y</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">double</span> <span style="color: #0066bb; font-weight: bold;">z</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> java<span style="color: #333333;">.</span><span style="color: #0000cc;">awt</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Color</span> <span style="color: #0066bb; font-weight: bold;">color</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">compareTo</span><span style="color: #333333;">(</span>java<span style="color: #333333;">.</span><span style="color: #0000cc;">lang</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Object</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333333;">{};</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;">Komutun ürettiği çıktıdan <b>Point3D</b> sınıfının, <b>Java 14</b> ile gelen <b>java.lang.Record</b> soyut sınıfından türetildiği anlaşılıyor:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> java<span style="color: #333333;">.</span><span style="color: #0000cc;">lang</span><span style="color: #333333;">;</span>
<span style="color: #555555; font-weight: bold;">@jdk.internal.PreviewFeature</span><span style="color: #333333;">(</span>feature<span style="color: #333333;">=</span>jdk<span style="color: #333333;">.</span><span style="color: #0000cc;">internal</span><span style="color: #333333;">.</span><span style="color: #0000cc;">PreviewFeature</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Feature</span><span style="color: #333333;">.</span><span style="color: #0000cc;">RECORDS</span><span style="color: #333333;">,</span> essentialAPI<span style="color: #333333;">=</span><span style="color: #008800; font-weight: bold;">true</span><span style="color: #333333;">)</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">abstract</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Record</span> <span style="color: #333333;">{</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> * Constructor for record classes to call.</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">protected</span> <span style="color: #0066bb; font-weight: bold;">Record</span><span style="color: #333333;">()</span> <span style="color: #333333;">{}</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> * Indicates whether some other object is "equal to" this one. In addition</span>
<span style="color: #888888;"> * to the general contract of {@link Object#equals(Object) Object.equals},</span>
<span style="color: #888888;"> * record classes must further obey the invariant that when</span>
<span style="color: #888888;"> * a record instance is "copied" by passing the result of the record component</span>
<span style="color: #888888;"> * accessor methods to the canonical constructor, as follows:</span>
<span style="color: #888888;"> * <pre></span>
<span style="color: #888888;"> * R copy = new R(r.c1(), r.c2(), ..., r.cn());</span>
<span style="color: #888888;"> * </pre></span>
<span style="color: #888888;"> * then it must be the case that {@code r.equals(copy)}.</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @implSpec</span>
<span style="color: #888888;"> * The implicitly provided implementation returns {@code true} if</span>
<span style="color: #888888;"> * and only if the argument is an instance of the same record type</span>
<span style="color: #888888;"> * as this object, and each component of this record is equal to</span>
<span style="color: #888888;"> * the corresponding component of the argument; otherwise, {@code</span>
<span style="color: #888888;"> * false} is returned. Equality of a component {@code c} is</span>
<span style="color: #888888;"> * determined as follows:</span>
<span style="color: #888888;"> * <ul></span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * <li> If the component is of a reference type, the component is</span>
<span style="color: #888888;"> * considered equal if and only if {@link</span>
<span style="color: #888888;"> * java.util.Objects#equals(Object,Object)</span>
<span style="color: #888888;"> * Objects.equals(this.c(), r.c()} would return {@code true}.</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * <li> If the component is of a primitive type, using the</span>
<span style="color: #888888;"> * corresponding primitive wrapper class {@code PW} (the</span>
<span style="color: #888888;"> * corresponding wrapper class for {@code int} is {@code</span>
<span style="color: #888888;"> * java.lang.Integer}, and so on), the component is considered</span>
<span style="color: #888888;"> * equal if and only if {@code</span>
<span style="color: #888888;"> * PW.valueOf(this.c()).equals(PW.valueOf(r.c()))} would return</span>
<span style="color: #888888;"> * {@code true}.</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * </ul></span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * The implicitly provided implementation conforms to the</span>
<span style="color: #888888;"> * semantics described above; the implementation may or may not</span>
<span style="color: #888888;"> * accomplish this by using calls to the particular methods</span>
<span style="color: #888888;"> * listed.</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @see java.util.Objects#equals(Object,Object)</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @param obj the reference object with which to compare.</span>
<span style="color: #888888;"> * @return {@code true} if this object is equal to the</span>
<span style="color: #888888;"> * argument; {@code false} otherwise.</span>
<span style="color: #888888;"> */</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">abstract</span> <span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">equals</span><span style="color: #333333;">(</span>Object obj<span style="color: #333333;">);</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> * Obeys the general contract of {@link Object#hashCode Object.hashCode}.</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @implSpec</span>
<span style="color: #888888;"> * The implicitly provided implementation returns a hash code value derived</span>
<span style="color: #888888;"> * by combining the hash code value for all the components, according to</span>
<span style="color: #888888;"> * {@link Object#hashCode()} for components whose types are reference types,</span>
<span style="color: #888888;"> * or the primitive wrapper hash code for components whose types are primitive</span>
<span style="color: #888888;"> * types.</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @see Object#hashCode()</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @return a hash code value for this object.</span>
<span style="color: #888888;"> */</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">abstract</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">hashCode</span><span style="color: #333333;">();</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> * Obeys the general contract of {@link Object#toString Object.toString}.</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @implSpec</span>
<span style="color: #888888;"> * The implicitly provided implementation returns a string that is derived</span>
<span style="color: #888888;"> * from the name of the record class and the names and string representations</span>
<span style="color: #888888;"> * of all the components, according to {@link Object#toString()} for components</span>
<span style="color: #888888;"> * whose types are reference types, and the primitive wrapper {@code toString}</span>
<span style="color: #888888;"> * method for components whose types are primitive types.</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @see Object#toString()</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @return a string representation of the object.</span>
<span style="color: #888888;"> */</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">abstract</span> String <span style="color: #0066bb; font-weight: bold;">toString</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;">Dilerseniz <b>record</b> sınıfına istediğiniz kadar kurucu fonksiyon yazabilirsiniz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> record <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span> x<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> y<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> z<span style="color: #333333;">,</span> Color color<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">implements</span> Comparable<span style="color: #333333;"><</span>Point3D<span style="color: #333333;">>,</span> Translateable<span style="color: #333333;"><</span>Point3D<span style="color: #333333;">></span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span> x<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> y<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> z<span style="color: #333333;">,</span> Color color<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">x</span> <span style="color: #333333;">=</span> x<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">y</span> <span style="color: #333333;">=</span> y<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">z</span> <span style="color: #333333;">=</span> z<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">color</span> <span style="color: #333333;">=</span> color<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span> x<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> y<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> z<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> z<span style="color: #333333;">,</span> Color<span style="color: #333333;">.</span><span style="color: #0000cc;">BLACK</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span> x<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> y<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> Color<span style="color: #333333;">.</span><span style="color: #0000cc;">BLACK</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">.</span>
<span style="color: #333333;">.</span>
<span style="color: #333333;">.</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;"><b>Point3D(double x, double y, double z, Color color)</b> kurucusunu eğer parametreleri ilgili üyelere atamak dışında bir denetim yapmayacaksanız yazmanıza gerek bulunmuyor:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> record <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span> x<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> y<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> z<span style="color: #333333;">,</span> Color color<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">implements</span> Comparable<span style="color: #333333;"><</span>Point3D<span style="color: #333333;">>,</span> Translateable<span style="color: #333333;"><</span>Point3D<span style="color: #333333;">></span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span> x<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> y<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> z<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> z<span style="color: #333333;">,</span> Color<span style="color: #333333;">.</span><span style="color: #0000cc;">BLACK</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span> x<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> y<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> Color<span style="color: #333333;">.</span><span style="color: #0000cc;">BLACK</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">.</span>
<span style="color: #333333;">.</span>
<span style="color: #333333;">.</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;">Standart kurucu fonksiyonu, değişmezleri doğrulamak için kod eklemeniz gerektiğinde yeniden tanımlayın:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> record <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span> x<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> y<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> z<span style="color: #333333;">,</span> Color color<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">implements</span> Comparable<span style="color: #333333;"><</span>Point3D<span style="color: #333333;">>,</span> Translateable<span style="color: #333333;"><</span>Point3D<span style="color: #333333;">></span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span> x<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> y<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> z<span style="color: #333333;">,</span> Color color<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">if</span><span style="color: #333333;">(</span>Double<span style="color: #333333;">.</span><span style="color: #0000cc;">isFinite</span><span style="color: #333333;">(</span>x<span style="color: #333333;">)</span> <span style="color: #333333;">&&</span> Double<span style="color: #333333;">.</span><span style="color: #0000cc;">isFinite</span><span style="color: #333333;">(</span>y<span style="color: #333333;">)</span> <span style="color: #333333;">&&</span> Double<span style="color: #333333;">.</span><span style="color: #0000cc;">isFinite</span><span style="color: #333333;">(</span>z<span style="color: #333333;">)){</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">x</span> <span style="color: #333333;">=</span> x<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">y</span> <span style="color: #333333;">=</span> y<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">z</span> <span style="color: #333333;">=</span> z<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">color</span> <span style="color: #333333;">=</span> color<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">return</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">throw</span> <span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">IllegalArgumentException</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Point3D should be finite!"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span> x<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> y<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> z<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> z<span style="color: #333333;">,</span> Color<span style="color: #333333;">.</span><span style="color: #0000cc;">BLACK</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span> x<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> y<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> Color<span style="color: #333333;">.</span><span style="color: #0000cc;">BLACK</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Point3D</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">.</span>
<span style="color: #333333;">.</span>
<span style="color: #333333;">.</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: Verdana, sans-serif;"><b>Java 14</b>'de <b>Record</b> tipini nerede kullanabileceğimize bir bakalım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">var p1 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> Point3D<span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">,</span> Color<span style="color: #333333;">.</span><span style="color: #0000cc;">BLUE</span><span style="color: #333333;">);</span>
var p2 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> Point3D<span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">,</span> Color<span style="color: #333333;">.</span><span style="color: #0000cc;">GREEN</span><span style="color: #333333;">);</span>
var p3 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> Point3D<span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">,</span> Color<span style="color: #333333;">.</span><span style="color: #0000cc;">BLUE</span><span style="color: #333333;">);</span>
var c1 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> Customer<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"1"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"Jack Bauer"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"jack.bauer@example.com"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"555-555-5555"</span><span style="color: #333333;">);</span>
var c2 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> Customer<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"2"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"Kate Austen"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"kate.austen@example.com"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"555-555-5123"</span><span style="color: #333333;">);</span>
var c3 <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> Customer<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"3"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"James Sawyer"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"james.sawyer@example.com"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"555-555-5432"</span><span style="color: #333333;">);</span>
List<span style="color: #333333;"><</span>Record<span style="color: #333333;">></span> records <span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span>p1<span style="color: #333333;">,</span> p2<span style="color: #333333;">,</span> p3<span style="color: #333333;">,</span>c1<span style="color: #333333;">,</span>c2<span style="color: #333333;">,</span>c3<span style="color: #333333;">);</span>
records<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>rec <span style="color: #333333;">-></span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>rec<span style="color: #333333;">.</span><span style="color: #0000cc;">toString</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>rec<span style="color: #333333;">.</span><span style="color: #0000cc;">hashCode</span><span style="color: #333333;">());</span>
<span style="color: #333333;">});</span>
</pre>
</div>
Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com1tag:blogger.com,1999:blog-2756890279096274314.post-57086932478099321802020-04-10T15:27:00.003+03:002020-04-10T15:44:43.716+03:00Java 13+'de Karakter Katarı Bloğu (=Text Blocks) Kullanımı<b style="font-family: verdana, sans-serif;">String</b><span style="font-family: "verdana" , sans-serif;"> sınıfını karakter katarlarını tanımlamak için kullanıyoruz. Bu karakter katarını iki farklı şekilde oluşturabiliriz:</span><br />
<ol>
<li><span style="font-family: "verdana" , sans-serif;"><i>Karakter katarı kodlama zamanında bellidir</i>:</span><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">String fullname <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"Jack Bauer"</span><span style="color: #333333;">;</span></pre>
</div>
</li>
<li><span style="font-family: "verdana" , sans-serif;">Karakter katarı bir hesaplama sonucunda dinamik olarak üretilecektir:</span><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">DynamicString</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
var s <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">""</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span>var i <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">;</span> i <span style="color: #333333;"><</span> <span style="color: #0000dd; font-weight: bold;">1</span>_000_000<span style="color: #333333;">;</span> <span style="color: #333333;">++</span>i<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
s <span style="color: #333333;">+=</span> i<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>s<span style="color: #333333;">.</span><span style="color: #0000cc;">length</span><span style="color: #333333;">());</span>
var sb <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> StringBuilder<span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span>var i <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">;</span> i <span style="color: #333333;"><</span> <span style="color: #0000dd; font-weight: bold;">1</span>_000_000<span style="color: #333333;">;</span> <span style="color: #333333;">++</span>i<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
sb<span style="color: #333333;">.</span><span style="color: #0000cc;">append</span><span style="color: #333333;">(</span>i<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>sb<span style="color: #333333;">.</span><span style="color: #0000cc;">length</span><span style="color: #333333;">());</span>
var ss <span style="color: #333333;">=</span> IntStream<span style="color: #333333;">.</span><span style="color: #0000cc;">range</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">1</span>_000_000<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">boxed</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Object:</span><span style="color: #333333;">:</span>toString<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">joining</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>ss<span style="color: #333333;">.</span><span style="color: #0000cc;">length</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<span style="font-family: "verdana" , sans-serif;">Eğer karakter katarı dinamik olarak üretilecekse onu <b>String</b> yerine <b>StringBuilder</b> ya da <b>Stream</b></span><string><span style="font-family: "verdana" , sans-serif;"> kullanarak üretmek başarım açısından daha doğru olacaktır. Yukarıdaki kod parçasında her üç yapıda (<b>String</b>, <b>StringBuilder</b> ve <b>Stream</b>) aynı sonucu üretecektir. ancak ikinci ve üçüncü yapılar (<b>StringBuilder</b> ve <b>Stream</b>) kısa sürede sonlanacaktır.</span><br />
</string></li>
</ol>
<span style="font-family: "verdana" , sans-serif;">Karakter katarının birden fazla satıra yayıldığı durumlarda ilklendirmeyi bitiştirme (+) operatörü kullanarak kodlamak hataya açık ve can sıkıcı olabilir:</span><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> String SELECT_CUSTOMERS_BY_IDENTITY2 <span style="color: #333333;">=</span>
<span style="background-color: #fff0f0;">"SELECT IDENTITY, FULLNAME, EMAIL, PHONE "</span>
<span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"FROM CUSTOMERS "</span>
<span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"WHERE IDENTITY=?"</span><span style="color: #333333;">;</span>
</pre>
</div>
<span style="font-family: "verdana" , sans-serif;">Java 13 ile birlikte bu şekilde birden fazla satıra yayılan karakter katarlarını """ arasında birden fazla satıra yayılacak şekilde serbest bir şekilde yazabiliyoruz:</span><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">UseTextBlocks1</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> String SELECT_CUSTOMERS_BY_IDENTITY <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"""</span>
<span style="background-color: #fff0f0;"> SELECT IDENTITY, FULLNAME, EMAIL, PHONE</span>
<span style="background-color: #fff0f0;"> FROM CUSTOMERS</span>
<span style="background-color: #fff0f0;"> WHERE IDENTITY=?</span>
<span style="background-color: #fff0f0;"> """</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> String JACK_AS_JSON <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"""</span>
<span style="background-color: #fff0f0;"> {</span>
<span style="background-color: #fff0f0;"> "</span>identity<span style="background-color: #fff0f0;">": "</span><span style="color: #0000dd; font-weight: bold;">12345678910</span><span style="background-color: #fff0f0;">",</span>
<span style="background-color: #fff0f0;"> "</span>fullname<span style="background-color: #fff0f0;">": "</span>jack bauer<span style="background-color: #fff0f0;">",</span>
<span style="background-color: #fff0f0;"> "</span>email<span style="background-color: #fff0f0;">": "</span>jack<span style="color: #333333;">.</span><span style="color: #0000cc;">bauer</span><span style="color: #555555; font-weight: bold;">@ctu.gov</span><span style="background-color: #fff0f0;">",</span>
<span style="background-color: #fff0f0;"> "</span>phone<span style="background-color: #fff0f0;">" : "</span><span style="color: #0000dd; font-weight: bold;">555</span><span style="color: #333333;">-</span><span style="color: #0000dd; font-weight: bold;">555</span><span style="color: #333333;">-</span><span style="color: #0000dd; font-weight: bold;">5555</span><span style="background-color: #fff0f0;">"</span>
<span style="background-color: #fff0f0;"> }</span>
<span style="background-color: #fff0f0;"> """</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> String JACK_AS_XML <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"""</span>
<span style="background-color: #fff0f0;"> <?xml version="</span><span style="color: #6600ee; font-weight: bold;">1.0</span><span style="background-color: #fff0f0;">"?></span>
<span style="background-color: #fff0f0;"> <customers></span>
<span style="background-color: #fff0f0;"> <customer identity="</span><span style="color: #0000dd; font-weight: bold;">12345678910</span><span style="background-color: #fff0f0;">"></span>
<span style="background-color: #fff0f0;"> <fullname>jack bauer</fullname></span>
<span style="background-color: #fff0f0;"> <email>jack.bauer@ctu.gov</email></span>
<span style="background-color: #fff0f0;"> <phone>555-555-5555</phone></span>
<span style="background-color: #fff0f0;"> </customer></span>
<span style="background-color: #fff0f0;"> </customers></span>
<span style="background-color: #fff0f0;"> """</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>SELECT_CUSTOMERS_BY_IDENTITY<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>JACK_AS_JSON<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>JACK_AS_XML<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<span style="font-family: "verdana" , sans-serif;"><br />
</span> <span style="font-family: "verdana" , sans-serif;">Bu uygulama çalıştırıldığında konsolda aşağıdaki gibi bir çıktı oluşacaktır:</span><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">SELECT IDENTITY, FULLNAME, EMAIL, PHONE</span>
<span style="color: #888888;">FROM CUSTOMERS</span>
<span style="color: #888888;">WHERE IDENTITY=?</span>
<span style="color: #888888;">{</span>
<span style="color: #888888;"> "identity": "12345678910",</span>
<span style="color: #888888;"> "fullname": "jack bauer",</span>
<span style="color: #888888;"> "email": "jack.bauer@ctu.gov",</span>
<span style="color: #888888;"> "phone" : "555-555-5555"</span>
<span style="color: #888888;">}</span>
<span style="color: #888888;"><?xml version="1.0"?></span>
<span style="color: #888888;"><customers></span>
<span style="color: #888888;"> <customer identity="12345678910"></span>
<span style="color: #888888;"> <fullname>jack bauer</fullname></span>
<span style="color: #888888;"> <email>jack.bauer@ctu.gov</email></span>
<span style="color: #888888;"> <phone>555-555-5555</phone></span>
<span style="color: #888888;"> </customer></span>
<span style="color: #888888;"></customers></span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;">Birden fazla satıra yayılan bir başka örnek için aşağıdaki kodu inceleyelim:</span><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">javax.script.Invocable</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">javax.script.ScriptEngineManager</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">javax.script.ScriptException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.function.Function</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ScriptingApiExample</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> Function<span style="color: #333333;"><</span>Double<span style="color: #333333;">,</span> Double<span style="color: #333333;">></span> gun <span style="color: #333333;">=</span> x <span style="color: #333333;">-></span> <span style="color: #0000dd; font-weight: bold;">2</span> <span style="color: #333333;">*</span> x<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> ScriptException <span style="color: #333333;">{</span>
var sem <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ScriptEngineManager<span style="color: #333333;">();</span>
var jsEngine <span style="color: #333333;">=</span> sem<span style="color: #333333;">.</span><span style="color: #0000cc;">getEngineByExtension</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"js"</span><span style="color: #333333;">);</span>
jsEngine<span style="color: #333333;">.</span><span style="color: #0000cc;">eval</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"""</span>
<span style="background-color: #fff0f0;"> var apply = function(x) { </span>
<span style="background-color: #fff0f0;"> return 2 * x * x + 3 * x + 7 ; </span>
<span style="background-color: #fff0f0;"> }</span>
<span style="background-color: #fff0f0;"> """</span><span style="color: #333333;">);</span>
Function<span style="color: #333333;"><</span>Double<span style="color: #333333;">,</span> Double<span style="color: #333333;">></span> fun <span style="color: #333333;">=</span> <span style="color: #333333;">((</span>Invocable<span style="color: #333333;">)</span> jsEngine<span style="color: #333333;">).</span><span style="color: #0000cc;">getInterface</span><span style="color: #333333;">(</span>Function<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">);</span>
var numbers <span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">4</span><span style="color: #333333;">.,</span> <span style="color: #0000dd; font-weight: bold;">8</span><span style="color: #333333;">.,</span> <span style="color: #0000dd; font-weight: bold;">15</span><span style="color: #333333;">.,</span> <span style="color: #0000dd; font-weight: bold;">16</span><span style="color: #333333;">.,</span> <span style="color: #0000dd; font-weight: bold;">23</span><span style="color: #333333;">.,</span> <span style="color: #0000dd; font-weight: bold;">42</span><span style="color: #333333;">.);</span>
numbers<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>fun<span style="color: #333333;">).</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
jsEngine<span style="color: #333333;">.</span><span style="color: #0000cc;">eval</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"""</span>
<span style="background-color: #fff0f0;"> var apply = function(x) { </span>
<span style="background-color: #fff0f0;"> return x * x + 2 * x + 1 ; </span>
<span style="background-color: #fff0f0;"> }</span>
<span style="background-color: #fff0f0;"> """</span><span style="color: #333333;">);</span>
numbers<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>fun<span style="color: #333333;">).</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
numbers<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>gun<span style="color: #333333;">).</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<span style="font-family: "verdana" , sans-serif;"><br />
</span> <span style="font-family: "verdana" , sans-serif;">Evet, Java kodunun içinde bir <b>String</b> değişkende <b>JavaScript</b> kodunu saklayabiliriz! Hatta saklamak ile kalmayıp çalıştırabiliriz de! </span><br />
<span style="font-family: "verdana" , sans-serif;"><br />
</span> <span style="font-family: "verdana" , sans-serif;"><b>Java 14</b>'de karakter katarı blokları ile ilgili iki yenilik bulunuyor. İlk yenilik, karakter katarı bloğunun tek bir satır olarak ele alınmasını sağlayan, <b>\</b> karakterinin satır sonunda kullanımıdır:</span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">UseTextBlocks2</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> String SELECT_CUSTOMERS_BY_IDENTITY <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"""</span>
<span style="background-color: #fff0f0;"> SELECT IDENTITY, FULLNAME, EMAIL, PHONE\</span>
<span style="background-color: #fff0f0;"> FROM CUSTOMERS\</span>
<span style="background-color: #fff0f0;"> WHERE IDENTITY=?\</span>
<span style="background-color: #fff0f0;"> """</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> String JACK_AS_JSON <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"""</span>
<span style="background-color: #fff0f0;"> {\</span>
<span style="background-color: #fff0f0;"> "</span>identity<span style="background-color: #fff0f0;">": "</span><span style="color: #0000dd; font-weight: bold;">12345678910</span><span style="background-color: #fff0f0;">",\</span>
<span style="background-color: #fff0f0;"> "</span>fullname<span style="background-color: #fff0f0;">": "</span>jack bauer<span style="background-color: #fff0f0;">",\</span>
<span style="background-color: #fff0f0;"> "</span>email<span style="background-color: #fff0f0;">": "</span>jack<span style="color: #333333;">.</span><span style="color: #0000cc;">bauer</span><span style="color: #555555; font-weight: bold;">@ctu.gov</span><span style="background-color: #fff0f0;">",\</span>
<span style="background-color: #fff0f0;"> "</span>phone<span style="background-color: #fff0f0;">" : "</span><span style="color: #0000dd; font-weight: bold;">555</span><span style="color: #333333;">-</span><span style="color: #0000dd; font-weight: bold;">555</span><span style="color: #333333;">-</span><span style="color: #0000dd; font-weight: bold;">5555</span><span style="background-color: #fff0f0;">"\</span>
<span style="background-color: #fff0f0;"> }\</span>
<span style="background-color: #fff0f0;"> """</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> String JACK_AS_XML <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"""</span>
<span style="background-color: #fff0f0;"> <?xml version="</span><span style="color: #6600ee; font-weight: bold;">1.0</span><span style="background-color: #fff0f0;">"?>\</span>
<span style="background-color: #fff0f0;"> <customers>\</span>
<span style="background-color: #fff0f0;"> <customer identity="</span><span style="color: #0000dd; font-weight: bold;">12345678910</span><span style="background-color: #fff0f0;">">\</span>
<span style="background-color: #fff0f0;"> <fullname>jack bauer</fullname>\</span>
<span style="background-color: #fff0f0;"> <email>jack.bauer@ctu.gov</email>\</span>
<span style="background-color: #fff0f0;"> <phone>555-555-5555</phone>\</span>
<span style="background-color: #fff0f0;"> </customer>\</span>
<span style="background-color: #fff0f0;"> </customers>\</span>
<span style="background-color: #fff0f0;"> """</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>SELECT_CUSTOMERS_BY_IDENTITY<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>JACK_AS_JSON<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>JACK_AS_XML<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<span style="font-family: "verdana" , sans-serif;"><br />
</span> <span style="font-family: "verdana" , sans-serif;">Bu uygulamayı çalıştırdığımızda konsolda aşağıdaki çıktı oluşacaktır:</span><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">SELECT IDENTITY, FULLNAME, EMAIL, PHONEFROM CUSTOMERSWHERE IDENTITY=?</span>
<span style="color: #888888;">{ "identity": "12345678910", "fullname": "jack bauer", "email": "jack.bauer@ctu.gov", "phone" : "555-555-5555"}</span>
<span style="color: #888888;"><?xml version="1.0"?><customers> <customer identity="12345678910"> <fullname>jack bauer</fullname> <email>jack.bauer@ctu.gov</email> <phone>555-555-5555</phone> </customer></customers></span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;">Çıktıdan anlaşıldığı gibi karakter katarı bloğu tek bir satırlık karakter katarı olarak işlem gördü. <b>Java 14</b>'de karakter katarı bloğu ile ilgili gelen ikinci yenilik satır sonundaki <i>görünmeyen karakterlerin</i> (=<i>white space</i>) korunmasına yönelik <b>\s</b> kullanımıdır. <b>\s</b> kullanımına ilişkin aşağıdaki örneği inceleyelim:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">UseTextBlocks3</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> String JACK_AS_JSON1 <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"""</span>
<span style="background-color: #fff0f0;"> {\u0020</span>
<span style="background-color: #fff0f0;"> "</span>identity<span style="background-color: #fff0f0;">": "</span><span style="color: #0000dd; font-weight: bold;">12345678910</span><span style="background-color: #fff0f0;">",\s</span>
<span style="background-color: #fff0f0;"> "</span>fullname<span style="background-color: #fff0f0;">": "</span>jack bauer<span style="background-color: #fff0f0;">",\s</span>
<span style="background-color: #fff0f0;"> "</span>email<span style="background-color: #fff0f0;">": "</span>jack<span style="color: #333333;">.</span><span style="color: #0000cc;">bauer</span><span style="color: #555555; font-weight: bold;">@ctu.gov</span><span style="background-color: #fff0f0;">",\s</span>
<span style="background-color: #fff0f0;"> "</span>phone<span style="background-color: #fff0f0;">" : "</span><span style="color: #0000dd; font-weight: bold;">555</span><span style="color: #333333;">-</span><span style="color: #0000dd; font-weight: bold;">555</span><span style="color: #333333;">-</span><span style="color: #0000dd; font-weight: bold;">5555</span><span style="background-color: #fff0f0;">"\s</span>
<span style="background-color: #fff0f0;"> }\s</span>
<span style="background-color: #fff0f0;"> """</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> String JACK_AS_JSON2 <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"""</span>
<span style="background-color: #fff0f0;"> {\u0020\u0020</span>
<span style="background-color: #fff0f0;"> "</span>identity<span style="background-color: #fff0f0;">": "</span><span style="color: #0000dd; font-weight: bold;">12345678910</span><span style="background-color: #fff0f0;">",\s</span>
<span style="background-color: #fff0f0;"> "</span>fullname<span style="background-color: #fff0f0;">": "</span>jack bauer<span style="background-color: #fff0f0;">",\s</span>
<span style="background-color: #fff0f0;"> "</span>email<span style="background-color: #fff0f0;">": "</span>jack<span style="color: #333333;">.</span><span style="color: #0000cc;">bauer</span><span style="color: #555555; font-weight: bold;">@ctu.gov</span><span style="background-color: #fff0f0;">",\s</span>
<span style="background-color: #fff0f0;"> "</span>phone<span style="background-color: #fff0f0;">" : "</span><span style="color: #0000dd; font-weight: bold;">555</span><span style="color: #333333;">-</span><span style="color: #0000dd; font-weight: bold;">555</span><span style="color: #333333;">-</span><span style="color: #0000dd; font-weight: bold;">5555</span><span style="background-color: #fff0f0;">"\s</span>
<span style="background-color: #fff0f0;"> }\s</span>
<span style="background-color: #fff0f0;"> """</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> String JACK_AS_JSON3 <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"""</span>
<span style="background-color: #fff0f0;"> {\u0020\u0020\u0020\s</span>
<span style="background-color: #fff0f0;"> "</span>identity<span style="background-color: #fff0f0;">": "</span><span style="color: #0000dd; font-weight: bold;">12345678910</span><span style="background-color: #fff0f0;">",\s</span>
<span style="background-color: #fff0f0;"> "</span>fullname<span style="background-color: #fff0f0;">": "</span>jack bauer<span style="background-color: #fff0f0;">",\s</span>
<span style="background-color: #fff0f0;"> "</span>email<span style="background-color: #fff0f0;">": "</span>jack<span style="color: #333333;">.</span><span style="color: #0000cc;">bauer</span><span style="color: #555555; font-weight: bold;">@ctu.gov</span><span style="background-color: #fff0f0;">",\s</span>
<span style="background-color: #fff0f0;"> "</span>phone<span style="background-color: #fff0f0;">" : "</span><span style="color: #0000dd; font-weight: bold;">555</span><span style="color: #333333;">-</span><span style="color: #0000dd; font-weight: bold;">555</span><span style="color: #333333;">-</span><span style="color: #0000dd; font-weight: bold;">5555</span><span style="background-color: #fff0f0;">"\s</span>
<span style="background-color: #fff0f0;"> }\s</span>
<span style="background-color: #fff0f0;"> """</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>JACK_AS_JSON1<span style="color: #333333;">.</span><span style="color: #0000cc;">length</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>JACK_AS_JSON2<span style="color: #333333;">.</span><span style="color: #0000cc;">length</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>JACK_AS_JSON3<span style="color: #333333;">.</span><span style="color: #0000cc;">length</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "verdana" , sans-serif;">Burada <b>"""</b> arasında verilen satırların sonundaki görünmeyen karakter otomatik olarak temizlenirken, satır sonunda <b>\s</b> kullanıldığında görünmeyen karakterler (<i>boşluk</i>, <i>sekme</i> gibi) korunacaktır. Yukarıdaki kodu çalıştırdığımızda ekran görüntüsü aşağıda verildiği şekilde oluşacaktır:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">134</span>
<span style="color: #888888;">134</span>
<span style="color: #888888;">138</span>
</pre>
</div>
<br />
<span style="font-family: Verdana, sans-serif;"><b>\u0020</b> değeri boşluk karakterinin Unicode karşılığıdır. Yukarıdaki ilk iki tanımlamadaki kullanımda satır sonundaki boşluk elendiği için String uzunlukları 134 oldu. Üçüncü tanımlamada ise üç adet boşluk ve sonunda <b>\s</b> kullanıldığı için String uzunluğu 138 oldu.</span>Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-13916478103427276642019-04-21T09:45:00.003+03:002019-04-21T09:45:46.223+03:00Java 12'de switch KullanımıBir değişkenin belirli değerleri için uygulamanın akışını değiştirmek amacıyla switch ifadesinden yararlanıyoruz. switch ifadesi parametre olarak bir değişken alır. Bu değişkenin <b>byte</b>, <b>short</b>, <b>int</b>, <b>char</b>, <b>enum</b> tiplerinden biri olması gerekir. <b>Java 7</b> ile birlikte bu listeye <b>String</b> sınıfı da eklenmiştir. Geleneksel switch kullanımına ilişkin bir örneğini aşağıda bulabilirsiniz:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333399; font-weight: bold;">int</span> weekDay <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">;</span>
String status<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">switch</span><span style="color: #333333;">(</span>weekDay<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">:</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">:</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">:</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">4</span><span style="color: #333333;">:</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">5</span><span style="color: #333333;">:</span> status <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"working"</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">break</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">6</span><span style="color: #333333;">:</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">7</span><span style="color: #333333;">:</span> status <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"resting"</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">break</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">default</span><span style="color: #333333;">:</span> status <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"unknown"</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
Burada <b>int</b> tipinden <b>weekDay</b> değişkeninin <b>1</b> ile <b>7</b> arasındaki değerleri için <b>String</b> tipinden <b>status</b> değişkenine farklı değerler atamak istiyoruz: "<i>working</i>", "<i>resting</i>" ve "<i>unknown</i>". switch'in bu kullanımı ile ilgili iki temel problem bulunuyor:<br />
<ul>
<li><i>switch</i> değişkeninin (<b><i>weekDay</i></b>) bir aralıktaki değerleri için özel bir gösterim bulunmuyor. O nedenle, yukarıda <b><i>weekDay</i></b> değişkeninin [1-5] aralığındaki değerlerini karşılaştırmak üzere aralıktaki her bir değer için <b>case</b> tanımlamak zorunda kaldık. </li>
<li><i><b>switch</b></i> değişkeninin değeri, case ile verilen sabitler ile olan eşitliği sırayla sınanır. Eğitlik olduğunda tüm case ifadeleri eşitliğine bakılmaksızın break ile karşılaşıncaya kadar çalıştırılır. switch yapısında break kullanımı tercihe bağlıdır. Unutulmuş olması ya da yerinde kullanılmaması yanlış bir akışa yol açacaktır ve okumayı güçleştirmektedir.</li>
</ul>
<b>Java 12</b> ile birlikte yukarıdaki problemleri çözmeyi hedefleyen yeni bir dizi switch gösterimi gelmiştir. Bu yazıda bu gösterimlere bakacağız. İlk gösterimde case sabitlerini virgüllerle ayrılmış bir liste olarak tanımlayabiliyoruz:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333399; font-weight: bold;">int</span> weekDay <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">;</span>
String status<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">switch</span><span style="color: #333333;">(</span>weekDay<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">4</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">5</span><span style="color: #333333;">:</span> status <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"working"</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">break</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">6</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">7</span><span style="color: #333333;">:</span> status <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"resting"</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">break</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">default</span><span style="color: #333333;">:</span> status <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"unknown"</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
Bu gösterimde <b>break</b> kullanımına dikkat edilmesi gerekiyor. İkinci gösterimde ise <b>break</b> kullanımına ihtiyaç duymuyoruz:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333399; font-weight: bold;">int</span> weekDay <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">;</span>
String status<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">switch</span> <span style="color: #333333;">(</span>weekDay<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">4</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">5</span> <span style="color: #333333;">-></span> <span style="color: #333333;">{</span>
status <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"working"</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">6</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">7</span> <span style="color: #333333;">-></span> <span style="color: #333333;">{</span>
status <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"resting"</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">default</span> <span style="color: #333333;">-></span> <span style="color: #333333;">{</span>
status <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"unknown"</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
Bu gösterimde lambda ifadesi gösteriminden yararlanıldığını görüyoruz. Eğer amacınız yukarıdaki örneklerde olduğu gibi <b>case</b> değerlerine göre bir değişkenin değerini belirlemek ise bunu daha yalın bir gösterimle yapabilirsiniz:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">var weekDay <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">;</span>
var status <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">switch</span> <span style="color: #333333;">(</span>weekDay<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">4</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">5</span> <span style="color: #333333;">-></span> <span style="background-color: #fff0f0;">"working"</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">6</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">7</span> <span style="color: #333333;">-></span> <span style="background-color: #fff0f0;">"resting"</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">default</span> <span style="color: #333333;">-></span> <span style="background-color: #fff0f0;">"unknown"</span><span style="color: #333333;">;</span>
<span style="color: #333333;">};</span>
</pre>
</div>
<br />
Bu gösterimde <i>lambda ifadesi</i> değişkenin değerini dönüyor. <i>Lambda ifadesinin</i> kullanıldığı yukarıdaki gösterim yerine <b>break</b> ile değeri döndüğümüz gösterimi de kullanabilirsiniz:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">var weekDay <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">;</span>
var status <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">switch</span> <span style="color: #333333;">(</span>weekDay<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">4</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">5</span> <span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">break</span> <span style="background-color: #fff0f0;">"working"</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">6</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">7</span> <span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">break</span> <span style="background-color: #fff0f0;">"resting"</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">default</span> <span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">break</span> <span style="background-color: #fff0f0;">"unknown"</span><span style="color: #333333;">;</span>
<span style="color: #333333;">};</span>
</pre>
</div>
<br />
Yukarıdaki gösterimin bir başka yazılımı aşağıda verilmiştir:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">var weekDay <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">;</span>
var status <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">switch</span> <span style="color: #333333;">(</span>weekDay<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">4</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">5</span> <span style="color: #333333;">-></span> <span style="color: #333333;">{</span> <span style="color: #008800; font-weight: bold;">break</span> <span style="background-color: #fff0f0;">"working"</span><span style="color: #333333;">;</span> <span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">case</span> <span style="color: #0000dd; font-weight: bold;">6</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">7</span> <span style="color: #333333;">-></span> <span style="color: #333333;">{</span> <span style="color: #008800; font-weight: bold;">break</span> <span style="background-color: #fff0f0;">"resting"</span> <span style="color: #333333;">;}</span>
<span style="color: #008800; font-weight: bold;">default</span> <span style="color: #333333;">-></span> <span style="color: #333333;">{</span> <span style="color: #008800; font-weight: bold;">break</span> <span style="background-color: #fff0f0;">"unknown"</span><span style="color: #333333;">;</span> <span style="color: #333333;">}</span>
<span style="color: #333333;">};</span>
</pre>
</div>
<br />
Bu yazıda <b>Java 12</b> ile birlikte gelen yeni <b>switch</b> gösteriminin dört farklı yüzünü inceledik. Lambda ifadesi gösteriminin kullanıldığı switch ifadelerinin daha okunabilir olduğu söylenebilir.Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-55573614528456383682019-04-20T14:15:00.003+03:002019-05-04T20:54:14.998+03:00Java 10+'da var Kullanımı<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFfUo_mxMLw00TNwk8S0YVp0Dwa1PB2TbdSUMZPaNe7P7m6pxJn47GmYJ69dnKjTaj5pH_mDnVkAVFLOAyAd1R7qrFrM8KAi1vEplMuUW_KMRqT5l_znvR-SGCS9yJBDoyjWA_zMTcRiDh/s1600/java-10-var.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="241" data-original-width="938" height="163" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFfUo_mxMLw00TNwk8S0YVp0Dwa1PB2TbdSUMZPaNe7P7m6pxJn47GmYJ69dnKjTaj5pH_mDnVkAVFLOAyAd1R7qrFrM8KAi1vEplMuUW_KMRqT5l_znvR-SGCS9yJBDoyjWA_zMTcRiDh/s640/java-10-var.png" width="640" /></a></div>
<b><br /></b>
<b>Java 7</b> ile birlikte derleyicimiz (<b>javac</b>) daha akıllı ve bize üretkenliğimizi arttıracak kolaylıklar sunuyor. Örnek olarak aşağıdaki gibi bir kodu ele alalım:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">Map<span style="color: #333333;"><</span>String<span style="color: #333333;">,</span>Function<span style="color: #333333;"><</span>List<span style="color: #333333;"><</span>String<span style="color: #333333;">>,</span>String<span style="color: #333333;">>></span> functionLookup <span style="color: #333333;">=</span>
<span style="color: #008800; font-weight: bold;">new</span> HashMap<span style="color: #333333;"><</span>String<span style="color: #333333;">,</span>Function<span style="color: #333333;"><</span>List<span style="color: #333333;"><</span>String<span style="color: #333333;">>,</span>String<span style="color: #333333;">>>();</span>
</pre>
</div>
<br />
<b>functionLookup</b> bir yerel değişken ve tipi <code> Map<String,Function<List<String>,String>> </code> olarak tanımlanmış. Yerel bir değişkeni kullanmadan önce mutlaka ilklendirmelisiniz. Yukarıda bunu new <code> HashMap<String,Function<List<String>,String>>() </code>ataması ile gerçekleştiriyoruz. Ancak kodda soysal (=generic) parametrelerin bolca tekrarı var. <b>Java 7</b> bu tekrarın önüne geçiyor:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">Map<span style="color: #333333;"><</span>String<span style="color: #333333;">,</span>Function<span style="color: #333333;"><</span>List<span style="color: #333333;"><</span>String<span style="color: #333333;">>,</span>String<span style="color: #333333;">>></span> functionLookup <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> HashMap<span style="color: #333333;"><>();</span>
</pre>
</div>
<br />
<b>Java 10</b> ile gelen yeniliklerden sadece bir tanesi dil ile ilgili: <b>var</b>. <b>var</b> yeni bir anahtar kelime değil, yeni bir tip tanımlıyor. Dolayısı ile <b>var</b> kelimesini bir değişken ismi olarak kullanabilirsiniz! <b>var</b> tipini yerel değişkenleri tanımlarken kullanıyoruz:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">var var <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">42</span><span style="color: #333333;">;</span>
</pre>
</div>
<br />
Ama siz yine de <b>var</b> ismini değişken ismi olarak kullanmayın! <b>Java 10</b> ile birlikte yerel değişkene atama yaparak tanımlıyorsanız değişken isminin sol tarafında tipini söylemenize gerek yok. Derleyecimiz az bir çabayla değişkene yaptığınız atamada kullanılan değerin tipinden otomatik olarak tip bilgisini çıkarabiliyor. <b><i>Bunu sadece yerel değişkenler için yapabilirsiniz</i></b> ve <b><i>mutlaka atama yapmanız gerekir</i></b>. Yukarıdaki basit örnekte <b>var</b> değişkeninin tipi <b>int</b> olacaktır.<br />
<br />
Şimdi aşağıdaki gibi kodu inceleyelim:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Exercise</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
Comparator<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> orderByStringLengthDesc <span style="color: #333333;">=</span> <span style="color: #333333;">(</span>x<span style="color: #333333;">,</span> y<span style="color: #333333;">)</span> <span style="color: #333333;">-></span> y<span style="color: #333333;">.</span><span style="color: #0000cc;">length</span><span style="color: #333333;">()</span> <span style="color: #333333;">-</span> x<span style="color: #333333;">.</span><span style="color: #0000cc;">length</span><span style="color: #333333;">();</span>
Comparator<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> orderByStringLengthAsc <span style="color: #333333;">=</span> orderByStringLengthDesc<span style="color: #333333;">.</span><span style="color: #0000cc;">reversed</span><span style="color: #333333;">();</span>
Function<span style="color: #333333;"><</span>List<span style="color: #333333;"><</span>String<span style="color: #333333;">>,</span> Optional<span style="color: #333333;"><</span>String<span style="color: #333333;">>></span> longest <span style="color: #333333;">=</span> list <span style="color: #333333;">-></span> list<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">sorted</span><span style="color: #333333;">(</span>orderByStringLengthDesc<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">findFirst</span><span style="color: #333333;">();</span>
Function<span style="color: #333333;"><</span>List<span style="color: #333333;"><</span>String<span style="color: #333333;">>,</span> Optional<span style="color: #333333;"><</span>String<span style="color: #333333;">>></span> shortest <span style="color: #333333;">=</span> list <span style="color: #333333;">-></span> list<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">sorted</span><span style="color: #333333;">(</span>orderByStringLengthAsc<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">findFirst</span><span style="color: #333333;">();</span>
List<span style="color: #333333;"><</span>Function<span style="color: #333333;"><</span>List<span style="color: #333333;"><</span>String<span style="color: #333333;">>,</span> Optional<span style="color: #333333;"><</span>String<span style="color: #333333;">>>></span> funs <span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span>longest<span style="color: #333333;">,</span> shortest<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> names <span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Jack Shephard"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Kate Austen"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Ben Linus"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"James Ford"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Hugo Reyes"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"John Locke"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Sayid Jarrah"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Richard Alpert"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Desmond Hume"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Daniel Faraday"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Shannon Rutherford"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"Danielle Rousseau"</span><span style="color: #333333;">);</span>
List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> processed <span style="color: #333333;">=</span> funs<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>fr <span style="color: #333333;">-></span> fr<span style="color: #333333;">.</span><span style="color: #0000cc;">apply</span><span style="color: #333333;">(</span>names<span style="color: #333333;">)).</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Optional:</span><span style="color: #333333;">:</span>isPresent<span style="color: #333333;">).</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Optional:</span><span style="color: #333333;">:</span>get<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">toList</span><span style="color: #333333;">());</span>
processed<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
Bu kodda tip tanımının çokça tekrar edilerek yapıldığı yer bulunuyor. Yukarıdaki kodu <b>var</b> kullanarak herhangi bir belirsizliğe yok açmadan yeniden tanımlayabiliriz:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">SmartCompiler</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
Comparator<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> orderByStringLengthDesc <span style="color: #333333;">=</span> <span style="color: #333333;">(</span>x<span style="color: #333333;">,</span> y<span style="color: #333333;">)</span> <span style="color: #333333;">-></span> y<span style="color: #333333;">.</span><span style="color: #0000cc;">length</span><span style="color: #333333;">()</span> <span style="color: #333333;">-</span> x<span style="color: #333333;">.</span><span style="color: #0000cc;">length</span><span style="color: #333333;">();</span>
var orderByStringLengthAsc <span style="color: #333333;">=</span> orderByStringLengthDesc<span style="color: #333333;">.</span><span style="color: #0000cc;">reversed</span><span style="color: #333333;">();</span>
Function<span style="color: #333333;"><</span>List<span style="color: #333333;"><</span>String<span style="color: #333333;">>,</span> Optional<span style="color: #333333;"><</span>String<span style="color: #333333;">>></span> longest <span style="color: #333333;">=</span> list <span style="color: #333333;">-></span> list<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">sorted</span><span style="color: #333333;">(</span>orderByStringLengthDesc<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">findFirst</span><span style="color: #333333;">();</span>
Function<span style="color: #333333;"><</span>List<span style="color: #333333;"><</span>String<span style="color: #333333;">>,</span> Optional<span style="color: #333333;"><</span>String<span style="color: #333333;">>></span> shortest <span style="color: #333333;">=</span> list <span style="color: #333333;">-></span> list<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">sorted</span><span style="color: #333333;">(</span>orderByStringLengthAsc<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">findFirst</span><span style="color: #333333;">();</span>
var funs <span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span>longest<span style="color: #333333;">,</span> shortest<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> var names <span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Jack Shephard"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Kate Austen"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Ben Linus"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"James Ford"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Hugo Reyes"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"John Locke"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"Sayid Jarrah"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Richard Alpert"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Desmond Hume"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Daniel Faraday"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Shannon Rutherford"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"Danielle Rousseau"</span><span style="color: #333333;">);</span>
var processed <span style="color: #333333;">=</span> funs<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>fr <span style="color: #333333;">-></span> fr<span style="color: #333333;">.</span><span style="color: #0000cc;">apply</span><span style="color: #333333;">(</span>names<span style="color: #333333;">)).</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Optional:</span><span style="color: #333333;">:</span>isPresent<span style="color: #333333;">).</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Optional:</span><span style="color: #333333;">:</span>get<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">toList</span><span style="color: #333333;">());</span>
processed<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
Evet, <b>var</b> kullanımı tip tanımlarken yapılan tekrarlardan kurtulmamızı sağladı. Burada var kullanımı ile ilgili dikkat edilmesi gereken birkaç nokta bulunuyor: <b>var</b> ile <b>Lambda</b> ifadesi yazamazsınız. Değişkenin tipini mulaka bir <b>@FunctionalInterface</b> ile ilişkilendirmelisiniz. Yukarıdaki örnekte <b>orderByStringLengthDesc</b> değişkenini <b>var orderByStringLengthDesc = (x, y) -> y.length() - x.length()</b> biçiminde tanımlayamazsınız. Derleyici lambda ifadesinin hangi <b>@FunctionalInterface</b> ile ilişkili olduğunu çıkarsayamaz! Derleyiciden imkansızı istemeyin! Ancak var orderByStringLengthAsc <span style="color: #333333;">=</span> orderByStringLengthDesc<span style="color: #333333;">.</span><span style="color: #0000cc;">reversed</span><span style="color: #333333;">();</span> tanımlamasında bir sorun yok. Çünkü bu kez sağ taraftaki lambda ifadesinin hangi <b>@FunctionalInterface</b> ile ilişkili olduğu belirli: <string></string><b>Comparator<span style="color: #333333;"><</span>String<span style="color: #333333;">></span></b>.<br />
<br />
<b>var</b>'ın kullanılabildiği yerleri özetleyen bir başka örnek daha inceleyelim:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> Optional<span style="color: #333333;"><</span>Country<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">findOne</span><span style="color: #333333;">(</span>String code<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">try</span> <span style="color: #333333;">(</span>Connection connection <span style="color: #333333;">=</span> ds<span style="color: #333333;">.</span><span style="color: #0000cc;">getConnection</span><span style="color: #333333;">();)</span> <span style="color: #333333;">{</span>
PreparedStatement st <span style="color: #333333;">=</span> connection<span style="color: #333333;">.</span><span style="color: #0000cc;">prepareStatement</span><span style="color: #333333;">(</span>SELECT_COUNTRY_BY_CODE<span style="color: #333333;">);</span>
st<span style="color: #333333;">.</span><span style="color: #0000cc;">setString</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> code<span style="color: #333333;">);</span>
ResultSet rs <span style="color: #333333;">=</span> st<span style="color: #333333;">.</span><span style="color: #0000cc;">executeQuery</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>rs<span style="color: #333333;">.</span><span style="color: #0000cc;">next</span><span style="color: #333333;">())</span> <span style="color: #333333;">{</span>
Country country <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> Country<span style="color: #333333;">();</span>
country<span style="color: #333333;">.</span><span style="color: #0000cc;">setCode</span><span style="color: #333333;">(</span>code<span style="color: #333333;">);</span>
country<span style="color: #333333;">.</span><span style="color: #0000cc;">setName</span><span style="color: #333333;">(</span>rs<span style="color: #333333;">.</span><span style="color: #0000cc;">getString</span><span style="color: #333333;">(</span>COLUMN_NAME<span style="color: #333333;">));</span>
country<span style="color: #333333;">.</span><span style="color: #0000cc;">setContinent</span><span style="color: #333333;">(</span>rs<span style="color: #333333;">.</span><span style="color: #0000cc;">getString</span><span style="color: #333333;">(</span>COLUMN_CONTINENT<span style="color: #333333;">));</span>
country<span style="color: #333333;">.</span><span style="color: #0000cc;">setPopulation</span><span style="color: #333333;">(</span>rs<span style="color: #333333;">.</span><span style="color: #0000cc;">getInt</span><span style="color: #333333;">(</span>COLUMN_POPULATION<span style="color: #333333;">));</span>
country<span style="color: #333333;">.</span><span style="color: #0000cc;">setSurfaceArea</span><span style="color: #333333;">(</span>rs<span style="color: #333333;">.</span><span style="color: #0000cc;">getDouble</span><span style="color: #333333;">(</span>COLUMN_SURFACE_AREA<span style="color: #333333;">));</span>
<span style="color: #008800; font-weight: bold;">return</span> Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span>country<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">catch</span> <span style="color: #333333;">(</span>Exception e<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
LOGGER<span style="color: #333333;">.</span><span style="color: #0000cc;">error</span><span style="color: #333333;">(</span>e<span style="color: #333333;">.</span><span style="color: #0000cc;">getMessage</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">return</span> Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">empty</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<b>var</b>'ı blok içinde yerel değişken tanımlarken, Java 7'de <b>try</b> değişkenini tanımlarken ve <b>for</b> döngü değişkenini tanımlarken kullanabiliriz:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> Optional<span style="color: #333333;"><</span>Country<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">findOne</span><span style="color: #333333;">(</span>String code<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">try</span> <span style="color: #333333;">(</span>var connection <span style="color: #333333;">=</span> ds<span style="color: #333333;">.</span><span style="color: #0000cc;">getConnection</span><span style="color: #333333;">();)</span> <span style="color: #333333;">{</span>
var st <span style="color: #333333;">=</span> connection<span style="color: #333333;">.</span><span style="color: #0000cc;">prepareStatement</span><span style="color: #333333;">(</span>SELECT_COUNTRY_BY_CODE<span style="color: #333333;">);</span>
st<span style="color: #333333;">.</span><span style="color: #0000cc;">setString</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> code<span style="color: #333333;">);</span>
var rs <span style="color: #333333;">=</span> st<span style="color: #333333;">.</span><span style="color: #0000cc;">executeQuery</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>rs<span style="color: #333333;">.</span><span style="color: #0000cc;">next</span><span style="color: #333333;">())</span> <span style="color: #333333;">{</span>
var country <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> Country<span style="color: #333333;">();</span>
country<span style="color: #333333;">.</span><span style="color: #0000cc;">setCode</span><span style="color: #333333;">(</span>code<span style="color: #333333;">);</span>
country<span style="color: #333333;">.</span><span style="color: #0000cc;">setName</span><span style="color: #333333;">(</span>rs<span style="color: #333333;">.</span><span style="color: #0000cc;">getString</span><span style="color: #333333;">(</span>COLUMN_NAME<span style="color: #333333;">));</span>
country<span style="color: #333333;">.</span><span style="color: #0000cc;">setContinent</span><span style="color: #333333;">(</span>rs<span style="color: #333333;">.</span><span style="color: #0000cc;">getString</span><span style="color: #333333;">(</span>COLUMN_CONTINENT<span style="color: #333333;">));</span>
country<span style="color: #333333;">.</span><span style="color: #0000cc;">setPopulation</span><span style="color: #333333;">(</span>rs<span style="color: #333333;">.</span><span style="color: #0000cc;">getInt</span><span style="color: #333333;">(</span>COLUMN_POPULATION<span style="color: #333333;">));</span>
country<span style="color: #333333;">.</span><span style="color: #0000cc;">setSurfaceArea</span><span style="color: #333333;">(</span>rs<span style="color: #333333;">.</span><span style="color: #0000cc;">getDouble</span><span style="color: #333333;">(</span>COLUMN_SURFACE_AREA<span style="color: #333333;">));</span>
<span style="color: #008800; font-weight: bold;">return</span> Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span>country<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">catch</span> <span style="color: #333333;">(</span>Exception e<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
LOGGER<span style="color: #333333;">.</span><span style="color: #0000cc;">error</span><span style="color: #333333;">(</span>e<span style="color: #333333;">.</span><span style="color: #0000cc;">getMessage</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">return</span> Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">empty</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
Genel olarak kodun okunabilirliği için değişkenlere isim verirken özenli davranmak gerekir. <b>var</b> ile tanımlanan değişkenler için ise bu pratiğe daha da sıkı sarılmak gerekir:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> Optional<span style="color: #333333;"><</span>Country<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">findOne</span><span style="color: #333333;">(</span>String code<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">try</span> <span style="color: #333333;">(</span>var connection <span style="color: #333333;">=</span> ds<span style="color: #333333;">.</span><span style="color: #0000cc;">getConnection</span><span style="color: #333333;">();)</span> <span style="color: #333333;">{</span>
var prepStatement <span style="color: #333333;">=</span> connection<span style="color: #333333;">.</span><span style="color: #0000cc;">prepareStatement</span><span style="color: #333333;">(</span>SELECT_COUNTRY_BY_CODE<span style="color: #333333;">);</span>
prepStatement<span style="color: #333333;">.</span><span style="color: #0000cc;">setString</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> code<span style="color: #333333;">);</span>
var resultSet <span style="color: #333333;">=</span> prepStatement<span style="color: #333333;">.</span><span style="color: #0000cc;">executeQuery</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>resultSet<span style="color: #333333;">.</span><span style="color: #0000cc;">next</span><span style="color: #333333;">())</span> <span style="color: #333333;">{</span>
var country <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> Country<span style="color: #333333;">();</span>
country<span style="color: #333333;">.</span><span style="color: #0000cc;">setCode</span><span style="color: #333333;">(</span>code<span style="color: #333333;">);</span>
country<span style="color: #333333;">.</span><span style="color: #0000cc;">setName</span><span style="color: #333333;">(</span>resultSet<span style="color: #333333;">.</span><span style="color: #0000cc;">getString</span><span style="color: #333333;">(</span>COLUMN_NAME<span style="color: #333333;">));</span>
country<span style="color: #333333;">.</span><span style="color: #0000cc;">setContinent</span><span style="color: #333333;">(</span>resultSet<span style="color: #333333;">.</span><span style="color: #0000cc;">getString</span><span style="color: #333333;">(</span>COLUMN_CONTINENT<span style="color: #333333;">));</span>
country<span style="color: #333333;">.</span><span style="color: #0000cc;">setPopulation</span><span style="color: #333333;">(</span>resultSet<span style="color: #333333;">.</span><span style="color: #0000cc;">getInt</span><span style="color: #333333;">(</span>COLUMN_POPULATION<span style="color: #333333;">));</span>
country<span style="color: #333333;">.</span><span style="color: #0000cc;">setSurfaceArea</span><span style="color: #333333;">(</span>resultSet<span style="color: #333333;">.</span><span style="color: #0000cc;">getDouble</span><span style="color: #333333;">(</span>COLUMN_SURFACE_AREA<span style="color: #333333;">));</span>
<span style="color: #008800; font-weight: bold;">return</span> Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span>country<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">catch</span> <span style="color: #333333;">(</span>Exception e<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
LOGGER<span style="color: #333333;">.</span><span style="color: #0000cc;">error</span><span style="color: #333333;">(</span>e<span style="color: #333333;">.</span><span style="color: #0000cc;">getMessage</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">return</span> Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">empty</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
Ancak <b>var</b> kulanımında her tip çıkarsaması yukarıda verilen örneklerde olduğu kadar açık ve yalın olmayabilir:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">var numbers <span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">4</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">8</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">15</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">16</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">23</span><span style="color: #333333;">);</span>
</pre>
</div>
<br />
Yukarıdaki örnekte <b>numbers</b> değişkeninin tipi <b>List<Integer></b> olacaktır. Şimdi ufak bir değişiklik yapalım:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">var numbers <span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">4</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">8</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">15</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">16</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">23</span><span style="color: #333333;">.);</span>
</pre>
</div>
<br />
Dikkatli bakılırsa <b>23</b> değerinin <b>23.</b> olarak değiştirildiği görülebilir. Evet, bir nokta koymak <b>numbers</b> değişkeninin tipini epey değiştirdi: <b>List<Number & Comparable<?>></b>. Şimdi biraz daha büyük bir değişiklik yapalım:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">var numbers <span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">4</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">8</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">15</span><span style="color: #333333;">,</span><span style="color: #0000dd; font-weight: bold;">16</span><span style="color: #333333;">.,</span><span style="color: #0000dd; font-weight: bold;">23</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"forty two"</span><span style="color: #333333;">);</span>
</pre>
</div>
<br />
Bu durumda <b>numbers</b> değişkeninin tipi <b>List<Object & Serializable & Comparable<?>></b> olacaktır.<br />
<br />Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-36421605611354678052018-09-12T09:41:00.000+03:002018-09-13T13:29:45.657+03:00JavaScript'de Kısmi Fonksiyon Yazımı<div style="text-align: justify;">
<span style="font-family: inherit;">JavaScript <b>eşbiçimli</b> (=<i>isomorphic</i>) bir programlama dilidir: JavaScript'de yazdığınız kod hem önuçta, tarayıcıda hem de arkauçta, örneğin <b>Nodejs</b>'de ya da <b>jjs </b>ile <b>JVM</b>'de çalışabilir. Yine de JavaScript'i ağırlıklı olarak önuçta çalışacak uygulamaları kodlamak için kullanıyoruz. Dil olarak incelendiğinde JavaScript, nesne tabanlı, olay tetiklemeli, fonksiyonel bir programlama dilidir: </span></div>
<!-- Code 1 --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">numbers<span style="color: #333333;">=</span> [<span style="color: #0000dd; font-weight: bold;">4</span>, <span style="color: #0000dd; font-weight: bold;">8</span> , <span style="color: #0000dd; font-weight: bold;">15</span>, <span style="color: #0000dd; font-weight: bold;">16</span>, <span style="color: #0000dd; font-weight: bold;">23</span>, <span style="color: #0000dd; font-weight: bold;">42</span>];
numbers.filter(<span style="color: #008800; font-weight: bold;">function</span>(x){ <span style="color: #008800; font-weight: bold;">return</span> x<span style="color: #333333;">%</span><span style="color: #0000dd; font-weight: bold;">2</span> <span style="color: #333333;">==</span> <span style="color: #0000dd; font-weight: bold;">1</span>;})
</pre>
</div>
<br />
<span style="font-family: inherit;">Yukarıdaki örnekte <b>Array</b> sınıfının <b>filter</b> metoduna parametre olarak bir fonksiyon geçiyoruz. Bu parametre olarak geçtiğimiz fonksiyonu λ ifadesi olarak da tanımlayabiliriz:</span><br />
<!-- Code 2 --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">numbers.filter((x)<span style="color: #333333;">=></span>{ <span style="color: #008800; font-weight: bold;">return</span> x<span style="color: #333333;">%</span><span style="color: #0000dd; font-weight: bold;">2</span> <span style="color: #333333;">==</span> <span style="color: #0000dd; font-weight: bold;">1</span>;})
</pre>
</div>
<br />
<span style="font-family: inherit;">Eğer λ ifadesi tek bir parametre alıyor ve gövdesi sadece return ifadesinden oluşuyor ise daha da basit yazılabilir:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">numbers.filter( x <span style="color: #333333;">=></span> x<span style="color: #333333;">%</span><span style="color: #0000dd; font-weight: bold;">2</span> <span style="color: #333333;">==</span> <span style="color: #0000dd; font-weight: bold;">1</span> )
</pre>
</div>
<br />
<span style="font-family: inherit;">Şimdi bir λ ifadesini bir değişken olarak tanımlayalım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">var</span> add <span style="color: #333333;">=</span> (x,y) <span style="color: #333333;">=></span> x<span style="color: #333333;">+</span>y ;
</pre>
</div>
<br />
<span style="font-family: inherit;">Bu λ ifadesini normal fonksiyon gibi çağırabilirsiniz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">add(<span style="color: #0000dd; font-weight: bold;">5</span>,<span style="color: #0000dd; font-weight: bold;">49</span>);
</pre>
</div>
<br />
Şimdi de numbers dizisindeki değerlerin bir fazlasından oluşan yeni bir dizi oluşturmaya çalışalım. Bunu basitçe <b>Array</b> sınıfındaki map çağrısını kullanarak başarabiliriz:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">numbers.map( x <span style="color: #333333;">=></span> x <span style="color: #333333;">+</span> <span style="color: #0000dd; font-weight: bold;">1</span>)
</pre>
</div>
<br />
Peki <b>map</b> fonksiyonunda parametre olarak <b>add</b> λ ifadesini kullanmak istersek, bunu nasıl başarabiliriz?<br />
<br />
<span style="font-family: inherit;">Sorunun cevabı kısmi fonksiyonda gizli:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">numbers.map(add.bind(<span style="color: #008800; font-weight: bold;">null</span>,<span style="color: #0000dd; font-weight: bold;">1</span>))
</pre>
</div>
<br />
<span style="font-family: inherit;">Burada <b>add</b> fonksiyonunun ilk parametresinin değerini 1'e bağlayıp tek parametreli bir fonksiyon elde ediyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">></span> var <span style="color: #996633;">add</span> <span style="color: #333333;">=</span> <span style="color: #333333;">(</span>x,y<span style="color: #333333;">)</span> <span style="color: #333333;">=</span>> x+y ;
<span style="color: #c65d09; font-weight: bold;">></span> var <span style="color: #996633;">plus1</span> <span style="color: #333333;">=</span> add.bind<span style="color: #333333;">(</span>null,1<span style="color: #333333;">)</span>;
<span style="color: #c65d09; font-weight: bold;">></span> plus1<span style="color: #333333;">(</span>42<span style="color: #333333;">)</span>
<span style="color: #888888;">43</span>
<span style="color: #c65d09; font-weight: bold;">></span> <span style="color: #996633;">numbers</span><span style="color: #333333;">=</span> <span style="color: #333333;">[</span>4, 8 , 15, 16, 23, 42<span style="color: #333333;">]</span>
<span style="color: #888888;">(6) [4, 8, 15, 16, 23, 42]</span>
<span style="color: #c65d09; font-weight: bold;">></span> numbers.map<span style="color: #333333;">(</span>plus1<span style="color: #333333;">)</span>
<span style="color: #888888;">(6) [5, 9, 16, 17, 24, 43]</span>
</pre>
</div>
<br />Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com1tag:blogger.com,1999:blog-2756890279096274314.post-15638906635668181432017-11-19T22:03:00.001+03:002017-11-22T22:02:47.865+03:00MySQL Cluster 7.5 Kurulumu<div>
<h2>
<b><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">Giriş</span></b></h2>
<span style="font-family: "georgia" , "times new roman" , serif;"><b><span style="font-size: large;"><br />
</span></b></span> <span style="font-family: "georgia" , "times new roman" , serif;"><b><span style="font-size: large;">V</span></b>eriler bir kurumun en önemli varlığıdır. Kurumsal uygulamaların hemen hemen hepsi kullanım senaryolarının bir adımında veri tabanına erişim ihtiyacı duyarlar. Bu nedenle kurumsal mimari şekillendirilirken, veri tabanlarının hem dar boğaz oluşturmayacak şekilde ölçeklenebilir olmasına hem de iş süreçlerini kesintiye uğratmayacak şekilde her zaman erişilebilir olmasına dikkat edilir. Genel olarak ölçeklenebilirlik ve her zaman erişilebilirlik için kümeleme çözümlerinden yararlanılır. Veri tabanlarının çoğunun birer kümeleme çözümü vardır. Ancak kümeleme yaklaşımları farklılık gösterebilir. Burada temelde iki farklı yaklaşım kullanılır: <b>Kaynak Paylaşımsız</b> (=<b>Shared-Nothing</b>) Yaklaşım ve <b>Disk Paylaşımlı</b> (=<b>Shared Disk</b>) Yaklaşım. <i><b>Kaynak paylaşımsız</b></i> yaklaşımda, kümeyi oluşturan düğümler, sıradan bilgisayarlar kullanılarak oluşturulur. Ortak paylaşılan bir disk alanına ya da özel bir donanıma ihtiyaç duyulmaz. Elbette düğümleri biri birine bağlayacak bir bilgisayar ağ yapısına ihtiyaç bulunur. <i><b>Disk paylaşımlı</b></i> yapıda ise <b>SAN</b> (=<b>Storage Area Network</b>) ya da <b>NAS</b> (<b>Network-Attached Storage</b>) gibi özel bir depolama çözümüne ihtiyaç duyulur. <b>MySQL Cluster</b> <i><b>kaynak paylaşımsız</b></i> yaklaşımı kullanırken, <b>Oracle RAC</b> ise <b><i>disk paylaşımlı</i></b> yaklaşımı kullanır. Yazmalarda kaynak paylaşımsız çözüm <b>dağıtık kilit</b> (=<b>Distributed Locking</b>) mekanizmasını kullandığı için potansiyel olarak daha ölçeklenebilir bir çözüm sunabilir. <i><b>Dağıtık kilit</b></i> mekanizmasında, genel olarak <b>iki evreli kilit</b> (=<b>2PL</b>, <b>Two-Phase Lock</b>) mekanizması kullanılır. Benzer şekilde hareket (=transaction) yönetiminde ise <b>iki evreli onay</b> (=<b>2PC</b>, <b>Two Phase Commit</b>) hareket algoritması kullanılır. <b>2PC</b> algoritmasında, hareketi yönetecek bir koordinatöre (<b>TC</b>, <b>Transaction Coordinator</b>) ihtiyaç vardır. <b>TC</b>, harekette yer alan düğümlere bir ön onay isteği gönderir. Eğer tüm düğümler olumlu cevap dönerse, <b>TC</b> tüm düğümlere asıl onayı gönderir. Eğer düğümlerden en az biri olumsuz cevap gönderirse, bu sefer <b>TC</b> düğümlere geri al (=Rollback) komutu gönderir. Genellikle kümeyi oluşturan düğümler <b>TC</b> rolünü üstlenirler. </span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b><span style="font-size: large;">H</span></b>er dağıtık sistemin ilgilenmesi gereken 3 problem vardır:</span><br />
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Tutarlılık: Kümedeki her düğüm aynı veriye sahip olmalıdır</span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Erişilebilirlik: Her istek için işlem başarılı olsun ya da olmasın bir cevap dönülmelidir</span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Dayanıklılık: Kümedeki düğümlerde ya da iletişimde oluşan hatalara karşı sistemin çalışmaya devam edebilme yeteneği</span></li>
</ul>
<div>
<span style="font-family: "georgia" , "times new roman" , serif;">Bu üç özelliği her durumda sağlamak mümkün değildir. <b>MySQL</b> her türlü hataya karşı dayanıklı değildir. Eğer bilgisayar ağında bazı düğümler biri birleri ile iletişim kurabilirken, bazı düğümler biri birlerini görmüyorsa <b>MySQL Cluster</b>, <b>tutarlılığı</b>, dayanıklılığa tercih eder.</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></div>
<h2>
<b><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">MySQL Cluster Mimarisi</span></b></h2>
<b style="font-family: Georgia, "Times New Roman", serif; text-align: justify;"><br />
</b> <b style="font-family: Georgia, "Times New Roman", serif; text-align: justify;">MySQL Cluster</b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> kayıtları bellekte saklayan dağıtık bir ilişkisel veri tabanıdır. Bellekte saklanan veriler indekslenmiş sütunlar ve bunların indeksleri bellekte saklanır. Bu nedenle indekslenmiş alan üzerinden veriye erişim çok hızlıdır. Veriler birden fazla düğümde yedeklenir. Böylelikle kümedeki bir düğümün bozulması veri kaybına neden olmaz.</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>MySQL Cluster</b> içinde üç tür düğüm bulunmaktadır:</span><br />
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>Veri düğümü (=Data Node)</b></span></li>
</ul>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Verileri ve indekslerini bellekte saklamaktan ve erişiminden sorumludur.Veri düğümlerinden <b>NoOfReplicas </b>değişkeni kadarı bir araya gelip bir <b>Düğüm Grubu</b> oluştururlar. Aynı <b>Düğüm Grubunda</b> yer alan veri düğümler, biri diğeri üzerindeki kayıtları yedekli olarak saklar. Böylelikle, gruptaki veri düğümlerinden biri servis dışı kalırsa, küme kesintisiz çalışmaya devam eder. Tipik olarak <b>NoOfReplicas </b>değişkeninin değeri 2 olarak seçilir.</span></blockquote>
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>Yönetim Düğümü (=Management Node)</b></span></li>
</ul>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Kümelemenin yapılandırılmasından, düğümlerin uzaktan yönetilmesinden ve izlenmesinden sorumludur. Veri düğümleri açılış sırasında yönetim düğümü ile konuşurlar. Yapılandırma değişikliklerinde yönetim düğümü önemli bir rol oynar. Bu nedenle, her zaman erişilebilirlik için yönetim düğümü de en az iki adet olarak </span><span style="font-family: "georgia" , "times new roman" , serif;">artıklık yaratacak şekilde</span><span style="font-family: "georgia" , "times new roman" , serif;"> </span><span style="font-family: "georgia" , "times new roman" , serif;">tasarlanmalıdır.</span></blockquote>
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>API/SQL Düğümü (=API/SQL Node)</b></span></li>
</ul>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Kümeden hizmet almak isteyen istemciler, doğrudan veri düğümlerine erişebilecekleri gibi, API/SQL düğümlerine bağlanıp SQL cümlelerini çalıştırabilirler. Bu düğümler üzerinde NDB saklama motoru bulunduran, küme ile ilgili herhangi bir sorumlulukları bulunmayan, normal birer MySQL sunucusudurlar.</span></blockquote>
<span style="font-family: "georgia" , "times new roman" , serif;">Bu yazıda, aşağıdaki çizgede gösterildiği şekilde, </span><b style="font-family: georgia, "times new roman", serif;">iki yönetim düğümlü</b><span style="font-family: "georgia" , "times new roman" , serif;">, </span><b style="font-family: georgia, "times new roman", serif;">dört veri düğümlü</b><span style="font-family: "georgia" , "times new roman" , serif;"> ve </span><b style="font-family: georgia, "times new roman", serif;">iki SQL düğümlü</b><span style="font-family: "georgia" , "times new roman" , serif;"> bir </span><b style="font-family: georgia, "times new roman", serif;">MySQL Cluster 7.5</b><span style="font-family: "georgia" , "times new roman" , serif;"> kurulumu hem </span><b style="font-family: georgia, "times new roman", serif;">Windows </b><span style="font-family: "georgia" , "times new roman" , serif;">hem de </span><b style="font-family: georgia, "times new roman", serif;">Centos/RHEL 7</b><span style="font-family: "georgia" , "times new roman" , serif;"> işletim sistemi için anlatılacaktır.</span><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-kA0T-0ACNHMkeNfqmc6Qt1EO8ht_M1veu8uFgJXyMK5UP1fDrC0uP9hKUhb8ji8WXrpUfCWUqkY_rfYVsr4SqvpFJi7tWZxTI0pCc5ZHmuj_YoaWp8-7dfm9ddFY6CnO2CyWIDrdD9Cw/s1600/mysql-cluster-fig01.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="398" data-original-width="899" height="282" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-kA0T-0ACNHMkeNfqmc6Qt1EO8ht_M1veu8uFgJXyMK5UP1fDrC0uP9hKUhb8ji8WXrpUfCWUqkY_rfYVsr4SqvpFJi7tWZxTI0pCc5ZHmuj_YoaWp8-7dfm9ddFY6CnO2CyWIDrdD9Cw/s640/mysql-cluster-fig01.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td class="tr-caption" style="font-size: 12.8px;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b>Kurulumu yapılacak MySQL Cluster'ın Mimarisi</b></span></td></tr>
</tbody></table>
</td></tr>
</tbody></table>
<br />
<h2>
<b style="font-family: "helvetica neue", arial, helvetica, sans-serif; font-size: x-large;">MySQL Cluster 7.5'in Windows Kurulumu</b></h2>
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><b><br />
</b></span></div>
<div>
<span style="font-family: "georgia" , "times new roman" , serif;"><b>MySQL Cluster 7.5</b> sürümünü <a href="https://edelivery.oracle.com/" target="_blank">bu adresten</a> <b>Windows</b> işletim sistemi (<b>V971153-01.zip</b>) için indirebilirsiniz. <b>Windows</b> kurulumu makinamda <b>C:\demo</b> dizinine yapacağım. <b>V971153-01.zip</b> dosyasından çıkan <b>mysql-cluster-advanced-7.5.8-winx64.zip</b> dosyasını <b>c:\demo</b> altına kopyalayınız ve ardından <b>c:\demo\mysql-cluster-advanced-7.5.8</b> dizinine açınız:</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><br />
</span> <br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNhAmZ4VBoREbz36wVOzq4hPQbF6nGEUFRQdTeK8qWbeWjADLx8g7fSEwqm89D1ueem5ET6U2mIjBP16YY2CNuh3yd9XBvArNUMTeHgJhvzV1k5cjM8gZbcHVYtmq_IKttUsFklKm7Hsyf/s1600/mysql-cluster-fig02.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="205" data-original-width="103" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNhAmZ4VBoREbz36wVOzq4hPQbF6nGEUFRQdTeK8qWbeWjADLx8g7fSEwqm89D1ueem5ET6U2mIjBP16YY2CNuh3yd9XBvArNUMTeHgJhvzV1k5cjM8gZbcHVYtmq_IKttUsFklKm7Hsyf/s1600/mysql-cluster-fig02.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b>Kurulum sonrasında c:\demo\mysql-cluster-advanced-7.5.8 dizininin içeriği</b></span></td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><br />
</span></span> <span style="font-family: "georgia" , "times new roman" , serif;">Kurulum adımlarını daha kolay gösterebilmek için tüm düğümleri aynı makina üzerinde gerçekleştireceğim. Bu nedenle <b>c:\demo\mysql-cluster-advanced-7.5.8</b> dizini altında <i><b>yönetim düğümlerinin</b></i> kullanımı için <b>conf1</b> ve <b>conf2</b> ile <b>mgm1</b> ve <b>mgm2</b> dizinlerini, <b><i>veri düğümlerinin</i></b> kullanımı için <b>data1</b>, <b>data2</b>, <b>data3</b> ve <b>data4</b> dizinlerini ve son olarak <i><b>SQL düğümlerinin</b></i> kullanımı için <b>sql1</b> ve <b>sql2</b> isimli dizinleri yaratalım:</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><br />
</span> <br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKaM4Gg16elqRe1yoDAUQF1QxSCTRelql2qG5w-DMfktx0XGcsKEo3lTIzbGh7PI5gzEqFekQ_y1WCaU-b0yEaHnt2L5Q5sXSwUpQqfihqxbLLOs87YdiohV6GjZ2lxqsA2INpkIlEF0nR/s1600/mysql-cluster-fig03.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="532" data-original-width="147" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKaM4Gg16elqRe1yoDAUQF1QxSCTRelql2qG5w-DMfktx0XGcsKEo3lTIzbGh7PI5gzEqFekQ_y1WCaU-b0yEaHnt2L5Q5sXSwUpQqfihqxbLLOs87YdiohV6GjZ2lxqsA2INpkIlEF0nR/s1600/mysql-cluster-fig03.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b>Veri düğümleri, yönetim düğümleri ve SQL düğümleri için yaratılan düğümlerden sonra kurulum dizininin görünümü</b></span> </td></tr>
</tbody></table>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Artık iki yönetim düğümlü, dört veri düğümlü ve iki SQL düğümlü MySQL Cluster kurulumunun yapılandırma dosyasını (<b>c:\demo\mysql-cluster-advanced-7.5.8\config.ini</b>) yaratalım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">[ndbd default]
NoOfReplicas=2
DataMemory=1G
IndexMemory=256M
[ndbd]
nodeid=1
hostname=192.168.1.102
datadir=c:/demo/mysql-cluster-advanced-7.5.8/data1
[ndbd]
nodeid=2
hostname=192.168.1.102
datadir=c:/demo/mysql-cluster-advanced-7.5.8/data2
[ndbd]
nodeid=3
hostname=192.168.1.102
datadir=c:/demo/mysql-cluster-advanced-7.5.8/data3
[ndbd]
nodeid=4
hostname=192.168.1.102
datadir=c:/demo/mysql-cluster-advanced-7.5.8/data4
[ndb_mgmd]
nodeid=50
hostname=192.168.1.102
PortNumber=2100
datadir=c:/demo/mysql-cluster-advanced-7.5.8/mgm1
ArbitrationRank=1
[ndb_mgmd]
nodeid=51
hostname=192.168.1.102
PortNumber=2110
datadir=c:/demo/mysql-cluster-advanced-7.5.8/mgm2
ArbitrationRank=1
[mysqld]
nodeid=101
[mysqld]
nodeid=102
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>config.ini</b> dosyasını hem <b>c:\demo\mysql-cluster-advanced-7.5.8\conf1</b> dizinine hem de <b>c:\demo\mysql-cluster-advanced-7.5.8\conf2</b> dizinine kopyalıyoruz. Artık yönetim düğümlerini başlatabiliriz. </span><span style="font-family: "georgia" , "times new roman" , serif;"><b>Birinci yönetim düğümü</b> için aşağıdaki komutu çalıştıralım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">set PATH=c:\demo\mysql-cluster-advanced-7.5.8\bin;%PATH%</span>
<span style="color: #888888;">ndb_mgmd --configdir=c:\demo\mysql-cluster-advanced-7.5.8\conf1 -f c:\demo\mysql-cluster-advanced-7.5.8\conf1\config.ini --ndb-nodeid=50 --initial</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>İkinci yönetim düğümü</b> için <i>benzer şekilde</i> aşağıdaki komutu çalıştıralım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">set PATH=c:\demo\mysql-cluster-advanced-7.5.8\bin;%PATH%</span>
<span style="color: #888888;">ndb_mgmd --configdir=c:\demo\mysql-cluster-advanced-7.5.8\conf2 -f c:\demo\mysql-cluster-advanced-7.5.8\conf2\config.ini --ndb-nodeid=51 --initial</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yönetim düğümüne <b>ndb_mgm</b> istemcisi ile bağlanıp sunucuların durumunu izleyebiliriz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">c:\demo\mysql-cluster-advanced-7.5.8\bin>ndb_mgm -c 192.168.1.102:2100</span>
<span style="color: #888888;">-- NDB Cluster -- Management Client --</span>
<span style="color: #888888;">ndb_mgm> show</span>
<span style="color: #888888;">Connected to Management Server at: 192.168.1.102:2100</span>
<span style="color: #888888;">Cluster Configuration</span>
<span style="color: #888888;">---------------------</span>
<span style="color: #888888;">[ndbd(NDB)] 4 node(s)</span>
<span style="color: #888888;">id=1 (not connected, accepting connect from 192.168.1.102)</span>
<span style="color: #888888;">id=2 (not connected, accepting connect from 192.168.1.102)</span>
<span style="color: #888888;">id=3 (not connected, accepting connect from 192.168.1.102)</span>
<span style="color: #888888;">id=4 (not connected, accepting connect from 192.168.1.102)</span>
<span style="color: #888888;">[ndb_mgmd(MGM)] 2 node(s)</span>
<span style="color: #888888;">id=50 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8)</span>
<span style="color: #888888;">id=51 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8)</span>
<span style="color: #888888;">[mysqld(API)] 2 node(s)</span>
<span style="color: #888888;">id=101 (not connected, accepting connect from any host)</span>
<span style="color: #888888;">id=102 (not connected, accepting connect from any host)</span>
<span style="color: #888888;">ndb_mgm></span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Şimdi veri düğümlerini başlatabiliriz:</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIEphY0h7GCsApqzAnOo9mG0bTjN8ZT09D4KAymLynfqGykutV9FzatLaucRazHBNDAzxc7PbDFvMUv559GW8J8wh5TZvx51ICbhRfaPxUFIZFiM63uCpi_mmcqS_HI4JFaA7p3DoHNpK7/s1600/mysql-cluster-fig04.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="692" data-original-width="782" height="566" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIEphY0h7GCsApqzAnOo9mG0bTjN8ZT09D4KAymLynfqGykutV9FzatLaucRazHBNDAzxc7PbDFvMUv559GW8J8wh5TZvx51ICbhRfaPxUFIZFiM63uCpi_mmcqS_HI4JFaA7p3DoHNpK7/s640/mysql-cluster-fig04.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td class="tr-caption" style="font-size: 12.8px;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b>Veri Düğümlerinin Başlatılması</b></span></td></tr>
</tbody></table>
</td></tr>
</tbody></table>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <br />
<span style="font-family: "georgia" , "times new roman" , serif;">Dört veri düğümünü de başlattıktan sonra yönetim konsolundan durumu izleyebiliriz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">ndb_mgm> show</span>
<span style="color: #888888;">Cluster Configuration</span>
<span style="color: #888888;">---------------------</span>
<span style="color: #888888;">[ndbd(NDB)] 4 node(s)</span>
<span style="color: #888888;">id=1 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0, *)</span>
<span style="color: #888888;">id=2 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0)</span>
<span style="color: #888888;">id=3 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 1)</span>
<span style="color: #888888;">id=4 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 1)</span>
<span style="color: #888888;">[ndb_mgmd(MGM)] 2 node(s)</span>
<span style="color: #888888;">id=50 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8)</span>
<span style="color: #888888;">id=51 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8)</span>
<span style="color: #888888;">[mysqld(API)] 2 node(s)</span>
<span style="color: #888888;">id=101 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8)</span>
<span style="color: #888888;">id=102 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8)</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Son olarak <b>SQL düğümlerini</b> başlatmalıyız. Bu normal bir <b>MySQL </b>sunucusunu başlatmaktan çok farklı değil. Sadece yapılandırma dosyasında, kümeleme ile ilgili iki özel tanımlama yapacağız:</span><br />
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>ndbcluster </b>saklama motorunu kullanıma açacağız</span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Yönetim düğümüne bağlanabilmesi için bağlantı karakter katarını tanımlayacağız</span></li>
</ul>
<span style="font-family: "georgia" , "times new roman" , serif;"><u>Birinci SQL düğümünün yapılandırma dosyası</u>: </span><br />
<b style="font-family: georgia, "times new roman", serif;"><br />
</b> <b style="font-family: georgia, "times new roman", serif;">c:\demo\mysql-cluster-advanced-7.5.8\my1.cnf</b><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[mysqld]</span>
<span style="color: #888888;">ndbcluster</span>
<span style="color: #888888;">ndb-connectstring=192.168.1.102:2100,192.168.1.102:2110</span>
<span style="color: #888888;">basedir = c:/demo/mysql-cluster-advanced-7.5.8 </span>
<span style="color: #888888;">datadir = c:/demo/mysql-cluster-advanced-7.5.8/sql1 </span>
<span style="color: #888888;">character-set-server = utf8 </span>
<span style="color: #888888;">collation-server = utf8_unicode_ci </span>
<span style="color: #888888;">connect_timeout = 60000 </span>
<span style="color: #888888;">default-storage-engine = innodb </span>
<span style="color: #888888;">innodb_buffer_pool_size = 2GB </span>
<span style="color: #888888;">innodb_file_per_table = 1 </span>
<span style="color: #888888;">innodb_flush_log_at_trx_commit = 1 </span>
<span style="color: #888888;">innodb_lock_wait_timeout = 10 </span>
<span style="color: #888888;">innodb_log_buffer_size = 8388608 </span>
<span style="color: #888888;">innodb_log_file_size = 5242880 </span>
<span style="color: #888888;">innodb_max_dirty_pages_pct = 90 </span>
<span style="color: #888888;">innodb_thread_concurrency = 8 </span>
<span style="color: #888888;">max_connect_errors = 20 </span>
<span style="color: #888888;">max_connections = 1000 </span>
<span style="color: #888888;">query_cache_size = 0 </span>
<span style="color: #888888;">query_cache_type = OFF </span>
<span style="color: #888888;">query_cache_limit = 0</span>
<span style="color: #888888;">thread_cache_size = 8 </span>
<span style="color: #888888;">transaction_isolation = READ-COMMITTED</span>
<span style="color: #888888;">innodb_buffer_pool_dump_at_shutdown = ON</span>
<span style="color: #888888;">innodb_buffer_pool_load_at_startup = ON</span>
<span style="color: #888888;">lower_case_table_names = 1</span>
<span style="color: #888888;">innodb_io_capacity = 750</span>
<span style="color: #888888;">innodb_io_capacity_max = 1000</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><u>İkinci SQL düğümünün yapılandırma dosyası</u>: </span><br />
<br />
<b style="font-family: georgia, "times new roman", serif;">c:\demo\mysql-cluster-advanced-7.5.8\my2.cnf</b><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[mysqld]</span>
<span style="color: #888888;">ndbcluster</span>
<span style="color: #888888;">ndb-connectstring=192.168.1.102:2100,192.168.1.102:2110</span>
<span style="color: #888888;">port=3316</span>
<span style="color: #888888;">basedir = c:/demo/mysql-cluster-advanced-7.5.8 </span>
<span style="color: #888888;">datadir = c:/demo/mysql-cluster-advanced-7.5.8/sql2 </span>
<span style="color: #888888;">character-set-server = utf8 </span>
<span style="color: #888888;">collation-server = utf8_unicode_ci </span>
<span style="color: #888888;">connect_timeout = 60000 </span>
<span style="color: #888888;">default-storage-engine = innodb </span>
<span style="color: #888888;">innodb_buffer_pool_size = 2GB </span>
<span style="color: #888888;">innodb_file_per_table = 1 </span>
<span style="color: #888888;">innodb_flush_log_at_trx_commit = 1 </span>
<span style="color: #888888;">innodb_lock_wait_timeout = 10 </span>
<span style="color: #888888;">innodb_log_buffer_size = 8388608 </span>
<span style="color: #888888;">innodb_log_file_size = 5242880 </span>
<span style="color: #888888;">innodb_max_dirty_pages_pct = 90 </span>
<span style="color: #888888;">innodb_thread_concurrency = 8 </span>
<span style="color: #888888;">max_connect_errors = 20 </span>
<span style="color: #888888;">max_connections = 1000 </span>
<span style="color: #888888;">query_cache_size = 0 </span>
<span style="color: #888888;">query_cache_type = OFF </span>
<span style="color: #888888;">query_cache_limit = 0</span>
<span style="color: #888888;">thread_cache_size = 8 </span>
<span style="color: #888888;">transaction_isolation = READ-COMMITTED</span>
<span style="color: #888888;">innodb_buffer_pool_dump_at_shutdown = ON</span>
<span style="color: #888888;">innodb_buffer_pool_load_at_startup = ON</span>
<span style="color: #888888;">lower_case_table_names = 1</span>
<span style="color: #888888;">innodb_io_capacity = 750</span>
<span style="color: #888888;">innodb_io_capacity_max = 1000</span>
</pre>
</div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Tüm düğümleri aynı makinada çalıştırmamız nedeni ile </span><i style="font-family: georgia, "times new roman", serif;">ikinci SQL düğümünün</i><span style="font-family: "georgia" , "times new roman" , serif;"> yapılandırma dosyasında port numarasını </span><b style="font-family: georgia, "times new roman", serif;">3316 </b><span style="font-family: "georgia" , "times new roman" , serif;">olarak tanımladık. Bu yapılandırma dosyaları ile artık <b>SQL düğümlerini</b> başlatabiliriz:</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji5_gLxs12ksbfjhzGeeb447lkRGAA8iB2dVKl9E5QbTxQ0NNLV_wyLkQLF_d79_OaYGRZFAFGhOSwKV7JLHOLUEXFb_G66QlBAL5VYX9lPDI2UMJtLzKKik5zTkbJ2b66_wXt_ZoidT8X/s1600/mysql-cluster-fig05.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="773" data-original-width="1107" height="446" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji5_gLxs12ksbfjhzGeeb447lkRGAA8iB2dVKl9E5QbTxQ0NNLV_wyLkQLF_d79_OaYGRZFAFGhOSwKV7JLHOLUEXFb_G66QlBAL5VYX9lPDI2UMJtLzKKik5zTkbJ2b66_wXt_ZoidT8X/s640/mysql-cluster-fig05.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b>SQL Düğümlerin başlatılması</b></span></td></tr>
</tbody></table>
<span style="font-family: "georgia" , "times new roman" , serif;">İki <b>SQL düğümünün</b> başarılı bir şekilde kümeleme çözümüne dahil olduğunu yönetim konsolundan durumu izleyebiliriz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">ndb_mgm> show</span>
<span style="color: #888888;">Cluster Configuration</span>
<span style="color: #888888;">---------------------</span>
<span style="color: #888888;">[ndbd(NDB)] 4 node(s)</span>
<span style="color: #888888;">id=1 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0, *)</span>
<span style="color: #888888;">id=2 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0)</span>
<span style="color: #888888;">id=3 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 1)</span>
<span style="color: #888888;">id=4 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 1)</span>
<span style="color: #888888;">[ndb_mgmd(MGM)] 2 node(s)</span>
<span style="color: #888888;">id=50 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8)</span>
<span style="color: #888888;">id=51 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8)</span>
<span style="color: #888888;">[mysqld(API)] 2 node(s)</span>
<span style="color: #888888;">id=101 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8)</span>
<span style="color: #888888;">id=102 @192.168.1.102 (mysql-5.7.20 ndb-7.5.8)</span></pre>
</div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <br />
<div style="text-align: justify;">
<b style="font-family: "helvetica neue", arial, helvetica, sans-serif; font-size: x-large;">MySQL Cluster 7.5'in Centos/RHEL 7 Kurulumu</b><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><b><br />
</b></span></div>
<span style="font-family: "georgia" , "times new roman" , serif;"><b>MySQL Cluster 7.5</b> sürümünü <a href="https://edelivery.oracle.com/">bu bağlantıdan</a> CentOS/OEL/RHEL 7 platformları için (<b>V971140-01.zip</b>) indirebilirsiniz. </span><span style="font-family: "georgia" , "times new roman" , serif;">Öncelikle <b>CentOS 7</b> sürümünde <b>MySQL </b>ile ilgili herhangi bir kurulum varsa onu kaldırıyoruz:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">guru@localhost Desktop]$</span> sudo rpm -qa | grep -i maria
<span style="color: #888888;">mariadb-libs-5.5.44-2.el7.centos.x86_64</span>
<span style="color: #888888;">[guru@localhost Desktop]$ sudo rpm -e mariadb-libs</span>
<span style="color: #888888;">error: Failed dependencies:</span>
<span style="color: #888888;"> libmysqlclient.so.18()(64bit) is needed by (installed) postfix-2:2.10.1-6.el7.x86_64</span>
<span style="color: #888888;"> libmysqlclient.so.18(libmysqlclient_18)(64bit) is needed by (installed) postfix-2:2.10.1-6.el7.x86_64</span>
<span style="color: #888888;">[guru@localhost Desktop]$ sudo rpm -e postfix-2.10.1-6.el7.x86_64</span>
<span style="color: #888888;">[guru@localhost Desktop]$ sudo rpm -e mariadb-libs</span>
</pre>
</div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Daha sonra <b>V971140-01.zip</b></span><span style="font-family: "georgia" , "times new roman" , serif;"> dosyasından aşağıdaki listedeki <b>RPM</b> dosyalarını kurulumu yapabilmek için bir dizine açıyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[guru@localhost Downloads]$ ls</span>
<span style="color: #888888;">mysql-cluster-commercial-common-7.5.8-1.1.el7.x86_64.rpm</span>
<span style="color: #888888;">mysql-cluster-commercial-data-node-7.5.8-1.1.el7.x86_64.rpm</span>
<span style="color: #888888;">mysql-cluster-commercial-libs-7.5.8-1.1.el7.x86_64.rpm</span>
<span style="color: #888888;">mysql-cluster-commercial-libs-compat-7.5.8-1.1.el7.x86_64.rpm</span>
<span style="color: #888888;">mysql-cluster-commercial-management-server-7.5.8-1.1.el7.x86_64.rpm</span>
<span style="color: #888888;">mysql-cluster-commercial-ndbclient-7.5.8-1.1.el7.x86_64.rpm</span>
<span style="color: #888888;">mysql-cluster-commercial-server-7.5.8-1.1.el7.x86_64.rpm</span>
<span style="color: #888888;">mysql-cluster-commercial-client-7.5.8-1.1.el7.x86_64.rpm</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Kuruluma başlayabilmek için iki paket bağımlılığını çözmeliyiz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[guru@localhost Downloads]$ sudo yum install perl</span>
<span style="color: #888888;">Loaded plugins: fastestmirror, langpacks</span>
<span style="color: #888888;">Resolving Dependencies</span>
<span style="color: #888888;">--> Running transaction check</span>
<span style="color: #888888;">---> Package perl.x86_64 4:5.16.3-286.el7 will be updated</span>
<span style="color: #888888;">---> Package perl.x86_64 4:5.16.3-292.el7 will be an update</span>
<span style="color: #888888;">--> Processing Dependency: perl-libs = 4:5.16.3-292.el7 for package: 4:perl-5.16.3-292.el7.x86_64</span>
<span style="color: #888888;">--> Running transaction check</span>
<span style="color: #888888;">---> Package perl-libs.x86_64 4:5.16.3-286.el7 will be updated</span>
<span style="color: #888888;">---> Package perl-libs.x86_64 4:5.16.3-292.el7 will be an update</span>
<span style="color: #888888;">--> Finished Dependency Resolution</span>
<span style="color: #888888;">Dependencies Resolved</span>
<span style="color: #888888;">==============================================================================================================</span>
<span style="color: #888888;"> Package Arch Version Repository Size</span>
<span style="color: #888888;">==============================================================================================================</span>
<span style="color: #888888;">Updating:</span>
<span style="color: #888888;"> perl x86_64 4:5.16.3-292.el7 base 8.0 M</span>
<span style="color: #888888;">Updating for dependencies:</span>
<span style="color: #888888;"> perl-libs x86_64 4:5.16.3-292.el7 base 688 k</span>
<span style="color: #888888;">Transaction Summary</span>
<span style="color: #888888;">==============================================================================================================</span>
<span style="color: #888888;">Upgrade 1 Package (+1 Dependent package)</span>
<span style="color: #888888;">Total download size: 8.6 M</span>
<span style="color: #888888;">Is this ok [y/d/N]: y</span>
<span style="color: #888888;">Downloading packages:</span>
<span style="color: #888888;">No Presto metadata available for base</span>
<span style="color: #888888;">(1/2): perl-libs-5.16.3-292.el7.x86_64.rpm | 688 kB 00:00:05 </span>
<span style="color: #888888;">(2/2): perl-5.16.3-292.el7.x86_64.rpm | 8.0 MB 00:00:24 </span>
<span style="color: #888888;">--------------------------------------------------------------------------------------------------------------</span>
<span style="color: #888888;">Total 360 kB/s | 8.6 MB 00:00:24 </span>
<span style="color: #888888;">Running transaction check</span>
<span style="color: #888888;">Running transaction test</span>
<span style="color: #888888;">Transaction test succeeded</span>
<span style="color: #888888;">Running transaction</span>
<span style="color: #888888;">Warning: RPMDB altered outside of yum.</span>
<span style="color: #888888;"> Updating : 4:perl-libs-5.16.3-292.el7.x86_64 1/4 </span>
<span style="color: #888888;"> Updating : 4:perl-5.16.3-292.el7.x86_64 2/4 </span>
<span style="color: #888888;"> Cleanup : 4:perl-libs-5.16.3-286.el7.x86_64 3/4 </span>
<span style="color: #888888;"> Cleanup : 4:perl-5.16.3-286.el7.x86_64 4/4 </span>
<span style="color: #888888;"> Verifying : 4:perl-5.16.3-292.el7.x86_64 1/4 </span>
<span style="color: #888888;"> Verifying : 4:perl-libs-5.16.3-292.el7.x86_64 2/4 </span>
<span style="color: #888888;"> Verifying : 4:perl-libs-5.16.3-286.el7.x86_64 3/4 </span>
<span style="color: #888888;"> Verifying : 4:perl-5.16.3-286.el7.x86_64 4/4 </span>
<span style="color: #888888;">Updated:</span>
<span style="color: #888888;"> perl.x86_64 4:5.16.3-292.el7 </span>
<span style="color: #888888;">Dependency Updated:</span>
<span style="color: #888888;"> perl-libs.x86_64 4:5.16.3-292.el7 </span>
<span style="color: #888888;">Complete!</span>
<span style="color: #888888;">[guru@localhost Downloads]$ sudo rpm -ivh ~/Downloads/perl-Class-MethodMaker-2.20-1.el7.x86_64.rpm </span>
<span style="color: #888888;">Preparing... ################################# [100%]</span>
<span style="color: #888888;">Updating / installing...</span>
<span style="color: #888888;"> 1:perl-Class-MethodMaker-2.20-1.el7################################# [100%]</span>
<span style="color: #888888;">[guru@localhost Downloads]$ sudo yum install perl-DBI</span>
<span style="color: #888888;">Loaded plugins: fastestmirror, langpacks</span>
<span style="color: #888888;">Loading mirror speeds from cached hostfile</span>
<span style="color: #888888;">Resolving Dependencies</span>
<span style="color: #888888;">--> Running transaction check</span>
<span style="color: #888888;">---> Package perl-DBI.x86_64 0:1.627-4.el7 will be installed</span>
<span style="color: #888888;">--> Processing Dependency: perl(RPC::PlServer) >= 0.2001 for package: perl-DBI-1.627-4.el7.x86_64</span>
<span style="color: #888888;">--> Processing Dependency: perl(RPC::PlClient) >= 0.2000 for package: perl-DBI-1.627-4.el7.x86_64</span>
<span style="color: #888888;">--> Running transaction check</span>
<span style="color: #888888;">---> Package perl-PlRPC.noarch 0:0.2020-14.el7 will be installed</span>
<span style="color: #888888;">--> Processing Dependency: perl(Net::Daemon) >= 0.13 for package: perl-PlRPC-0.2020-14.el7.noarch</span>
<span style="color: #888888;">--> Processing Dependency: perl(Net::Daemon::Test) for package: perl-PlRPC-0.2020-14.el7.noarch</span>
<span style="color: #888888;">--> Processing Dependency: perl(Net::Daemon::Log) for package: perl-PlRPC-0.2020-14.el7.noarch</span>
<span style="color: #888888;">--> Processing Dependency: perl(Compress::Zlib) for package: perl-PlRPC-0.2020-14.el7.noarch</span>
<span style="color: #888888;">--> Running transaction check</span>
<span style="color: #888888;">---> Package perl-IO-Compress.noarch 0:2.061-2.el7 will be installed</span>
<span style="color: #888888;">--> Processing Dependency: perl(Compress::Raw::Zlib) >= 2.061 for package: perl-IO-Compress-2.061-2.el7.noarch</span>
<span style="color: #888888;">--> Processing Dependency: perl(Compress::Raw::Bzip2) >= 2.061 for package: perl-IO-Compress-2.061-2.el7.noarch</span>
<span style="color: #888888;">---> Package perl-Net-Daemon.noarch 0:0.48-5.el7 will be installed</span>
<span style="color: #888888;">--> Running transaction check</span>
<span style="color: #888888;">---> Package perl-Compress-Raw-Bzip2.x86_64 0:2.061-3.el7 will be installed</span>
<span style="color: #888888;">---> Package perl-Compress-Raw-Zlib.x86_64 1:2.061-4.el7 will be installed</span>
<span style="color: #888888;">--> Finished Dependency Resolution</span>
<span style="color: #888888;">Dependencies Resolved</span>
<span style="color: #888888;">==============================================================================================================</span>
<span style="color: #888888;"> Package Arch Version Repository Size</span>
<span style="color: #888888;">==============================================================================================================</span>
<span style="color: #888888;">Installing:</span>
<span style="color: #888888;"> perl-DBI x86_64 1.627-4.el7 base 802 k</span>
<span style="color: #888888;">Installing for dependencies:</span>
<span style="color: #888888;"> perl-Compress-Raw-Bzip2 x86_64 2.061-3.el7 base 32 k</span>
<span style="color: #888888;"> perl-Compress-Raw-Zlib x86_64 1:2.061-4.el7 base 57 k</span>
<span style="color: #888888;"> perl-IO-Compress noarch 2.061-2.el7 base 260 k</span>
<span style="color: #888888;"> perl-Net-Daemon noarch 0.48-5.el7 base 51 k</span>
<span style="color: #888888;"> perl-PlRPC noarch 0.2020-14.el7 base 36 k</span>
<span style="color: #888888;">Transaction Summary</span>
<span style="color: #888888;">==============================================================================================================</span>
<span style="color: #888888;">Install 1 Package (+5 Dependent packages)</span>
<span style="color: #888888;">Total download size: 1.2 M</span>
<span style="color: #888888;">Installed size: 3.1 M</span>
<span style="color: #888888;">Is this ok [y/d/N]: y</span>
<span style="color: #888888;">Downloading packages:</span>
<span style="color: #888888;">(1/6): perl-Compress-Raw-Zlib-2.061-4.el7.x86_64.rpm | 57 kB 00:00:00 </span>
<span style="color: #888888;">(2/6): perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64.rpm | 32 kB 00:00:01 </span>
<span style="color: #888888;">(3/6): perl-PlRPC-0.2020-14.el7.noarch.rpm | 36 kB 00:00:01 </span>
<span style="color: #888888;">(4/6): perl-Net-Daemon-0.48-5.el7.noarch.rpm | 51 kB 00:00:03 </span>
<span style="color: #888888;">(5/6): perl-IO-Compress-2.061-2.el7.noarch.rpm | 260 kB 00:00:03 </span>
<span style="color: #888888;">(6/6): perl-DBI-1.627-4.el7.x86_64.rpm | 802 kB 00:00:04 </span>
<span style="color: #888888;">--------------------------------------------------------------------------------------------------------------</span>
<span style="color: #888888;">Total 277 kB/s | 1.2 MB 00:00:04 </span>
<span style="color: #888888;">Running transaction check</span>
<span style="color: #888888;">Running transaction test</span>
<span style="color: #888888;">Transaction test succeeded</span>
<span style="color: #888888;">Running transaction</span>
<span style="color: #888888;">Warning: RPMDB altered outside of yum.</span>
<span style="color: #888888;"> Installing : perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64 1/6 </span>
<span style="color: #888888;"> Installing : 1:perl-Compress-Raw-Zlib-2.061-4.el7.x86_64 2/6 </span>
<span style="color: #888888;"> Installing : perl-IO-Compress-2.061-2.el7.noarch 3/6 </span>
<span style="color: #888888;"> Installing : perl-Net-Daemon-0.48-5.el7.noarch 4/6 </span>
<span style="color: #888888;"> Installing : perl-PlRPC-0.2020-14.el7.noarch 5/6 </span>
<span style="color: #888888;"> Installing : perl-DBI-1.627-4.el7.x86_64 6/6 </span>
<span style="color: #888888;"> Verifying : perl-Net-Daemon-0.48-5.el7.noarch 1/6 </span>
<span style="color: #888888;"> Verifying : perl-IO-Compress-2.061-2.el7.noarch 2/6 </span>
<span style="color: #888888;"> Verifying : 1:perl-Compress-Raw-Zlib-2.061-4.el7.x86_64 3/6 </span>
<span style="color: #888888;"> Verifying : perl-DBI-1.627-4.el7.x86_64 4/6 </span>
<span style="color: #888888;"> Verifying : perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64 5/6 </span>
<span style="color: #888888;"> Verifying : perl-PlRPC-0.2020-14.el7.noarch 6/6 </span>
<span style="color: #888888;">Installed:</span>
<span style="color: #888888;"> perl-DBI.x86_64 0:1.627-4.el7 </span>
<span style="color: #888888;">Dependency Installed:</span>
<span style="color: #888888;"> perl-Compress-Raw-Bzip2.x86_64 0:2.061-3.el7 perl-Compress-Raw-Zlib.x86_64 1:2.061-4.el7 </span>
<span style="color: #888888;"> perl-IO-Compress.noarch 0:2.061-2.el7 perl-Net-Daemon.noarch 0:0.48-5.el7 </span>
<span style="color: #888888;"> perl-PlRPC.noarch 0:0.2020-14.el7 </span>
<span style="color: #888888;">Complete!</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Bu hazırlık kurulumlarından sonra <b>MySQL Cluster 7.5</b>'in kurulumunu yapabiliriz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[guru@localhost Downloads]$ sudo rpm -ivh mysql-cluster-commercial-*</span>
<span style="color: #888888;">Preparing... ################################# [100%]</span>
<span style="color: #888888;">Updating / installing...</span>
<span style="color: #888888;"> 1:mysql-cluster-commercial-common-7################################# [ 13%]</span>
<span style="color: #888888;"> 2:mysql-cluster-commercial-libs-7.5################################# [ 25%]</span>
<span style="color: #888888;"> 3:mysql-cluster-commercial-client-7################################# [ 38%]</span>
<span style="color: #888888;"> 4:mysql-cluster-commercial-server-7################################# [ 50%]</span>
<span style="color: #888888;"> 5:mysql-cluster-commercial-libs-com################################# [ 63%]</span>
<span style="color: #888888;"> 6:mysql-cluster-commercial-ndbclien################################# [ 75%]</span>
<span style="color: #888888;"> 7:mysql-cluster-commercial-manageme################################# [ 88%]</span>
<span style="color: #888888;"> 8:mysql-cluster-commercial-data-nod################################# [100%]</span>
</pre>
</div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>Windows</b> işletim sistemindeki kurulumda olduğu gibi <b>CentOS</b> <b>7</b> işletim sistemine kurulumda da tüm düğümler aynı makina üzerinde çalışacaklar. Bunun için ihtiyaç duyulan dizileri yaratıyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[guru@localhost ~]$ mkdir demo</span>
<span style="color: #888888;">[guru@localhost ~]$ cd demo/</span>
<span style="color: #888888;">[guru@localhost demo]$ mkdir config1</span>
<span style="color: #888888;">[guru@localhost demo]$ mkdir config2</span>
<span style="color: #888888;">[guru@localhost demo]$ vi config1/config.ini</span>
<span style="color: #888888;">[guru@localhost demo]$ mkdir data{1,2,3,4}</span>
<span style="color: #888888;">[guru@localhost demo]$ mkdir mgm{1,2}</span>
<span style="color: #888888;">[guru@localhost demo]$ mkdir api{1,2}</span>
</pre>
</div>
<b><br />
</b> <span style="font-family: "georgia" , "times new roman" , serif;"><b>MySQL Cluster</b> yapılandırma dosyasını <b>/home/guru/demo/config.ini</b> dosyasında oluşturalım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[ndbd default]</span>
<span style="color: #888888;">NoOfReplicas=2</span>
<span style="color: #888888;">DataMemory=512M</span>
<span style="color: #888888;">IndexMemory=64M</span>
<span style="color: #888888;">[ndbd]</span>
<span style="color: #888888;">nodeid=1</span>
<span style="color: #888888;">hostname=node1</span>
<span style="color: #888888;">datadir=/home/guru/demo/data1</span>
<span style="color: #888888;">[ndbd]</span>
<span style="color: #888888;">nodeid=2</span>
<span style="color: #888888;">hostname=node2</span>
<span style="color: #888888;">datadir=/home/guru/demo/data2</span>
<span style="color: #888888;">[ndbd]</span>
<span style="color: #888888;">nodeid=3</span>
<span style="color: #888888;">hostname=node3</span>
<span style="color: #888888;">datadir=/home/guru/demo/data3</span>
<span style="color: #888888;">[ndbd]</span>
<span style="color: #888888;">nodeid=4</span>
<span style="color: #888888;">hostname=node4</span>
<span style="color: #888888;">datadir=/home/guru/demo/data4</span>
<span style="color: #888888;">[ndb_mgmd]</span>
<span style="color: #888888;">nodeid=50</span>
<span style="color: #888888;">hostname=mgm1</span>
<span style="color: #888888;">PortNumber=2100</span>
<span style="color: #888888;">datadir=/home/guru/demo/mgm1</span>
<span style="color: #888888;">ArbitrationRank=1</span>
<span style="color: #888888;">[ndb_mgmd]</span>
<span style="color: #888888;">nodeid=51</span>
<span style="color: #888888;">hostname=mgm2</span>
<span style="color: #888888;">PortNumber=2110</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yapılandırma dosyasında gözüken </span><b style="font-family: Georgia, "Times New Roman", serif;">node1</b><span style="font-family: "georgia" , "times new roman" , serif;">, </span><b style="font-family: Georgia, "Times New Roman", serif;">node2</b><span style="font-family: "georgia" , "times new roman" , serif;">, </span><b style="font-family: Georgia, "Times New Roman", serif;">node3</b><span style="font-family: "georgia" , "times new roman" , serif;">, </span><b style="font-family: Georgia, "Times New Roman", serif;">node4</b><span style="font-family: "georgia" , "times new roman" , serif;">, </span><b style="font-family: Georgia, "Times New Roman", serif;">mgm1</b><span style="font-family: "georgia" , "times new roman" , serif;">, </span><b style="font-family: Georgia, "Times New Roman", serif;">mgm2</b><span style="font-family: "georgia" , "times new roman" , serif;">, </span><b style="font-family: Georgia, "Times New Roman", serif;">api1</b><span style="font-family: "georgia" , "times new roman" , serif;"> ve </span><b style="font-family: Georgia, "Times New Roman", serif;">api2</b><span style="font-family: "georgia" , "times new roman" , serif;"> makinalarını </span><b style="font-family: Georgia, "Times New Roman", serif;">/etc/hosts</b><span style="font-family: "georgia" , "times new roman" , serif;"> dosyasında statik olarak tanımlayacağız:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[guru@localhost demo]$ sudo vi /etc/hosts</span>
<span style="color: #888888;">127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4</span>
<span style="color: #888888;">::1 localhost localhost.localdomain localhost6 localhost6.localdomain6</span>
<span style="color: #888888;">192.168.239.129 node1 node2 node3 node4 mgm1 mgm2 api1 api2</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Önce yönetim düğümlerini daha sonra da veri düğümlerini sırayla çalıştıralım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[guru@localhost demo]$ ndb_mgmd --configdir=/home/guru/demo/config1 -f /home/guru/demo/config1/config.ini --ndb-nodeid=50 --initial</span>
<span style="color: #888888;">MySQL Cluster Management Server mysql-5.7.20 ndb-7.5.8</span>
<span style="color: #888888;">[guru@localhost demo]$ ndb_mgmd --configdir=/home/guru/demo/config2 -f /home/guru/demo/config2/config.ini --ndb-nodeid=51 --initial</span>
<span style="color: #888888;">MySQL Cluster Management Server mysql-5.7.20 ndb-7.5.8</span>
<span style="color: #888888;">[guru@localhost demo]$ ndbd -c mgm1:2100,mgm2:2110</span>
<span style="color: #888888;">2017-11-19 15:11:40 [ndbd] INFO -- Angel connected to 'mgm1:2100'</span>
<span style="color: #888888;">2017-11-19 15:11:40 [ndbd] INFO -- Angel allocated nodeid: 1</span>
<span style="color: #888888;">[guru@localhost demo]$ ndbd -c mgm1:2100,mgm2:2110</span>
<span style="color: #888888;">2017-11-19 15:11:44 [ndbd] INFO -- Angel connected to 'mgm1:2100'</span>
<span style="color: #888888;">2017-11-19 15:11:44 [ndbd] INFO -- Angel allocated nodeid: 2</span>
<span style="color: #888888;">[guru@localhost demo]$ ndbd -c mgm1:2100,mgm2:2110</span>
<span style="color: #888888;">2017-11-19 15:11:46 [ndbd] INFO -- Angel connected to 'mgm1:2100'</span>
<span style="color: #888888;">2017-11-19 15:11:47 [ndbd] INFO -- Angel allocated nodeid: 3</span>
<span style="color: #888888;">[guru@localhost demo]$ ndbd -c mgm1:2100,mgm2:2110</span>
<span style="color: #888888;">2017-11-19 15:11:50 [ndbd] INFO -- Angel connected to 'mgm1:2100'</span>
<span style="color: #888888;">2017-11-19 15:11:50 [ndbd] INFO -- Angel allocated nodeid: 4</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Düğümlerin durumunu yönetim düğüm istemcisinden izleyebiliriz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[guru@localhost demo]$ ndb_mgm -c mgm1:2100</span>
<span style="color: #888888;">-- NDB Cluster -- Management Client --</span>
<span style="color: #888888;">ndb_mgm> show</span>
<span style="color: #888888;">Connected to Management Server at: mgm1:2100</span>
<span style="color: #888888;">Cluster Configuration</span>
<span style="color: #888888;">---------------------</span>
<span style="color: #888888;">[ndbd(NDB)] 4 node(s)</span>
<span style="color: #888888;">id=1 @192.168.239.129 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0, *)</span>
<span style="color: #888888;">id=2 @192.168.239.129 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0)</span>
<span style="color: #888888;">id=3 @192.168.239.129 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 1)</span>
<span style="color: #888888;">id=4 @192.168.239.129 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 1)</span>
<span style="color: #888888;">[ndb_mgmd(MGM)] 2 node(s)</span>
<span style="color: #888888;">id=50 @192.168.239.129 (mysql-5.7.20 ndb-7.5.8)</span>
<span style="color: #888888;">id=51 @192.168.239.129 (mysql-5.7.20 ndb-7.5.8)</span>
<span style="color: #888888;">[mysqld(API)] 2 node(s)</span>
<span style="color: #888888;">id=101 (not connected, accepting connect from any host)</span>
<span style="color: #888888;">id=102 (not connected, accepting connect from any host)</span>
<span style="color: #888888;">ndb_mgm> </span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>API düğümleri</b> için ise önce <b>/var/lib/mysql</b> dizini altında<b> api1</b> ve <b>api2</b> adında <b>mysql:mysql</b> sahipliğinde iki dizin yaratalım ve daha sonra içini <b>MySQL</b>'in dosyaları ile dolduralım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[guru@localhost demo]sudo mkdir /var/lib/mysql/api{1,2}</span>
<span style="color: #888888;">[guru@localhost demo]$ sudo mysqld --datadir /var/lib/mysql/api1 --initialize</span>
<span style="color: #888888;">[guru@localhost demo]$ sudo mysqld --datadir /var/lib/mysql/api2 --initialize</span>
<span style="color: #888888;">[guru@localhost demo]$ sudo chown -R mysql:mysql /home/guru/demo/api1</span>
<span style="color: #888888;">[guru@localhost demo]$ sudo chown -R mysql:mysql /home/guru/demo/api2</span>
</pre>
</div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">API MySQL sunucularına <b>root </b>parolasını bir kereliğine başlangıçta verebilmek için <b>/var/lib/mysql/init-password</b> isimli bir dosya oluşturalım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[root@localhost mysql]# cat /var/lib/mysql/init-password </span>
<span style="color: #888888;">ALTER USER 'root'@'localhost' IDENTIFIED BY 'Secret_123';</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Sunucuları otomatik başlatabilmek için <b>systemd</b> servisi olarak tanıtmamız uygun olur:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">root@localhost mysql]#</span> cat /usr/lib/systemd/system/api1.service
<span style="color: #888888;">[Unit]</span>
<span style="color: #888888;">Description=api1 service</span>
<span style="color: #888888;">After=syslog.target</span>
<span style="color: #888888;">After=network.target</span>
<span style="color: #888888;">[Service]</span>
<span style="color: #888888;">Type=simple</span>
<span style="color: #888888;">ExecStart=/usr/sbin/mysqld --defaults-file=/var/lib/mysql/my1.cnf --init-file=/var/lib/mysql/init-password --log-error=/var/lib/mysql/api1/error.log</span>
<span style="color: #888888;">TimeoutSec=300</span>
<span style="color: #888888;">PrivateTmp=true</span>
<span style="color: #888888;">User=mysql</span>
<span style="color: #888888;">Group=mysql</span>
<span style="color: #888888;">WorkingDirectory=/usr</span>
<span style="color: #888888;">[Install]</span>
<span style="color: #888888;">WantedBy=multi-user.target</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Servis olarak ekleyebilmek için ise komut satırından aşağıdaki komutları sırayla çalıştırmanız gerekir:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[guru@localhost demo]$ sudo systemctl enable api1</span>
<span style="color: #888888;">Created symlink from /etc/systemd/system/multi-user.target.wants/api1.service to /usr/lib/systemd/system/api1.service.</span>
<span style="color: #888888;">[guru@localhost demo]$ sudo systemctl start api1</span>
<span style="color: #888888;">[root@localhost mysql]# systemctl status api1</span>
<span style="color: #888888;">● api1.service - api1 service</span>
<span style="color: #888888;"> Loaded: loaded (/usr/lib/systemd/system/api1.service; enabled; vendor preset: disabled)</span>
<span style="color: #888888;"> Active: active (running) since Sun 2017-11-19 16:41:58 EET; 8s ago</span>
<span style="color: #888888;"> Main PID: 21314 (mysqld)</span>
<span style="color: #888888;"> CGroup: /system.slice/api1.service</span>
<span style="color: #888888;"> └─21314 /usr/sbin/mysqld --defaults-file=/var/lib/mysql/my1.cnf --init-file=/var/lib/mysql/init-password --log-error=/var/lib/mysql/api1/error.log</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">İkinci API düğümünün yapılandırma dosyasında, </span><span style="font-family: "georgia" , "times new roman" , serif;">düğümler aynı makinada olduğu için</span><span style="font-family: "georgia" , "times new roman" , serif;"> birinci API düğümünün yapılandırma dosyasına göre</span><span style="font-family: "georgia" , "times new roman" , serif;"> üç farklılık bulunuyor:</span><br />
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Port numarası</span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Soket dosyası</span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Veri dizini</span></li>
</ul>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[mysqld]</span>
<span style="color: #888888;">ndbcluster</span>
<span style="color: #888888;">ndb-connectstring=mgm1:2100,mgm2:2110</span>
<span style="color: #888888;">port=3316</span>
<span style="color: #888888;">socket= /var/lib/mysql/mysql.api2.sock</span>
<span style="color: #888888;">datadir = /var/lib/mysql/api2</span>
<span style="color: #888888;">character-set-server = utf8</span>
<span style="color: #888888;">collation-server = utf8_unicode_ci</span>
<span style="color: #888888;">connect_timeout = 60000</span>
<span style="color: #888888;">default-storage-engine = innodb</span>
<span style="color: #888888;">innodb_buffer_pool_size = 2GB</span>
<span style="color: #888888;">innodb_file_per_table = 1</span>
<span style="color: #888888;">innodb_flush_log_at_trx_commit = 1</span>
<span style="color: #888888;">innodb_lock_wait_timeout = 10</span>
<span style="color: #888888;">innodb_log_buffer_size = 8388608</span>
<span style="color: #888888;">innodb_log_file_size = 5242880</span>
<span style="color: #888888;">innodb_max_dirty_pages_pct = 90</span>
<span style="color: #888888;">innodb_thread_concurrency = 8</span>
<span style="color: #888888;">max_connect_errors = 20</span>
<span style="color: #888888;">max_connections = 1000</span>
<span style="color: #888888;">query_cache_size = 0</span>
<span style="color: #888888;">query_cache_type = OFF</span>
<span style="color: #888888;">query_cache_limit = 0</span>
<span style="color: #888888;">thread_cache_size = 8</span>
<span style="color: #888888;">transaction_isolation = READ-COMMITTED</span>
<span style="color: #888888;">innodb_buffer_pool_dump_at_shutdown = ON</span>
<span style="color: #888888;">innodb_buffer_pool_load_at_startup = ON</span>
<span style="color: #888888;">lower_case_table_names = 1</span>
<span style="color: #888888;">innodb_io_capacity = 750</span>
<span style="color: #888888;">innodb_io_capacity_max = 1000</span>
</pre>
</div>
<b><br />
</b> <span style="font-family: "georgia" , "times new roman" , serif;"><b>İkinci SQL düğümünü</b> de çalıştıralım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[root@localhost mysql]# systemctl enable api2</span>
<span style="color: #888888;">Created symlink from /etc/systemd/system/multi-user.target.wants/api2.service to /usr/lib/systemd/system/api2.service.</span>
<span style="color: #888888;">[root@localhost mysql]# sudo systemctl start api2</span>
<span style="color: #888888;">[root@localhost mysql]# systemctl status api2</span>
<span style="color: #888888;">● api2.service - api1 service</span>
<span style="color: #888888;"> Loaded: loaded (/usr/lib/systemd/system/api2.service; enabled; vendor preset: disabled)</span>
<span style="color: #888888;"> Active: active (running) since Sun 2017-11-19 20:55:29 EET; 31s ago</span>
<span style="color: #888888;"> Main PID: 29133 (mysqld)</span>
<span style="color: #888888;"> CGroup: /system.slice/api2.service</span>
<span style="color: #888888;"> └─29133 /usr/sbin/mysqld --defaults-file=/var/lib/mysql/my2.cnf --init-file=/var/lib/mysql/init-password --log-error=/var/lib/mysql/api2/error.log</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Tüm <b>MySQL Cluster düğümlerinin</b> sorunsuz çalıştığını yönetim düğümüne konsoldan bağlanarak izleyebiliriz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[root@localhost mysql]# ndb_mgm -c mgm1:2100</span>
<span style="color: #888888;">-- NDB Cluster -- Management Client --</span>
<span style="color: #888888;">ndb_mgm> show</span>
<span style="color: #888888;">Connected to Management Server at: mgm1:2100</span>
<span style="color: #888888;">Cluster Configuration</span>
<span style="color: #888888;">---------------------</span>
<span style="color: #888888;">[ndbd(NDB)] 4 node(s)</span>
<span style="color: #888888;">id=1 @192.168.239.129 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0, *)</span>
<span style="color: #888888;">id=2 @192.168.239.129 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0)</span>
<span style="color: #888888;">id=3 @192.168.239.129 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 1)</span>
<span style="color: #888888;">id=4 @192.168.239.129 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 1)</span>
<span style="color: #888888;">[ndb_mgmd(MGM)] 2 node(s)</span>
<span style="color: #888888;">id=50 @192.168.239.129 (mysql-5.7.20 ndb-7.5.8)</span>
<span style="color: #888888;">id=51 @192.168.239.129 (mysql-5.7.20 ndb-7.5.8)</span>
<span style="color: #888888;">[mysqld(API)] 2 node(s)</span>
<span style="color: #888888;">id=101 @192.168.239.129 (mysql-5.7.20 ndb-7.5.8)</span>
<span style="color: #888888;">id=102 @192.168.239.129 (mysql-5.7.20 ndb-7.5.8)</span>
</pre>
</div>
<br />
<h2>
<span style="font-family: "georgia" , "times new roman" , serif;">World Veritabanının NDB Saklama Motoruna Yüklenmesi</span></h2>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Bu bölümde <b>InnoDB </b>saklama motorundaki <b>world </b>veritabanını <b>NDB </b>saklama motoruna nasıl taşınabileceğini inceleyeceğiz:</span><br />
<ol>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>world </b>veritabanını yaratıyoruz.</span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>world_innodb.sql</b> dosyasındaki yedeği <b>world </b>veritabanına geri açıyoruz. </span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>city </b>ve <b>countrylanguage </b>tablolarındaki ikincil anahtarları kaldırıyoruz. </span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Tabloların saklama motorunu <b>alter table</b> cümlesi ile değiştiriyoruz.</span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>city </b>ve <b>countrylanguage </b>tablolarındaki ikincil anahtarları tekrar ekliyoruz.</span></li>
</ol>
<div>
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıda sıralanan adımları aşağıdaki konsol çıktısından takip edebilirsiniz:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[root@localhost mysql]# mysql -uroot -pSecret_123</span>
<span style="color: #888888;">mysql: [Warning] Using a password on the command line interface can be insecure.</span>
<span style="color: #888888;">Welcome to the MySQL monitor. Commands end with ; or \g.</span>
<span style="color: #888888;">Your MySQL connection id is 6</span>
<span style="color: #888888;">Server version: 5.7.20-ndb-7.5.8-cluster-commercial-advanced MySQL Cluster Server - Advanced Edition (Commercial)</span>
<span style="color: #888888;">Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.</span>
<span style="color: #888888;">Oracle is a registered trademark of Oracle Corporation and/or its</span>
<span style="color: #888888;">affiliates. Other names may be trademarks of their respective</span>
<span style="color: #888888;">owners.</span>
<span style="color: #888888;">Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.</span>
<span style="color: #888888;">mysql> create database world;</span>
<span style="color: #888888;">Query OK, 1 row affected (0.10 sec)</span>
<span style="color: #888888;">mysql> use world;</span>
<span style="color: #888888;">Database changed</span>
<span style="color: #888888;">mysql> source /home/guru/world_innodb.sql;</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">Query OK, 0 rows affected (0.00 sec)</span>
<span style="color: #888888;">Query OK, 0 rows affected (0.00 sec)</span>
<span style="color: #888888;">Query OK, 0 rows affected (0.00 sec)</span>
<span style="color: #888888;">Query OK, 0 rows affected (0.00 sec)</span>
<span style="color: #888888;">Query OK, 0 rows affected (0.00 sec)</span>
<span style="color: #888888;">Query OK, 0 rows affected (0.00 sec)</span>
<span style="color: #888888;">mysql> show create table city;</span>
<span style="color: #888888;">+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+</span>
<span style="color: #888888;">| Table | Create Table |</span>
<span style="color: #888888;">+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+</span>
<span style="color: #888888;">| city | CREATE TABLE `city` (</span>
<span style="color: #888888;"> `ID` int(11) NOT NULL AUTO_INCREMENT,</span>
<span style="color: #888888;"> `Name` char(35) NOT NULL DEFAULT '',</span>
<span style="color: #888888;"> `CountryCode` char(3) NOT NULL DEFAULT '',</span>
<span style="color: #888888;"> `District` char(20) NOT NULL DEFAULT '',</span>
<span style="color: #888888;"> `Population` int(11) NOT NULL DEFAULT '0',</span>
<span style="color: #888888;"> PRIMARY KEY (`ID`),</span>
<span style="color: #888888;"> KEY `CountryCode` (`CountryCode`)</span>
<span style="color: #888888;">) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1 |</span>
<span style="color: #888888;">+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+</span>
<span style="color: #888888;">1 row in set (0.00 sec)</span>
<span style="color: #888888;">mysql> alter table city drop foreign key `city_ibfk_1`;</span>
<span style="color: #888888;">Query OK, 0 rows affected (0.06 sec)</span>
<span style="color: #888888;">Records: 0 Duplicates: 0 Warnings: 0</span>
<span style="color: #888888;">mysql> show create table countrylanguage;</span>
<span style="color: #888888;">+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+</span>
<span style="color: #888888;">| Table | Create Table |</span>
<span style="color: #888888;">+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+</span>
<span style="color: #888888;">| countrylanguage | CREATE TABLE `countrylanguage` (</span>
<span style="color: #888888;"> `CountryCode` char(3) NOT NULL DEFAULT '',</span>
<span style="color: #888888;"> `Language` char(30) NOT NULL DEFAULT '',</span>
<span style="color: #888888;"> `IsOfficial` enum('T','F') NOT NULL DEFAULT 'F',</span>
<span style="color: #888888;"> `Percentage` float(4,1) NOT NULL DEFAULT '0.0',</span>
<span style="color: #888888;"> PRIMARY KEY (`CountryCode`,`Language`),</span>
<span style="color: #888888;"> KEY `CountryCode` (`CountryCode`),</span>
<span style="color: #888888;"> CONSTRAINT `countryLanguage_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)</span>
<span style="color: #888888;">) ENGINE=InnoDB DEFAULT CHARSET=latin1 |</span>
<span style="color: #888888;">+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+</span>
<span style="color: #888888;">1 row in set (0.01 sec)</span>
<span style="color: #888888;">mysql> alter table countrylanguage drop foreign key `countryLanguage_ibfk_1`;</span>
<span style="color: #888888;">Query OK, 0 rows affected (0.01 sec)</span>
<span style="color: #888888;">Records: 0 Duplicates: 0 Warnings: 0</span>
<span style="color: #888888;">mysql> alter table country engine=ndbcluster;</span>
<span style="color: #888888;">Query OK, 239 rows affected (0.44 sec)</span>
<span style="color: #888888;">Records: 239 Duplicates: 0 Warnings: 0</span>
<span style="color: #888888;">mysql> alter table city engine=ndbcluster;</span>
<span style="color: #888888;">Query OK, 4079 rows affected (0.47 sec)</span>
<span style="color: #888888;">Records: 4079 Duplicates: 0 Warnings: 0</span>
<span style="color: #888888;">mysql> alter table countrylanguage engine=ndbcluster;</span>
<span style="color: #888888;">Query OK, 984 rows affected (0.41 sec)</span>
<span style="color: #888888;">Records: 984 Duplicates: 0 Warnings: 0</span>
<span style="color: #888888;">mysql> alter table city add FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`);</span>
<span style="color: #888888;">Query OK, 0 rows affected (0.27 sec)</span>
<span style="color: #888888;">Records: 0 Duplicates: 0 Warnings: 0</span>
<span style="color: #888888;">mysql> alter table countrylanguage add FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`);</span>
<span style="color: #888888;">Query OK, 0 rows affected (0.25 sec)</span>
<span style="color: #888888;">Records: 0 Duplicates: 0 Warnings: 0</span>
</pre>
</div>
<br />
<h2>
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Düğümlerin systemd Servisi Olarak Tanıtılması</b></span></h2>
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br />
</b></span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>MySQL Cluster</b>'ı oluşturan düğümleri <b>CentOS 7</b>'de <b>systemd</b> servisi olarak tanımlamak için <b>/usr/lib/systemd/system</b> dizininde, aşağıda içeriği verilen servis tanımlarının oluşturulması gerekir:</span><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>mgm1.service</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">[Unit]
Description=mgm1 service
After=syslog.target
After=network.target
[Service]
Type=forking
ExecStart=/sbin/ndb_mgmd --configdir=/var/lib/mysql/config1 -f /var/lib/mysql/config1/config.ini --ndb-nodeid=50
ExecReload=/sbin/ndb_mgmd --configdir=/var/lib/mysql/config1 -f /var/lib/mysql/config1/config.ini --ndb-nodeid=50 --reload
ExecStop=/sbin/ndb_mgm -e "50 stop"
Restart=always
[Install]
WantedBy=multi-user.target
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>mgm2.service</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">[Unit]
Description=mgm1 service
After=syslog.target
After=network.target
[Service]
Type=forking
ExecStart=/sbin/ndb_mgmd --configdir=/var/lib/mysql/config2 -f /var/lib/mysql/config2/config.ini --ndb-nodeid=51
ExecReload=/sbin/ndb_mgmd --configdir=/var/lib/mysql/config2 -f /var/lib/mysql/config2/config.ini --ndb-nodeid=51 --reload
ExecStop=/sbin/ndb_mgm -e "51 stop"
Restart=always
[Install]
WantedBy=multi-user.target
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>node1.service</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">[Unit]
Description=node 1 service
After=mgm1.service
After=mgm2.service
[Service]
Type=forking
ExecStart=/sbin/ndbd -c mgm1:2100,mgm2:2200 --ndb_nodeid=1
ExecReload=/sbin/ndbd -c mgm1:2100,mgm2:2200 --ndb_nodeid=1 --initial
ExecStop=/bin/ndb_mgm -c mgm1:2100,mgm2:2200 -e '1 stop'
Restart=always
User=mysql
[Install]
WantedBy=multi-user.target
</pre>
</div>
<br />
<b><span style="font-family: "georgia" , "times new roman" , serif;"><u>node2.service</u>:</span></b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">[Unit]
Description=node 2 service
After=mgm1.service
After=mgm2.service
[Service]
Type=forking
ExecStart=/sbin/ndbd -c mgm1:2100,mgm2:2200 --ndb_nodeid=2
ExecReload=/sbin/ndbd -c mgm1:2100,mgm2:2200 --ndb_nodeid=2 --initial
ExecStop=/bin/ndb_mgm -c mgm1:2100,mgm2:2200 -e '2 stop'
Restart=always
User=mysql
[Install]
WantedBy=multi-user.target
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>node3.service</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">[Unit]
Description=node 3 service
After=mgm1.service
After=mgm2.service
[Service]
Type=forking
ExecStart=/sbin/ndbd -c mgm1:2100,mgm2:2200 --ndb_nodeid=3
ExecReload=/sbin/ndbd -c mgm1:2100,mgm2:2200 --ndb_nodeid=3 --initial
ExecStop=/bin/ndb_mgm -c mgm1:2100,mgm2:2200 -e '3 stop'
Restart=always
User=mysql
[Install]
WantedBy=multi-user.target
</pre>
</div>
<br />
<b><span style="font-family: "georgia" , "times new roman" , serif;"><u>node4.service</u>:</span></b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">[Unit]
Description=node 4 service
After=mgm1.service
After=mgm2.service
[Service]
Type=forking
ExecStart=/sbin/ndbd -c mgm1:2100,mgm2:2200 --ndb_nodeid=4
ExecReload=/sbin/ndbd -c mgm1:2100,mgm2:2200 --ndb_nodeid=4 --initial
ExecStop=/bin/ndb_mgm -c mgm1:2100,mgm2:2200 -e '4 stop'
Restart=always
User=mysql
[Install]
WantedBy=multi-user.target
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>api1.service</u>:</b></span><br />
<br />
<!-- HTML generated using hilite.me --><span style="font-family: Georgia, Times New Roman, serif;"><b>systemd </b>servisleri arasında bağımlılıkları <b>After </b>ile tanımlayabilirsiniz. Buna göre <b>api1</b> servisi başlatılmadan önce, eğer kapalı ise önce <b>mgm1</b>, <b>mgm2</b>, <b>node1</b>, <b>node2</b>, <b>node3</b> ve <b>node4 </b>servisleri çalıştırılacaktır.</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">[Unit]
Description=api1 service
After=syslog.target
After=network.target
After=mgm1.target
After=mgm2.target
After=node1.target
After=node2.target
After=node3.target
After=node4.target
[Service]
Type=simple
ExecStart=/usr/sbin/mysqld --defaults-file=/var/lib/mysql/my1.cnf --init-file=/var/lib/mysql/init-password --log-error=/var/lib/mysql/api1/error.log
TimeoutSec=300
PrivateTmp=true
User=mysql
Group=mysql
WorkingDirectory=/usr
[Install]
WantedBy=multi-user.target
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>api2.service</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">[Unit]
Description=api2 service
After=syslog.target
After=network.target
After=mgm1.target
After=mgm2.target
After=node1.target
After=node2.target
After=node3.target
After=node4.target
[Service]
Type=simple
ExecStart=/usr/sbin/mysqld --defaults-file=/var/lib/mysql/my2.cnf --init-file=/var/lib/mysql/init-password --log-error=/var/lib/mysql/api2/error.log
TimeoutSec=300
PrivateTmp=true
User=mysql
Group=mysql
WorkingDirectory=/usr
[Install]
WantedBy=multi-user.target
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Bu servis tanımlarını etkinleştirmek üzere <b>systemctl enable</b> komutunu çalıştırmalısınız:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[root@node1 system]# systemctl enable node{1,2,3,4}.service</span>
<span style="color: #888888;">Created symlink from /etc/systemd/system/multi-user.target.wants/node1.service to /usr/lib/systemd/system/node1.service.</span>
<span style="color: #888888;">Created symlink from /etc/systemd/system/multi-user.target.wants/node2.service to /usr/lib/systemd/system/node2.service.</span>
<span style="color: #888888;">Created symlink from /etc/systemd/system/multi-user.target.wants/node3.service to /usr/lib/systemd/system/node3.service.</span>
<span style="color: #888888;">Created symlink from /etc/systemd/system/multi-user.target.wants/node4.service to /usr/lib/systemd/system/node4.service.</span>
<span style="color: #888888;">[root@node1 system]# systemctl enable api{1,2}.service</span>
<span style="color: #888888;">Created symlink from /etc/systemd/system/multi-user.target.wants/api1.service to /usr/lib/systemd/system/api1.service.</span>
<span style="color: #888888;">Created symlink from /etc/systemd/system/multi-user.target.wants/api2.service to /usr/lib/systemd/system/api2.service.</span>
<span style="color: #888888;">[root@node1 system]# systemctl enable mgm{1,2}.service</span>
<span style="color: #888888;">Created symlink from /etc/systemd/system/multi-user.target.wants/mgm1.service to /usr/lib/systemd/system/mgm1.service.</span>
<span style="color: #888888;">Created symlink from /etc/systemd/system/multi-user.target.wants/mgm2.service to /usr/lib/systemd/system/mgm2.service.</span>
</pre>
</div>
<br />
<span style="font-family: Georgia, Times New Roman, serif;">Herhangi bir servisi kapatmak için <b>systemctl stop</b> komutunu kullanabilirsiniz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[root@node1 system]# systemctl status mgm1.service</span>
<span style="color: #38761d;"><b>●</b></span><span style="color: #888888;"> mgm1.service - mgm1 service</span>
<span style="color: #888888;"> Loaded: loaded (/usr/lib/systemd/system/mgm1.service; enabled; vendor preset: disabled)</span>
<span style="color: #888888;"><span style="color: #888888;"> Active: </span><b><span style="color: #38761d;">active (running)</span></b><span style="color: #888888;"> since Tue 2017-11-21 22:15:48 EET; 22h ago</span></span>
<span style="color: #888888;"> Main PID: 1738 (ndb_mgmd)</span>
<span style="color: #888888;"> CGroup: /system.slice/mgm1.service</span>
<span style="color: #888888;"> └─1738 /sbin/ndb_mgmd --configdir=/var/lib/mysql/config1 -f /var/lib/mysql/config1/config.ini --ndb-nodeid=50</span>
<span style="color: #888888;">Nov 21 22:15:48 node1 systemd[1]: Starting mgm1 service...</span>
<span style="color: #888888;">Nov 21 22:15:48 node1 ndb_mgmd[1672]: MySQL Cluster Management Server mysql-5.7.20 ndb-7.5.8</span>
<span style="color: #888888;">Nov 21 22:15:48 node1 systemd[1]: Started mgm1 service.</span>
<span style="color: #888888;">[root@node1 system]# systemctl stop mgm1.service</span>
</pre>
</div>
<br />
<span style="font-family: Georgia, Times New Roman, serif;">Benzer şekilde servisi tekrar başlatmak için <b>systemctl start</b> komutunu kullanabilirsiniz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">[root@node1 system]# systemctl start mgm1.service</span>
<span style="color: #888888;">[root@node1 system]# systemctl status mgm1.service</span>
<span style="color: #38761d;"><b>●</b></span><span style="color: #888888;"> mgm1.service - mgm1 service</span>
<span style="color: #888888;"> Loaded: loaded (/usr/lib/systemd/system/mgm1.service; enabled; vendor preset: disabled)</span>
<span style="color: #888888;"><span style="color: #888888;"> Active: </span><b><span style="color: #38761d;">active (running)</span></b><span style="color: #888888;"> since Wed 2017-11-22 20:56:45 EET; 1s ago</span></span>
<span style="color: #888888;"> Process: 96590 ExecStop=/sbin/ndb_mgm -e 50 stop (code=exited, status=203/EXEC)</span>
<span style="color: #888888;"> Process: 98015 ExecStart=/sbin/ndb_mgmd --configdir=/var/lib/mysql/config1 -f /var/lib/mysql/config1/config.ini --ndb-nodeid=50 (code=exited, status=0/SUCCESS)</span>
<span style="color: #888888;"> Main PID: 98033 (ndb_mgmd)</span>
<span style="color: #888888;"> CGroup: /system.slice/mgm1.service</span>
<span style="color: #888888;"> └─98033 /sbin/ndb_mgmd --configdir=/var/lib/mysql/config1 -f /var/lib/mysql/config1/config.ini --ndb-nodeid=50</span>
<span style="color: #888888;">Nov 22 20:56:45 node1 systemd[1]: Starting mgm1 service...</span>
<span style="color: #888888;">Nov 22 20:56:45 node1 ndb_mgmd[98015]: MySQL Cluster Management Server mysql-5.7.20 ndb-7.5.8</span>
<span style="color: #888888;">Nov 22 20:56:45 node1 systemd[1]: Started mgm1 service.</span>
</pre>
</div>
<br />Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com1tag:blogger.com,1999:blog-2756890279096274314.post-48899230818576969572017-11-05T20:46:00.001+03:002017-11-05T20:46:36.686+03:00React, Angular 4, Vue Implementation of Mastermind Game<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Mastermind </b>is a simple <i><b>number guessing game</b></i>. Computer picks a <b><i>3-digit random</i></b> number where all digits are <b><i>distinct</i></b>. This number is a <b><i>secret</i></b> and a player tries to find the secret by guessing. Computer guides the player with a hint message summarizing how much the guess is close the secret. Assume that the secret number is <b>549 </b>and player's first move is <b><i>123</i></b>. Computer evaluates the input <b><i>123 </i></b>and produces "<b>No Match!</b>" message, hence there is no digit matched! Player's next move is <b><i>456</i></b>. </span><span style="font-family: "georgia" , "times new roman" , serif;">Computer again evaluates the input <b><i>456 </i></b>and produces the </span><span style="font-family: "georgia" , "times new roman" , serif;">message </span><span style="font-family: "georgia" , "times new roman" , serif;">"</span><b style="font-family: Georgia, "Times New Roman", serif;">-2</b><span style="font-family: "georgia" , "times new roman" , serif;">"</span><span style="font-family: "georgia" , "times new roman" , serif;">: The digits </span><i style="font-family: Georgia, "Times New Roman", serif;"><b>4</b></i><span style="font-family: "georgia" , "times new roman" , serif;"> and </span><b style="font-family: Georgia, "Times New Roman", serif;"><i>5</i></b><span style="font-family: "georgia" , "times new roman" , serif;"> are all matched but at the very wrong places! P</span><span style="font-family: "georgia" , "times new roman" , serif;">layer's next move is </span><b style="font-family: Georgia, "Times New Roman", serif;"><i>567</i></b><span style="font-family: "georgia" , "times new roman" , serif;">. </span><span style="font-family: "georgia" , "times new roman" , serif;">Computer again evaluates the input <b><i>567 </i></b>and produces the </span><span style="font-family: "georgia" , "times new roman" , serif;">message </span><span style="font-family: "georgia" , "times new roman" , serif;">"<b>+1</b></span><span style="font-family: "georgia" , "times new roman" , serif;">"</span><span style="font-family: "georgia" , "times new roman" , serif;">: Only one digit is matched at the correct place! </span><span style="font-family: "georgia" , "times new roman" , serif;">P</span><span style="font-family: "georgia" , "times new roman" , serif;">layer's next move is </span><b style="font-family: Georgia, "Times New Roman", serif;"><i>584</i></b><span style="font-family: "georgia" , "times new roman" , serif;">. </span><span style="font-family: "georgia" , "times new roman" , serif;">Computer again evaluates the input <b><i>584 </i></b>and produces the </span><span style="font-family: "georgia" , "times new roman" , serif;">message </span><span style="font-family: "georgia" , "times new roman" , serif;">"<b>+1-1</b></span><span style="font-family: "georgia" , "times new roman" , serif;">"</span><span style="font-family: "georgia" , "times new roman" , serif;">: </span><span style="font-family: "georgia" , "times new roman" , serif;">The digit </span><b style="font-family: Georgia, "Times New Roman", serif;"><i>5</i></b><span style="font-family: "georgia" , "times new roman" , serif;"> is matched at the correct place and </span><span style="font-family: "georgia" , "times new roman" , serif;">the digit </span><b style="font-family: Georgia, "Times New Roman", serif;"><i>4</i></b><span style="font-family: "georgia" , "times new roman" , serif;"> is matched at the wrong place. </span><span style="font-family: "georgia" , "times new roman" , serif;">Player's next move is <b><i>540</i></b>. </span><span style="font-family: "georgia" , "times new roman" , serif;">Computer again evaluates the input <b><i>540 </i></b>and produces the </span><span style="font-family: "georgia" , "times new roman" , serif;">message </span><span style="font-family: "georgia" , "times new roman" , serif;">"</span><b style="font-family: Georgia, "Times New Roman", serif;">+2</b><span style="font-family: "georgia" , "times new roman" , serif;">"</span><span style="font-family: "georgia" , "times new roman" , serif;">: The digits </span><i style="font-family: Georgia, "Times New Roman", serif;"><b>5</b></i><span style="font-family: "georgia" , "times new roman" , serif;"> and </span><b style="font-family: Georgia, "Times New Roman", serif;"><i>4</i></b><span style="font-family: "georgia" , "times new roman" , serif;"> are all matched at the correct places! </span><span style="font-family: "georgia" , "times new roman" , serif;">Finally the player inputs </span><b style="font-family: Georgia, "Times New Roman", serif;">549 </b><span style="font-family: "georgia" , "times new roman" , serif;">and wins the game!</span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><b>React JS Implementation</b></span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br />
</b></span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Game.js</u>:</b></span></div>
<pre style="background-color: white; font-family: "Courier New"; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">import </span>React, {<span style="color: #660e7a; font-weight: bold;">Component</span>} <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'react'</span>;
<span style="color: navy; font-weight: bold;">import </span>Table <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'./Table'</span>;
<span style="color: navy; font-weight: bold;">import </span>Badge <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'./Badge'</span>;
<span style="color: navy; font-weight: bold;">import </span>Alert <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'./Alert'</span>;
<span style="color: navy; font-weight: bold;">import </span>Button <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'./Button'</span>;
<span style="color: navy; font-weight: bold;">import </span>InputText <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'./InputText'</span>;
<span style="color: navy; font-weight: bold;">import </span>Move <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'./Move'</span>;
<span style="color: navy; font-weight: bold;">import </span><span style="color: green; font-weight: bold;">'../node_modules/bootstrap/dist/css/bootstrap.min.css'</span>;
<span style="color: navy; font-weight: bold;">class </span>Game <span style="color: navy; font-weight: bold;">extends </span><span style="color: #660e7a; font-weight: bold;">Component </span>{
<span style="color: #7a7a43;">constructor</span>(props) {
<span style="color: navy; font-weight: bold;">super</span>(props);
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state </span>= {
<span style="color: #660e7a; font-weight: bold;">secret</span>: <span style="color: blue;">123</span>, <span style="color: #660e7a; font-weight: bold;">guess</span>: <span style="color: blue;">0</span>, <span style="color: #660e7a; font-weight: bold;">tries</span>: <span style="color: blue;">0</span>, <span style="color: #660e7a; font-weight: bold;">moves</span>: [], <span style="color: #660e7a; font-weight: bold;">wins</span>: <span style="color: blue;">0</span>, <span style="color: #660e7a; font-weight: bold;">loses</span>: <span style="color: blue;">0</span>, <span style="color: #660e7a; font-weight: bold;">total</span>: <span style="color: blue;">0</span>, <span style="color: #660e7a; font-weight: bold;">counter</span>: <span style="color: blue;">60</span>, <span style="color: #660e7a; font-weight: bold;">totalWinTime</span>: <span style="color: blue;">0</span>,
<span style="color: #660e7a; font-weight: bold;">avgWinTime</span>: <span style="color: blue;">0</span>, <span style="color: #660e7a; font-weight: bold;">validationMessage</span>: <span style="color: green; font-weight: bold;">""</span><span style="color: green; font-weight: bold;"> </span>};
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">handleChange </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">handleChange</span>.<span style="color: #7a7a43;">bind</span>(<span style="color: navy; font-weight: bold;">this</span>);
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">play </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">play</span>.<span style="color: #7a7a43;">bind</span>(<span style="color: navy; font-weight: bold;">this</span>);
}
<span style="color: #7a7a43;">tick</span>() {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">setState</span>({<span style="color: #660e7a; font-weight: bold;">counter</span>: <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">counter </span>- <span style="color: blue;">1</span>});
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">counter </span><= <span style="color: blue;">0</span>) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">setState</span>({<span style="color: #660e7a; font-weight: bold;">loses</span>: <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">loses </span>+ <span style="color: blue;">1</span>, <span style="color: #660e7a; font-weight: bold;">total</span>: <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">total </span>+ <span style="color: blue;">1</span>});
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">initGame</span>(<span style="color: green; font-weight: bold;">"Time is out!"</span>);
}
}
<span style="color: #7a7a43;">componentDidMount</span>() {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">initGame</span>();
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">timerID </span>= <span style="color: #7a7a43;">setInterval</span>(() => <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">tick</span>(), <span style="color: blue;">1000</span>);
}
<span style="color: #7a7a43;">componentWillUnmount</span>() {
<span style="color: #7a7a43;">clearInterval</span>(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">timerID</span>);
}
<span style="color: #7a7a43;">handleChange</span>(event) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">setState</span>({
<span style="color: #660e7a; font-weight: bold;">guess</span>: event.<span style="color: #660e7a; font-weight: bold;">target</span>.<span style="color: #660e7a; font-weight: bold;">value</span><span style="color: #660e7a; font-weight: bold;"> </span>})
}
<span style="color: #7a7a43;">initGame</span>(message) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">moves</span>.<span style="color: #7a7a43;">splice</span>(<span style="color: blue;">0</span>);
<span style="color: navy; font-weight: bold;">if </span>(message !== <span style="color: #660e7a; font-weight: bold;">undefined</span>)
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">moves</span>.<span style="color: #7a7a43;">push</span>(<span style="color: navy; font-weight: bold;">new </span>Move(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">secret</span>, message));
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">setState</span>({
<span style="color: #660e7a; font-weight: bold;">moves</span>: <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">moves</span>,
<span style="color: #660e7a; font-weight: bold;">secret</span>: <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">createSecret</span>(),
<span style="color: #660e7a; font-weight: bold;">counter</span>: <span style="color: blue;">60</span>,
<span style="color: #660e7a; font-weight: bold;">tries</span>: <span style="color: blue;">0</span><span style="color: blue;"> </span>});
}
<span style="color: #7a7a43;">play</span>() {
<span style="color: navy; font-weight: bold;">if </span>(!Number.<span style="color: #7a7a43;">isInteger</span>(Number(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>))) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">setState</span>({<span style="color: #660e7a; font-weight: bold;">validationMessage</span>: <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">guess </span>+ <span style="color: green; font-weight: bold;">" is not an integer!"</span>});
<span style="color: navy; font-weight: bold;">return</span>;
}
<span style="color: navy; font-weight: bold;">if </span>(Number(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>) < <span style="color: blue;">0</span>) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">setState</span>({<span style="color: #660e7a; font-weight: bold;">validationMessage</span>: <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">guess </span>+ <span style="color: green; font-weight: bold;">" is a negative integer!"</span>});
<span style="color: navy; font-weight: bold;">return</span>;
}
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>.<span style="color: #7a7a43;">toString</span>().<span style="color: #660e7a; font-weight: bold;">length </span>!== <span style="color: blue;">3</span>) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">setState</span>({<span style="color: #660e7a; font-weight: bold;">validationMessage</span>: <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">guess </span>+ <span style="color: green; font-weight: bold;">" is not a 3-digit integer!"</span>});
<span style="color: navy; font-weight: bold;">return</span>;
}
<span style="color: navy; font-weight: bold;">for </span>(<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">i </span><span style="color: navy; font-weight: bold;">in this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">moves</span>) {
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">move </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">moves</span>[<span style="color: #458383;">i</span>];
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">move</span>.<span style="color: #660e7a; font-weight: bold;">guess </span>=== <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">setState</span>({<span style="color: #660e7a; font-weight: bold;">validationMessage</span>: <span style="color: green; font-weight: bold;">"Already played with " </span>+ <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">guess </span>+ <span style="color: green; font-weight: bold;">"!"</span>});
<span style="color: navy; font-weight: bold;">return</span>;
}
}
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">setState</span>({<span style="color: #660e7a; font-weight: bold;">tries</span>: <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">tries </span>+ <span style="color: blue;">1</span>});
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>.<span style="color: #7a7a43;">localeCompare</span>(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">secret</span>) === <span style="color: blue;">0</span>) {
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">totalWinTime </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">totalWinTime </span>+ <span style="color: blue;">60 </span>- <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">counter</span>;
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">wins </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">wins </span>+ <span style="color: blue;">1</span>;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">setState</span>({
<span style="color: #660e7a; font-weight: bold;">wins</span>: <span style="color: #458383;">wins</span>,
<span style="color: #660e7a; font-weight: bold;">total</span>: <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">total </span>+ <span style="color: blue;">1</span>,
<span style="color: #660e7a; font-weight: bold;">totalWinTime</span>: <span style="color: #458383;">totalWinTime</span>,
<span style="color: #660e7a; font-weight: bold;">avgWinTime</span>: <span style="color: #458383;">totalWinTime </span>/ <span style="color: #458383;">wins</span>,
<span style="color: #660e7a; font-weight: bold;">validationMessage</span>: <span style="color: green; font-weight: bold;">""</span><span style="color: green; font-weight: bold;"> </span>});
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">initGame</span>(<span style="color: green; font-weight: bold;">"You win!"</span>);
} <span style="color: navy; font-weight: bold;">else </span>{
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">message </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">createMessage</span>(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>, <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">secret</span>);
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">moves</span>.<span style="color: #7a7a43;">push</span>(<span style="color: navy; font-weight: bold;">new </span>Move(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>, <span style="color: #458383;">message</span>));
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">setState</span>({
<span style="color: #660e7a; font-weight: bold;">validationMessage</span>: <span style="color: green; font-weight: bold;">""</span>,
<span style="color: #660e7a; font-weight: bold;">moves</span>: <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">moves</span><span style="color: #660e7a; font-weight: bold;"> </span>});
}
}
<span style="color: #7a7a43;">createRandomDigit</span>(min, max) {
<span style="color: navy; font-weight: bold;">return </span><span style="color: #660e7a; font-style: italic; font-weight: bold;">Math</span>.<span style="color: #7a7a43;">floor</span>(<span style="color: #660e7a; font-style: italic; font-weight: bold;">Math</span>.<span style="color: #7a7a43;">random</span>() * (max - min + <span style="color: blue;">1</span>)) + min;
}
<span style="color: #7a7a43;">createSecret</span>() {
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">numbers </span>= [<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">createRandomDigit</span>(<span style="color: blue;">1</span>, <span style="color: blue;">9</span>)];
<span style="color: navy; font-weight: bold;">while </span>(<span style="color: #458383;">numbers</span>.<span style="color: #660e7a; font-weight: bold;">length </span>< <span style="color: blue;">3</span>) {
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">candidate </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">createRandomDigit</span>(<span style="color: blue;">0</span>, <span style="color: blue;">9</span>);
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">numbers</span>.<span style="color: #7a7a43;">indexOf</span>(<span style="color: #458383;">candidate</span>) === -<span style="color: blue;">1</span>) <span style="color: #458383;">numbers</span>.<span style="color: #7a7a43;">push</span>(<span style="color: #458383;">candidate</span>);
}
<span style="color: navy; font-weight: bold;">return </span><span style="color: #458383;">numbers</span>.<span style="color: #7a7a43;">join</span>(<span style="color: green; font-weight: bold;">''</span>)
}
<span style="color: #7a7a43;">createMessage</span>(guess, secret) {
guess = Array.<span style="color: #7a7a43;">from</span>(guess.<span style="color: #7a7a43;">toString</span>());
secret = Array.<span style="color: #7a7a43;">from</span>(secret.<span style="color: #7a7a43;">toString</span>());
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">perfectMatch </span>= <span style="color: blue;">0</span>, <span style="color: #458383;">partialMatch </span>= <span style="color: blue;">0</span>;
<span style="color: navy; font-weight: bold;">for </span>(<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">i </span><span style="color: navy; font-weight: bold;">in </span>guess) {
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">index </span>= secret.<span style="color: #7a7a43;">indexOf</span>(guess[<span style="color: #458383;">i</span>]);
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">index </span>=== -<span style="color: blue;">1</span>) <span style="color: navy; font-weight: bold;">continue</span>;
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">index </span>=== Number(<span style="color: #458383;">i</span>)) {
<span style="color: #458383;">perfectMatch</span>++;
} <span style="color: navy; font-weight: bold;">else </span>{
<span style="color: #458383;">partialMatch</span>++;
}
}
<span style="color: navy; font-weight: bold;">if </span>(!(<span style="color: #458383;">perfectMatch </span>|| <span style="color: #458383;">partialMatch</span>)) <span style="color: navy; font-weight: bold;">return </span><span style="color: green; font-weight: bold;">"No match."</span>;
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">message </span>= <span style="color: green; font-weight: bold;">""</span>;
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">perfectMatch </span>> <span style="color: blue;">0</span>) <span style="color: #458383;">message </span>= <span style="color: green; font-weight: bold;">"+" </span>+ <span style="color: #458383;">perfectMatch</span>;
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">partialMatch </span>> <span style="color: blue;">0</span>) <span style="color: #458383;">message </span>+= <span style="color: green; font-weight: bold;">"-" </span>+ <span style="color: #458383;">partialMatch</span>;
<span style="color: navy; font-weight: bold;">return </span><span style="color: #458383;">message</span>;
}
<span style="color: #7a7a43;">render</span>() {
<span style="color: navy; font-weight: bold;">return </span>(
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">className</span><span style="background-color: #efefef; color: green; font-weight: bold;">="container" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">role</span><span style="background-color: #efefef; color: green; font-weight: bold;">="main"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">className</span><span style="background-color: #efefef; color: green; font-weight: bold;">="panel panel-primary"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">className</span><span style="background-color: #efefef; color: green; font-weight: bold;">="panel-heading"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">h3 </span><span style="background-color: #efefef; color: blue; font-weight: bold;">className</span><span style="background-color: #efefef; color: green; font-weight: bold;">="panel-title"</span><span style="background-color: #efefef;">></span>Mastermind Game<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">h3</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">className</span><span style="background-color: #efefef; color: green; font-weight: bold;">="panel-body"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">InputText </span><span style="background-color: #efefef; color: blue; font-weight: bold;">htmlFor</span><span style="background-color: #efefef; color: green; font-weight: bold;">="guess" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">label</span><span style="background-color: #efefef; color: green; font-weight: bold;">="Guess" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">value</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>}<span style="background-color: #efefef;"> </span><span style="background-color: #efefef; color: blue; font-weight: bold;">onChange</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">handleChange</span>}<span style="background-color: #efefef;">/></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">Button </span><span style="background-color: #efefef; color: blue; font-weight: bold;">label</span><span style="background-color: #efefef; color: green; font-weight: bold;">="Play" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">doClick</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">play</span>}<span style="background-color: #efefef;">/></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">Alert </span><span style="background-color: #efefef; color: blue; font-weight: bold;">valid</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">validationMessage</span>.<span style="color: #660e7a; font-weight: bold;">length </span>> <span style="color: blue;">0</span>}<span style="background-color: #efefef;"> </span><span style="background-color: #efefef; color: blue; font-weight: bold;">message</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">validationMessage</span>}<span style="background-color: #efefef;">/></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">Badge </span><span style="background-color: #efefef; color: blue; font-weight: bold;">label</span><span style="background-color: #efefef; color: green; font-weight: bold;">="Tries" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">value</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">tries</span>}<span style="background-color: #efefef;">/></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">Badge </span><span style="background-color: #efefef; color: blue; font-weight: bold;">label</span><span style="background-color: #efefef; color: green; font-weight: bold;">="Counter" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">value</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">counter</span>}<span style="background-color: #efefef;">/></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">Badge </span><span style="background-color: #efefef; color: blue; font-weight: bold;">label</span><span style="background-color: #efefef; color: green; font-weight: bold;">="Wins" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">value</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">wins</span>}<span style="background-color: #efefef;">/></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">Badge </span><span style="background-color: #efefef; color: blue; font-weight: bold;">label</span><span style="background-color: #efefef; color: green; font-weight: bold;">="Loses" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">value</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">loses</span>}<span style="background-color: #efefef;">/></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">Badge </span><span style="background-color: #efefef; color: blue; font-weight: bold;">label</span><span style="background-color: #efefef; color: green; font-weight: bold;">="Total" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">value</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">total</span>}<span style="background-color: #efefef;">/></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">Badge </span><span style="background-color: #efefef; color: blue; font-weight: bold;">label</span><span style="background-color: #efefef; color: green; font-weight: bold;">="Average Win Time" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">value</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">avgWinTime</span>}<span style="background-color: #efefef;">/></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">Table </span><span style="background-color: #efefef; color: blue; font-weight: bold;">title</span><span style="background-color: #efefef; color: green; font-weight: bold;">="Moves" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">columns</span><span style="background-color: #efefef; color: green; font-weight: bold;">="Guess,Message" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">values</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">state</span>.<span style="color: #660e7a; font-weight: bold;">moves</span>}<span style="background-color: #efefef;"> </span><span style="background-color: #efefef; color: blue; font-weight: bold;">properties</span><span style="background-color: #efefef; color: green; font-weight: bold;">="guess,message"</span><span style="background-color: #efefef;">/></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
);
}
}
<span style="color: navy; font-weight: bold;">export default </span>Game;</pre>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Move.js</u>:</b></span><br />
<br />
<pre style="background-color: white; font-family: "Courier New"; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">class </span>Move {
<span style="color: #7a7a43;">constructor</span>(guess, message) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">guess </span>= guess;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">message </span>= message;
};
}
<span style="color: navy; font-weight: bold;">export default </span>Move;</pre>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Button.js</u>:</b></span><br />
<br />
<pre style="background-color: white; font-family: "Courier New"; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">import </span>React, {<span style="color: #660e7a; font-weight: bold;">Component</span>} <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'react'</span>;
<span style="color: navy; font-weight: bold;">import </span><span style="color: green; font-weight: bold;">'../node_modules/bootstrap/dist/css/bootstrap.min.css'</span>;
<span style="color: navy; font-weight: bold;">class </span>Button <span style="color: navy; font-weight: bold;">extends </span><span style="color: #660e7a; font-weight: bold;">Component </span>{
<span style="color: #7a7a43;">render</span>() {
<span style="color: navy; font-weight: bold;">return </span>(
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">className</span><span style="background-color: #efefef; color: green; font-weight: bold;">="form-group"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">button </span><span style="background-color: #efefef; color: blue; font-weight: bold;">ref</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{ (btn) => {<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">btn </span>= btn;} }<span style="background-color: #efefef;">
</span><span style="background-color: #efefef;"> </span><span style="background-color: #efefef; color: blue; font-weight: bold;">onClick</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">props</span>.doClick}<span style="background-color: #efefef;">
</span><span style="background-color: #efefef;"> </span><span style="background-color: #efefef; color: blue; font-weight: bold;">className</span><span style="background-color: #efefef; color: green; font-weight: bold;">="btn btn-success"</span><span style="background-color: #efefef;">></span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">props</span>.<span style="color: #660e7a; font-weight: bold;">label</span>}
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">button</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
)
}
}
<span style="color: navy; font-weight: bold;">export default </span>Button;</pre>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Alert.js</u>:</b></span><br />
<pre style="background-color: white; font-family: "Courier New"; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">import </span>React, {<span style="color: #660e7a; font-weight: bold;">Component</span>} <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'react'</span>;
<span style="color: navy; font-weight: bold;">import </span><span style="color: green; font-weight: bold;">'../node_modules/bootstrap/dist/css/bootstrap.min.css'</span>;
<span style="color: navy; font-weight: bold;">class </span>Alert <span style="color: navy; font-weight: bold;">extends </span><span style="color: #660e7a; font-weight: bold;">Component </span>{
<span style="color: #7a7a43;">render</span>() {
<span style="color: navy; font-weight: bold;">return </span>(
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span> {<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">props</span>.<span style="color: #660e7a; font-weight: bold;">valid </span>&&
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">className</span><span style="background-color: #efefef; color: green; font-weight: bold;">="alert alert-danger" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">role</span><span style="background-color: #efefef; color: green; font-weight: bold;">="alert"</span><span style="background-color: #efefef;">></span>
{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">props</span>.<span style="color: #660e7a; font-weight: bold;">message</span>}
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
} <span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
)
}
}
<span style="color: navy; font-weight: bold;">export default </span>Alert;</pre>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Badge.js</u>:</b></span><br />
<pre style="background-color: white; font-family: "Courier New"; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">import </span>React, {<span style="color: #660e7a; font-weight: bold;">Component</span>} <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'react'</span>;
<span style="color: navy; font-weight: bold;">import </span><span style="color: green; font-weight: bold;">'../node_modules/bootstrap/dist/css/bootstrap.min.css'</span>;
<span style="color: navy; font-weight: bold;">class </span>Badge <span style="color: navy; font-weight: bold;">extends </span><span style="color: #660e7a; font-weight: bold;">Component </span>{
<span style="color: #7a7a43;">render</span>() {
<span style="color: navy; font-weight: bold;">return </span>(
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">className</span><span style="background-color: #efefef; color: green; font-weight: bold;">="form-group"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label </span><span style="background-color: #efefef; color: blue; font-weight: bold;">htmlFor</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">props</span>.<span style="color: #660e7a; font-weight: bold;">value</span>}<span style="background-color: #efefef;">></span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">props</span>.<span style="color: #660e7a; font-weight: bold;">label</span>}<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span </span><span style="background-color: #efefef; color: blue; font-weight: bold;">id</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">props</span>.<span style="color: #660e7a; font-weight: bold;">value</span>}<span style="background-color: #efefef;"> </span><span style="background-color: #efefef; color: blue; font-weight: bold;">className</span><span style="background-color: #efefef; color: green; font-weight: bold;">="badge"</span><span style="background-color: #efefef;">></span>
{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">props</span>.<span style="color: #660e7a; font-weight: bold;">value</span>}
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
)
}
}
<span style="color: navy; font-weight: bold;">export default </span>Badge;</pre>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Table.js</u>:</b></span><br />
<pre style="background-color: white; font-family: "Courier New"; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">import </span>React, {<span style="color: #660e7a; font-weight: bold;">Component</span>} <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'react'</span>;
<span style="color: navy; font-weight: bold;">import </span><span style="color: green; font-weight: bold;">'../node_modules/bootstrap/dist/css/bootstrap.min.css'</span>;
<span style="color: navy; font-weight: bold;">class </span>Table <span style="color: navy; font-weight: bold;">extends </span><span style="color: #660e7a; font-weight: bold;">Component </span>{
<span style="color: #7a7a43;">render</span>() {
<span style="color: navy; font-weight: bold;">return </span>(
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">className</span><span style="background-color: #efefef; color: green; font-weight: bold;">="panel panel-success" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">data-bind</span><span style="background-color: #efefef; color: green; font-weight: bold;">="visible: moves().length > 0"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">className</span><span style="background-color: #efefef; color: green; font-weight: bold;">="panel-heading"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">h3 </span><span style="background-color: #efefef; color: blue; font-weight: bold;">className</span><span style="background-color: #efefef; color: green; font-weight: bold;">="panel-title"</span><span style="background-color: #efefef;">></span>{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">props</span>.<span style="color: #660e7a; font-weight: bold;">title</span>}<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">h3</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">className</span><span style="background-color: #efefef; color: green; font-weight: bold;">="panel-body"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">table </span><span style="background-color: #efefef; color: blue; font-weight: bold;">className</span><span style="background-color: #efefef; color: green; font-weight: bold;">="table-responsive table table-striped"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">thead</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">tr</span><span style="background-color: #efefef;">></span>
{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">props</span>.<span style="color: #660e7a; font-weight: bold;">columns</span>.<span style="color: #660e7a; font-weight: bold;">split</span>(<span style="color: green; font-weight: bold;">','</span>).<span style="color: #7a7a43;">map</span>(
(col, index) =>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">th </span><span style="background-color: #efefef; color: blue; font-weight: bold;">key</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{index}<span style="background-color: #efefef;">></span>{col}<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">th</span><span style="background-color: #efefef;">></span>
)
}
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">tr</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">thead</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">tbody</span><span style="background-color: #efefef;">></span>
{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">props</span>.<span style="color: #660e7a; font-weight: bold;">values</span>.<span style="color: #660e7a; font-weight: bold;">map</span>(
(val, i1) =>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">tr </span><span style="background-color: #efefef; color: blue; font-weight: bold;">key</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{i1}<span style="background-color: #efefef;">></span>
{<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">props</span>.properties.<span style="color: #660e7a; font-weight: bold;">split</span>(<span style="color: green; font-weight: bold;">","</span>).<span style="color: #7a7a43;">map</span>(
(p, i2) =>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">th </span><span style="background-color: #efefef; color: blue; font-weight: bold;">key</span><span style="background-color: #efefef; color: green; font-weight: bold;">=</span>{i2}<span style="background-color: #efefef;">></span>{val[p]}<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">th</span><span style="background-color: #efefef;">></span>
)
}
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">tr</span><span style="background-color: #efefef;">></span>
)
}
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">tbody</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">table</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
);
}
}
<span style="color: navy; font-weight: bold;">export default </span>Table;</pre>
<br />
<span style="font-family: Georgia, "Times New Roman", serif;">You can download the </span><i style="font-family: Georgia, "Times New Roman", serif;"><b>React implementation</b></i><span style="font-family: Georgia, "Times New Roman", serif;"> of the game using </span><a href="http://www.omegaegitim.com/sources/mastermind-react.zip" style="font-family: Georgia, "Times New Roman", serif;" target="_blank">this link</a><span style="font-family: Georgia, "Times New Roman", serif;">.</span><br />
<b><span style="font-family: "georgia" , "times new roman" , serif;"><br /></span></b>
<b><span style="font-family: "georgia" , "times new roman" , serif;">Angular 2 Implementation</span></b><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b><u>app.module.ts</u>:</b></span><br />
<pre style="background-color: white; font-family: "Courier New"; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">import </span>{BrowserModule} <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'@angular/platform-browser'</span>;
<span style="color: navy; font-weight: bold;">import </span>{FormsModule} <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'@angular/forms'</span>;
<span style="color: navy; font-weight: bold;">import </span>{NgModule} <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'@angular/core'</span>;
<span style="color: navy; font-weight: bold;">import </span>{AppComponent} <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'./app.component'</span>;
@<span style="color: #458383;">NgModule</span>({
<span style="color: #660e7a; font-weight: bold;">declarations</span>: [
AppComponent
],
<span style="color: #660e7a; font-weight: bold;">imports</span>: [
BrowserModule, FormsModule
],
<span style="color: #660e7a; font-weight: bold;">providers</span>: [],
<span style="color: #660e7a; font-weight: bold;">bootstrap</span>: [AppComponent]
})
<span style="color: navy; font-weight: bold;">export class </span>AppModule {
}</pre>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <b><span style="font-family: "georgia" , "times new roman" , serif;"><u>app.component.ts</u>:</span></b><br />
<pre style="background-color: white; font-family: "Courier New"; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">import </span>{Component, OnInit} <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'@angular/core'</span>;
<span style="color: navy; font-weight: bold;">import </span>{Move} <span style="color: navy; font-weight: bold;">from </span><span style="color: green; font-weight: bold;">'./move'</span>;
@<span style="color: #458383;">Component</span>({
<span style="color: #660e7a; font-weight: bold;">selector</span>: <span style="color: green; font-weight: bold;">'app-root'</span>,
<span style="color: #660e7a; font-weight: bold;">templateUrl</span>: <span style="color: green; font-weight: bold;">'./app.component.html'</span>,
<span style="color: #660e7a; font-weight: bold;">styleUrls</span>: [<span style="color: green; font-weight: bold;">'./app.component.css'</span>]
})
<span style="color: navy; font-weight: bold;">export class </span>AppComponent <span style="color: navy; font-weight: bold;">implements </span>OnInit {
<span style="color: navy; font-weight: bold;">private </span><span style="color: #660e7a; font-weight: bold;">title</span>: <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">private </span><span style="color: #660e7a; font-weight: bold;">guess</span>: <span style="color: navy; font-weight: bold;">number</span>;
<span style="color: navy; font-weight: bold;">private </span><span style="color: #660e7a; font-weight: bold;">tries</span>: <span style="color: navy; font-weight: bold;">number</span>;
<span style="color: navy; font-weight: bold;">private </span><span style="color: #660e7a; font-weight: bold;">secret</span>: <span style="color: navy; font-weight: bold;">number</span>;
<span style="color: navy; font-weight: bold;">private </span><span style="color: #660e7a; font-weight: bold;">gameLevel</span>: <span style="color: navy; font-weight: bold;">number</span>;
<span style="color: navy; font-weight: bold;">private </span><span style="color: #660e7a; font-weight: bold;">moves</span>: Move[];
<span style="color: navy; font-weight: bold;">constructor</span>() {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">title </span>= <span style="color: green; font-weight: bold;">'Mastermind!'</span>;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">guess </span>= <span style="color: blue;">123</span>;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">tries </span>= <span style="color: blue;">0</span>;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">secret </span>= <span style="color: blue;">0</span>;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">gameLevel </span>= <span style="color: blue;">3</span>;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">moves </span>= [];
}
<span style="color: #7a7a43;">ngOnInit</span>(): <span style="color: navy; font-weight: bold;">void </span>{
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">secret </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">createSecret</span>();
<span style="color: #660e7a; font-style: italic; font-weight: bold;">console</span>.<span style="color: #7a7a43;">log</span>(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">secret</span>);
}
<span style="color: navy; font-weight: bold;">private </span><span style="color: #7a7a43;">createSecret</span>(): <span style="color: navy; font-weight: bold;">number </span>{
<span style="color: navy; font-weight: bold;">const </span><span style="color: #458383;">digits</span>: <span style="color: navy; font-weight: bold;">number</span>[] = [];
<span style="color: #458383;">digits</span>.<span style="color: #7a7a43;">push</span>(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">createDigit</span>(<span style="color: blue;">1</span>, <span style="color: blue;">9</span>));
<span style="color: navy; font-weight: bold;">for </span>(<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">i </span>= <span style="color: blue;">1</span>; <span style="color: #458383;">i </span>< <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">gameLevel</span>; ++<span style="color: #458383;">i</span>) {
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">candidate </span>= <span style="color: blue;">0</span>;
<span style="color: navy; font-weight: bold;">do </span>{
<span style="color: #458383;">candidate </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">createDigit</span>(<span style="color: blue;">0</span>, <span style="color: blue;">9</span>);
} <span style="color: navy; font-weight: bold;">while </span>(<span style="color: #458383;">digits</span>.<span style="color: #7a7a43;">indexOf</span>(<span style="color: #458383;">candidate</span>) >= <span style="color: blue;">0</span>);
<span style="color: #458383;">digits</span>.<span style="color: #7a7a43;">push</span>(<span style="color: #458383;">candidate</span>);
}
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">value </span>= <span style="color: blue;">0</span>;
<span style="color: navy; font-weight: bold;">for </span>(<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">i </span>= <span style="color: blue;">0</span>; <span style="color: #458383;">i </span>< <span style="color: #458383;">digits</span>.<span style="color: #660e7a; font-weight: bold;">length</span>; ++<span style="color: #458383;">i</span>) {
<span style="color: #458383;">value </span>= <span style="color: blue;">10 </span>* <span style="color: #458383;">value </span>+ <span style="color: #458383;">digits</span>[<span style="color: #458383;">i</span>];
}
<span style="color: navy; font-weight: bold;">return </span><span style="color: #458383;">value</span>;
}
<span style="color: navy; font-weight: bold;">private </span><span style="color: #7a7a43;">createDigit</span>(min: <span style="color: navy; font-weight: bold;">number</span>, max: <span style="color: navy; font-weight: bold;">number</span>): <span style="color: navy; font-weight: bold;">number </span>{
<span style="color: navy; font-weight: bold;">return </span><span style="color: #660e7a; font-style: italic; font-weight: bold;">Math</span>.<span style="color: #7a7a43;">floor</span>(<span style="color: #660e7a; font-style: italic; font-weight: bold;">Math</span>.<span style="color: #7a7a43;">random</span>() * (max - min + <span style="color: blue;">1</span>)) + min;
}
<span style="color: navy; font-weight: bold;">public </span><span style="color: #7a7a43;">play</span>() {
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">secret </span>=== <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">gameLevel</span>++;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">tries </span>= <span style="color: blue;">0</span>;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">moves</span>.<span style="color: #7a7a43;">splice</span>(<span style="color: blue;">0</span>);
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">moves</span>.<span style="color: #7a7a43;">push</span>(<span style="color: navy; font-weight: bold;">new </span>Move(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>, <span style="color: green; font-weight: bold;">'You win!'</span>));
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">secret </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">createSecret</span>();
} <span style="color: navy; font-weight: bold;">else </span>{
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">tries</span>++;
<span style="color: navy; font-weight: bold;">const </span><span style="color: #458383;">message</span>: <span style="color: navy; font-weight: bold;">string </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">createMessage</span>();
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">moves</span>.<span style="color: #7a7a43;">push</span>(<span style="color: navy; font-weight: bold;">new </span>Move(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>, <span style="color: #458383;">message</span>));
}
}
<span style="color: navy; font-weight: bold;">private </span><span style="color: #7a7a43;">createMessage</span>(): <span style="color: navy; font-weight: bold;">string </span>{
<span style="color: navy; font-weight: bold;">const </span><span style="color: #458383;">strSecret</span>: <span style="color: navy; font-weight: bold;">string </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">secret</span>.<span style="color: #7a7a43;">toString</span>();
<span style="color: navy; font-weight: bold;">const </span><span style="color: #458383;">strGuess</span>: <span style="color: navy; font-weight: bold;">string </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>.<span style="color: #7a7a43;">toString</span>();
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">perfectMatch </span>= <span style="color: blue;">0</span>;
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">partialMatch </span>= <span style="color: blue;">0</span>;
<span style="color: navy; font-weight: bold;">for </span>(<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">i </span>= <span style="color: blue;">0</span>; <span style="color: #458383;">i </span>< <span style="color: #458383;">strSecret</span>.<span style="color: #660e7a; font-weight: bold;">length</span>; ++<span style="color: #458383;">i</span>) {
<span style="color: navy; font-weight: bold;">for </span>(<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">j </span>= <span style="color: blue;">0</span>; <span style="color: #458383;">j </span>< <span style="color: #458383;">strGuess</span>.<span style="color: #660e7a; font-weight: bold;">length</span>; ++<span style="color: #458383;">j</span>) {
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">strSecret</span>.<span style="color: #7a7a43;">charAt</span>(<span style="color: #458383;">i</span>) === <span style="color: #458383;">strGuess</span>.<span style="color: #7a7a43;">charAt</span>(<span style="color: #458383;">j</span>)) {
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">i </span>=== <span style="color: #458383;">j</span>) {
++<span style="color: #458383;">perfectMatch</span>;
} <span style="color: navy; font-weight: bold;">else </span>{
++<span style="color: #458383;">partialMatch</span>;
}
}
}
}
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">perfectMatch </span>=== <span style="color: blue;">0 </span>&& <span style="color: #458383;">partialMatch </span>=== <span style="color: blue;">0</span>) {
<span style="color: navy; font-weight: bold;">return </span><span style="color: green; font-weight: bold;">'No match'</span>;
}
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">message </span>= <span style="color: green; font-weight: bold;">''</span>;
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">perfectMatch </span>> <span style="color: blue;">0</span>) {
<span style="color: #458383;">message </span>= <span style="color: green; font-weight: bold;">'+' </span>+ <span style="color: #458383;">perfectMatch</span>;
}
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">partialMatch </span>> <span style="color: blue;">0</span>) {
<span style="color: #458383;">message </span>+= <span style="color: green; font-weight: bold;">'-' </span>+ <span style="color: #458383;">partialMatch</span>;
}
<span style="color: navy; font-weight: bold;">return </span><span style="color: #458383;">message</span>;
}
}</pre>
<b><span style="font-family: "georgia" , "times new roman" , serif;"><u>app.component.html</u>:</span></b><br />
<pre style="background-color: white; font-family: "Courier New"; font-size: 10.5pt;"><span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">script </span><span style="background-color: #efefef; color: blue; font-weight: bold;">type=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"application/javascript" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">src=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"node_modules/jquery/dist/jquery.js"</span><span style="background-color: #efefef;">></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">script</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">script </span><span style="background-color: #efefef; color: blue; font-weight: bold;">type=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"application/javascript" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">src=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"node_modules/bootstrap/dist/js/bootstrap.min.js"</span><span style="background-color: #efefef;">></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">script</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">p</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"container" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">role=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"main"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel panel-primary"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel-heading"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">h3 </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel-title"</span><span style="background-color: #efefef;">></span>{{title}}<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">h3</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel-body"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"form-group"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label </span><span style="background-color: #efefef; color: blue; font-weight: bold;">for=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"gameLevel"</span><span style="background-color: #efefef;">></span>Game Level<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span </span><span style="background-color: #efefef; color: blue; font-weight: bold;">id=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"gameLevel"</span><span style="background-color: #efefef;">></span>{{gameLevel}}<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"form-group"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label </span><span style="background-color: #efefef; color: blue; font-weight: bold;">for=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"tries"</span><span style="background-color: #efefef;">></span>Tries<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span </span><span style="background-color: #efefef; color: blue; font-weight: bold;">id=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"tries"</span><span style="background-color: #efefef;">></span>{{tries}}<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"form-group"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label </span><span style="background-color: #efefef; color: blue; font-weight: bold;">for=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"guess"</span><span style="background-color: #efefef;">></span>Guess<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">input </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"form-control" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">type=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"number" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">id=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"guess" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">[(ngModel)]=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"guess"</span><span style="background-color: #efefef;">/></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"form-group"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">button </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"btn btn-success" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">(click)=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"play()"</span><span style="background-color: #efefef;">></span>Play<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">button</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">ng-container </span><span style="background-color: #efefef; color: blue; font-weight: bold;">*ngIf=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"moves.length>0"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel panel-primary"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel-heading"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">h3 </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel-title"</span><span style="background-color: #efefef;">></span>Moves<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">h3</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel-body"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">table </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"table table-striped"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">thead</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">tr</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">th</span><span style="background-color: #efefef;">></span>No<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">th</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">th</span><span style="background-color: #efefef;">></span>Guess<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">th</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">th</span><span style="background-color: #efefef;">></span>Message<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">th</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">tr</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">thead</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">tbody</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">tr </span><span style="background-color: #efefef; color: blue; font-weight: bold;">*ngFor=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"let move of moves ; let i= index"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">td</span><span style="background-color: #efefef;">></span>{{i+1}}<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">td</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">td</span><span style="background-color: #efefef;">></span>{{move.guess}}<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">td</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">td</span><span style="background-color: #efefef;">></span>{{move.message}}<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">td</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">tr</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">tbody</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">table</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">ng-container</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span></pre>
<b><span style="font-family: "georgia" , "times new roman" , serif;"><br /></span></b>
<span style="font-family: Georgia, "Times New Roman", serif;">You can download the </span><i style="font-family: Georgia, "Times New Roman", serif;"><b>Angular 4 implementation</b></i><span style="font-family: Georgia, "Times New Roman", serif;"> of the game using </span><a href="http://www.omegaegitim.com/sources/mastermind-ng4.zip" style="font-family: Georgia, "Times New Roman", serif;" target="_blank">this link</a><span style="font-family: Georgia, "Times New Roman", serif;">.</span><br />
<span style="font-family: Georgia, Times New Roman, serif;"><br /></span>
<b><span style="font-family: "georgia" , "times new roman" , serif;">Vue JS Implementation</span></b><br />
<b><span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></b> <span style="font-family: "georgia" , "times new roman" , serif;"><b><u>game.js</u>:</b></span><br />
<pre style="background-color: white; font-family: "Courier New"; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">class </span>Move {
<span style="color: #7a7a43;">constructor</span>(guess, message) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">guess </span>= guess;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">message </span>= message;
}
};
<span style="color: #660e7a; font-weight: bold;">Vue</span>.<span style="color: #7a7a43;">component</span>(<span style="color: green; font-weight: bold;">'utable'</span>, {
<span style="color: #660e7a; font-weight: bold;">props</span>: [<span style="color: green; font-weight: bold;">'items'</span>, <span style="color: green; font-weight: bold;">'properties'</span>, <span style="color: green; font-weight: bold;">'columns'</span>],
<span style="color: #660e7a; font-weight: bold;">template</span>:
<span style="color: green; font-weight: bold;">'<table class="table table-striped">'</span><span style="color: green; font-weight: bold;"> </span>+ <span style="color: green; font-weight: bold;">'<thead>'</span><span style="color: green; font-weight: bold;"> </span>+ <span style="color: green; font-weight: bold;">'<tr>'</span><span style="color: green; font-weight: bold;"> </span>+ <span style="color: green; font-weight: bold;">"<th v-for=</span><span style="color: navy; font-weight: bold;">\"</span><span style="color: green; font-weight: bold;">column in columns</span><span style="color: navy; font-weight: bold;">\"</span><span style="color: green; font-weight: bold;">>{{column}}</th>"</span><span style="color: green; font-weight: bold;"> </span>+ <span style="color: green; font-weight: bold;">'</tr>'</span><span style="color: green; font-weight: bold;"> </span>+ <span style="color: green; font-weight: bold;">'</thead>'</span><span style="color: green; font-weight: bold;"> </span>+ <span style="color: green; font-weight: bold;">'<tbody>'</span><span style="color: green; font-weight: bold;"> </span>+ <span style="color: green; font-weight: bold;">'<tr v-for="item in items">'</span><span style="color: green; font-weight: bold;"> </span>+ <span style="color: green; font-weight: bold;">'<td v-for="prop in properties">{{item[prop]}}</td>'</span><span style="color: green; font-weight: bold;"> </span>+ <span style="color: green; font-weight: bold;">'</tr>'</span><span style="color: green; font-weight: bold;"> </span>+ <span style="color: green; font-weight: bold;">'</tbody>'</span><span style="color: green; font-weight: bold;"> </span>+ <span style="color: green; font-weight: bold;">'</table>'</span>})
<span style="color: navy; font-weight: bold;">var </span><span style="color: #660e7a; font-style: italic; font-weight: bold;">app </span>= <span style="color: navy; font-weight: bold;">new </span><span style="color: #660e7a; font-weight: bold;">Vue</span>({
<span style="color: #660e7a; font-weight: bold;">el</span>: <span style="color: green; font-weight: bold;">'#app'</span>,
<span style="color: #660e7a; font-weight: bold;">data</span>: {
<span style="color: #660e7a; font-weight: bold;">moves</span>: [],
<span style="color: #660e7a; font-weight: bold;">movesColumns</span>: [<span style="color: green; font-weight: bold;">"Guess"</span>, <span style="color: green; font-weight: bold;">"Message"</span>],
<span style="color: #660e7a; font-weight: bold;">movesProperties</span>: [<span style="color: green; font-weight: bold;">"guess"</span>, <span style="color: green; font-weight: bold;">"message"</span>],
<span style="color: #660e7a; font-weight: bold;">secret</span>: <span style="color: blue;">122</span>,
<span style="color: #660e7a; font-weight: bold;">wins</span>: <span style="color: blue;">0</span>,
<span style="color: #660e7a; font-weight: bold;">loses</span>: <span style="color: blue;">0</span>,
<span style="color: #660e7a; font-weight: bold;">guess</span>: <span style="color: blue;">123</span>,
<span style="color: #660e7a; font-weight: bold;">tries</span>: <span style="color: blue;">0</span>,
<span style="color: #660e7a; font-weight: bold;">counter</span>: <span style="color: blue;">60</span><span style="color: blue;"> </span>},
<span style="color: #660e7a; font-weight: bold;">computed</span>: {
<span style="color: #7a7a43;">total</span>: <span style="color: navy; font-weight: bold;">function </span>() {
<span style="color: navy; font-weight: bold;">return this</span>.<span style="color: #660e7a; font-weight: bold;">loses </span>+ <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">wins</span>;
}
},
<span style="color: #7a7a43;">created</span>: <span style="color: navy; font-weight: bold;">function </span>() {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">init</span>();
<span style="color: #7a7a43;">setInterval</span>(() => {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">counter</span>--;
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">counter </span><= <span style="color: blue;">0</span>) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">loses</span>++;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">init</span>(<span style="color: navy; font-weight: bold;">new </span>Move(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">secret</span>, <span style="color: green; font-weight: bold;">"You lose!"</span>));
}
}, <span style="color: blue;">1000</span>);
},
<span style="color: #660e7a; font-weight: bold;">methods</span>: {
<span style="color: #7a7a43;">createSecret</span>: <span style="color: navy; font-weight: bold;">function </span>() {
<span style="color: navy; font-weight: bold;">var </span><span style="color: #458383;">numbers </span>= [<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">createRandomDigit</span>(<span style="color: blue;">1</span>, <span style="color: blue;">9</span>)];
<span style="color: navy; font-weight: bold;">while </span>(<span style="color: #458383;">numbers</span>.<span style="color: #660e7a; font-weight: bold;">length </span>< <span style="color: blue;">3</span>) {
<span style="color: navy; font-weight: bold;">var </span><span style="color: #458383;">candidate </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">createRandomDigit</span>(<span style="color: blue;">0</span>, <span style="color: blue;">9</span>);
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">numbers</span>.<span style="color: #7a7a43;">indexOf</span>(<span style="color: #458383;">candidate</span>) === -<span style="color: blue;">1</span>)
<span style="color: #458383;">numbers</span>.<span style="color: #7a7a43;">push</span>(<span style="color: #458383;">candidate</span>);
}
<span style="color: navy; font-weight: bold;">return </span>Number(<span style="color: #458383;">numbers</span>.<span style="color: #7a7a43;">join</span>(<span style="color: green; font-weight: bold;">''</span>));
},
<span style="color: #7a7a43;">createRandomDigit</span>: <span style="color: navy; font-weight: bold;">function </span>(min, max) {
<span style="color: navy; font-weight: bold;">return </span><span style="color: #660e7a; font-style: italic; font-weight: bold;">Math</span>.<span style="color: #7a7a43;">floor</span>(<span style="color: #660e7a; font-style: italic; font-weight: bold;">Math</span>.<span style="color: #7a7a43;">random</span>() * (max - min + <span style="color: blue;">1</span>)) + min;
},
<span style="color: #7a7a43;">init</span>: <span style="color: navy; font-weight: bold;">function </span>(move) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">moves </span>= [];
<span style="color: navy; font-weight: bold;">if </span>(move !== <span style="color: #660e7a; font-weight: bold;">undefined </span>&& move !== <span style="color: navy; font-weight: bold;">null</span>) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">moves</span>.<span style="color: #7a7a43;">push</span>(move);
}
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">secret </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">createSecret</span>();
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">tries </span>= <span style="color: blue;">0</span>;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">counter </span>= <span style="color: blue;">60</span>;
},
<span style="color: #7a7a43;">evaluate</span>: <span style="color: navy; font-weight: bold;">function </span>(guess) {
guess = Array.<span style="color: #7a7a43;">from</span>(guess.<span style="color: #7a7a43;">toString</span>());
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">secret </span>= Array.<span style="color: #7a7a43;">from</span>(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">secret</span>.<span style="color: #7a7a43;">toString</span>());
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">partialMatch </span>= <span style="color: blue;">0</span>, <span style="color: #458383;">perfectMatch </span>= <span style="color: blue;">0</span>;
<span style="color: navy; font-weight: bold;">for </span>(<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">i </span><span style="color: navy; font-weight: bold;">in </span>guess) {
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">index </span>= <span style="color: #458383;">secret</span>.<span style="color: #7a7a43;">indexOf</span>(guess[<span style="color: #458383;">i</span>]);
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">index </span>== -<span style="color: blue;">1</span>) <span style="color: navy; font-weight: bold;">continue</span>;
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">index </span>== <span style="color: #458383;">i</span>) {
<span style="color: #458383;">perfectMatch</span>++;
} <span style="color: navy; font-weight: bold;">else </span>{
<span style="color: #458383;">partialMatch</span>++;
}
}
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">partialMatch </span>== <span style="color: blue;">0 </span>&& <span style="color: #458383;">perfectMatch </span>== <span style="color: blue;">0</span>) <span style="color: navy; font-weight: bold;">return </span><span style="color: green; font-weight: bold;">"No match!"</span>;
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">message </span>= <span style="color: green; font-weight: bold;">""</span>;
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">perfectMatch </span>> <span style="color: blue;">0</span>) <span style="color: #458383;">message </span>= <span style="color: green; font-weight: bold;">"+" </span>+ <span style="color: #458383;">perfectMatch</span>;
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: #458383;">partialMatch </span>> <span style="color: blue;">0</span>) <span style="color: #458383;">message </span>= <span style="color: #458383;">message </span>+ <span style="color: green; font-weight: bold;">"-" </span>+ <span style="color: #458383;">partialMatch</span>;
<span style="color: navy; font-weight: bold;">return </span><span style="color: #458383;">message</span>;
},
<span style="color: #7a7a43;">play</span>: <span style="color: navy; font-weight: bold;">function </span>() {
<span style="color: navy; font-weight: bold;">if </span>(Number(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>) === Number(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">secret</span>)) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">wins</span>++;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">init</span>(<span style="color: navy; font-weight: bold;">new </span>Move(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>, <span style="color: green; font-weight: bold;">"You win!"</span>));
<span style="color: navy; font-weight: bold;">return</span>;
}
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">tries</span>++;
<span style="color: navy; font-weight: bold;">if </span>(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">tries </span>> <span style="color: blue;">10</span>) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">loses</span>++;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">init</span>(<span style="color: navy; font-weight: bold;">new </span>Move(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">secret</span>, <span style="color: green; font-weight: bold;">"You lose!"</span>));
<span style="color: navy; font-weight: bold;">return</span>;
}
<span style="color: navy; font-weight: bold;">let </span><span style="color: #458383;">message </span>= <span style="color: navy; font-weight: bold;">this</span>.<span style="color: #7a7a43;">evaluate</span>(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>);
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">moves</span>.<span style="color: #7a7a43;">push</span>(<span style="color: navy; font-weight: bold;">new </span>Move(<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">guess</span>, <span style="color: #458383;">message</span>));
}
}
});</pre>
<br />
<b><span style="font-family: "georgia" , "times new roman" , serif;"><u>index.html</u>:</span></b><br />
<pre style="background-color: white; font-family: "Courier New"; font-size: 10.5pt;"><span style="background-color: #efefef;"><!DOCTYPE </span><span style="background-color: #efefef; color: blue; font-weight: bold;">html</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">html </span><span style="background-color: #efefef; color: blue; font-weight: bold;">lang=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"en"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">head</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">meta </span><span style="background-color: #efefef; color: blue; font-weight: bold;">charset=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"UTF-8"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">title</span><span style="background-color: #efefef;">></span>Mastermind (vue)<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">title</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">style </span><span style="background-color: #efefef; color: blue; font-weight: bold;">type=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"text/css"</span><span style="background-color: #efefef;">></span>
<span style="color: navy; font-weight: bold;">@import url</span>(<span style="color: green; font-weight: bold;">'node_modules/bootstrap/dist/css/bootstrap.css'</span>);
<span style="color: navy; font-weight: bold;">@import url</span>(<span style="color: green; font-weight: bold;">'node_modules/bootstrap/dist/css/bootstrap-theme.css'</span>);
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">style</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">script </span><span style="background-color: #efefef; color: blue; font-weight: bold;">type=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"application/javascript" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">src=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"node_modules/jquery/dist/jquery.js"</span><span style="background-color: #efefef;">></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">script</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">script </span><span style="background-color: #efefef; color: blue; font-weight: bold;">type=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"application/javascript" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">src=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"node_modules/bootstrap/dist/js/bootstrap.js"</span><span style="background-color: #efefef;">></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">script</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">script </span><span style="background-color: #efefef; color: blue; font-weight: bold;">type=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"application/javascript" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">src=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"node_modules/vue/dist/vue.js"</span><span style="background-color: #efefef;">></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">script</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">head</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">body</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">p</span><span style="background-color: #efefef;">/></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">id=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"app" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"container" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">role=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"main"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"row col-md-4"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel panel-primary"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel-heading"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">h3 </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel-title"</span><span style="background-color: #efefef;">></span>Game Console<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">h3</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel-body"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label </span><span style="background-color: #efefef; color: blue; font-weight: bold;">for=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"guess"</span><span style="background-color: #efefef;">></span>Guess:<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">input </span><span style="background-color: #efefef; color: blue; font-weight: bold;">id=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"guess" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">v-model=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"guess" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"form-control" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">type=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"text"</span><span style="background-color: #efefef;">/></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">button </span><span style="background-color: #efefef; color: blue; font-weight: bold;">id=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"playButton" </span><span style="background-color: #efefef; color: #660e7a; font-weight: bold;">v-on</span><span style="background-color: #efefef; color: blue; font-weight: bold;">:click=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"play" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"btn btn-success"</span><span style="background-color: #efefef;">></span>Play<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">button</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"row"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"col-md-2"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel panel-primary"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel-heading"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">h3 </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel-title"</span><span style="background-color: #efefef;">></span>Game Statistics<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">h3</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel-body"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"form-group"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label </span><span style="background-color: #efefef; color: blue; font-weight: bold;">for=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"counter"</span><span style="background-color: #efefef;">></span>Counter:<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span </span><span style="background-color: #efefef; color: blue; font-weight: bold;">id=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"counter"</span><span style="background-color: #efefef;">></span>{{counter}}<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"form-group"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label </span><span style="background-color: #efefef; color: blue; font-weight: bold;">for=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"tries"</span><span style="background-color: #efefef;">></span>Tries:<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span </span><span style="background-color: #efefef; color: blue; font-weight: bold;">id=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"tries"</span><span style="background-color: #efefef;">></span>{{tries}}<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"form-group"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label </span><span style="background-color: #efefef; color: blue; font-weight: bold;">for=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"wins"</span><span style="background-color: #efefef;">></span>Wins:<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span </span><span style="background-color: #efefef; color: blue; font-weight: bold;">id=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"wins"</span><span style="background-color: #efefef;">></span>{{wins}}<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"form-group"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label </span><span style="background-color: #efefef; color: blue; font-weight: bold;">for=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"loses"</span><span style="background-color: #efefef;">></span>Loses:<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span </span><span style="background-color: #efefef; color: blue; font-weight: bold;">id=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"loses"</span><span style="background-color: #efefef;">></span>{{loses}}<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"form-group"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label </span><span style="background-color: #efefef; color: blue; font-weight: bold;">for=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"total"</span><span style="background-color: #efefef;">></span>Total:<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">label</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span </span><span style="background-color: #efefef; color: blue; font-weight: bold;">id=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"total"</span><span style="background-color: #efefef;">></span>{{total}}<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">span</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"col-md-3"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel panel-primary"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel-heading"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">h3 </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel-title"</span><span style="background-color: #efefef;">></span>Moves<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">h3</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div </span><span style="background-color: #efefef; color: blue; font-weight: bold;">class=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"panel-body"</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">utable </span><span style="background-color: #efefef; color: #660e7a; font-weight: bold;">v-bind</span><span style="background-color: #efefef; color: blue; font-weight: bold;">:items=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"moves"</span><span style="background-color: #efefef; color: green; font-weight: bold;"> </span><span style="background-color: #efefef; color: #660e7a; font-weight: bold;">v-bind</span><span style="background-color: #efefef; color: blue; font-weight: bold;">:columns=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"movesColumns"</span><span style="background-color: #efefef; color: green; font-weight: bold;"> </span><span style="background-color: #efefef; color: #660e7a; font-weight: bold;">v-bind</span><span style="background-color: #efefef; color: blue; font-weight: bold;">:properties=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"movesProperties"</span><span style="background-color: #efefef;">></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">utable</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">div</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"><</span><span style="background-color: #efefef; color: navy; font-weight: bold;">script </span><span style="background-color: #efefef; color: blue; font-weight: bold;">type=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"application/javascript" </span><span style="background-color: #efefef; color: blue; font-weight: bold;">src=</span><span style="background-color: #efefef; color: green; font-weight: bold;">"js/game.js"</span><span style="background-color: #efefef;">></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">script</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">body</span><span style="background-color: #efefef;">></span>
<span style="background-color: #efefef;"></</span><span style="background-color: #efefef; color: navy; font-weight: bold;">html</span><span style="background-color: #efefef;">></span></pre>
<br />
<span style="font-family: Georgia, Times New Roman, serif;">You can download the <i><b>Vue js implementation</b></i> of the game using <a href="http://www.omegaegitim.com/sources/mastermind-vue.zip" target="_blank">this link</a>.</span>Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com2tag:blogger.com,1999:blog-2756890279096274314.post-53805221429324283972017-10-25T14:06:00.000+03:002017-10-25T14:18:45.346+03:00JMeter ile Dağıtık Yük Testi Çalıştırmak<span style="font-family: "georgia" , "times new roman" , serif;"><b>jMeter </b>ile web uygulamalarının yük testini dağıtık olarak gerçekleştirmek mümkündür. Bunun için öncelikle, <b>jMeter </b>testini koşturmak istediğiniz düğümlerde, <b>jMeter</b>'ı sunucu (<b>jmeter-server</b>) olarak çalıştırmalısınız. Örneğimizde, dört ayrı düğümde çalıştırmak yerine, aynı makinada dört <b>jmeter-server</b> prosesi çalıştıracağız. <b>jmeter-server</b> prosesinin belirli bir ağ adresini dinlemesi ve varsayılan port dışında bir portta çalışması için <b>java.rmi.server.hostname</b> ve <b>server_port</b> parametrelerinden yararlanıyoruz:</span><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Düğüm #1</b></span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br />
</b></span> <br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">jmeter-server -Djava.rmi.server.hostname=172.17.1.10 -Dserver_port=4100</span>
<span style="color: #888888;">Found ApacheJMeter_core.jar</span>
<span style="color: #888888;">Created remote object: UnicastServerRef [liveRef: [endpoint:[172.17.1.49:8832](local),objID:[-78bd43b9:15f531d5d0d:-7fff,-1004316542313261762]]]</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Düğüm #2</b></span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br />
</b></span> <br />
<div style="background: rgb(255, 255, 255); border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 16.25px;"><span style="color: #888888;">jmeter-server -Djava.rmi.server.hostname=172.17.1.10 -Dserver_port=4200</span>
<span style="color: #888888;">Found ApacheJMeter_core.jar</span>
<span style="color: #888888;">Created remote object: UnicastServerRef [liveRef: [endpoint:[172.17.1.49:8833](local),objID:[-7fb12730:15f532b1e7d:-7fff, -2674299161861049649]]]</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Düğüm #3</b></span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br />
</b></span> <br />
<div style="background: rgb(255, 255, 255); border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 16.25px;"><span style="color: #888888;">jmeter-server -Djava.rmi.server.hostname=172.17.1.10 -Dserver_port=4300</span>
<span style="color: #888888;">Found ApacheJMeter_core.jar</span>
<span style="color: #888888;">Created remote object: UnicastServerRef [liveRef: [endpoint:[172.17.1.49:8834](local),objID:[-14a765f7:15f532b3e5b:-7fff, 7046302240035060005]]]</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Düğüm #4</b></span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br />
</b></span> <br />
<div style="background: rgb(255, 255, 255); border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 16.25px;"><span style="color: #888888;">jmeter-server -Djava.rmi.server.hostname=172.17.1.10 -Dserver_port=4400</span>
<span style="color: #888888;">Found ApacheJMeter_core.jar</span>
<span style="color: #888888;">Created remote object: UnicastServerRef [liveRef: [endpoint:[172.17.1.49:8835](local),objID:[-467ada28:15f532b536b:-7fff, 4333599663267891393]]]</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Ardından <b>jmx </b>testini aşağıdaki gibi dağıtık olarak çalıştırabiliriz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">jmeter -n -t google.jmx -R172.17.1.10:4100,172.17.1.10:4200,172.17.1.10:4300,172.17.1.10:4400</span>
<span style="color: #888888;">Creating summariser <summary></span>
<span style="color: #888888;">Created the tree successfully using google.jmx</span>
<span style="color: #888888;">Configuring remote engine: 172.17.1.49:4100</span>
<span style="color: #888888;">Configuring remote engine: 172.17.1.49:4200</span>
<span style="color: #888888;">Configuring remote engine: 172.17.1.49:4300</span>
<span style="color: #888888;">Configuring remote engine: 172.17.1.49:4400</span>
<span style="color: #888888;">Starting remote engines</span>
<span style="color: #888888;">Starting the test @ Wed Oct 25 13:55:34 EET 2017 (1508928934095)</span>
<span style="color: #888888;">Remote engines have been started</span>
<span style="color: #888888;">Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445</span>
<span style="color: #888888;">Generate Summary Results + 2940 in 00:00:23 = 125.8/s Avg: 443 Min: 1 Max: 10820 Err: 0 (0.00%) Active: 118 Started: 108 Finished: 0</span>
<span style="color: #888888;">summary + 2942 in 00:00:23 = 127.4/s Avg: 443 Min: 1 Max: 10820 Err: 0 (0.00%) Active: 118 Started: 108 Finished: 0</span>
<span style="color: #888888;">Generate Summary Results + 9772 in 00:00:30 = 327.2/s Avg: 230 Min: 1 Max: 4093 Err: 0 (0.00%) Active: 169 Started: 169 Finished: 10</span>
<span style="color: #888888;">summary + 9770 in 00:00:30 = 328.4/s Avg: 230 Min: 1 Max: 4093 Err: 0 (0.00%) Active: 169 Started: 169 Finished: 10</span>
<span style="color: #888888;">summary = 12712 in 00:00:53 = 240.6/s Avg: 279 Min: 1 Max: 10820 Err: 0 (0.00%)</span>
<span style="color: #888888;">Generate Summary Results = 12712 in 00:00:53 = 238.8/s Avg: 280 Min: 1 Max: 10820 Err: 0 (0.00%)</span>
<span style="color: #888888;">Generate Summary Results + 11338 in 00:00:30 = 378.0/s Avg: 395 Min: 1 Max: 44910 Err: 3190 (28.14%) Active: 100 Started: 190 Finished: 100</span>
<span style="color: #888888;">Generate Summary Results = 24050 in 00:01:23 = 289.0/s Avg: 334 Min: 1 Max: 44910 Err: 3190 (13.26%)</span>
<span style="color: #888888;">summary + 11338 in 00:00:30 = 378.1/s Avg: 396 Min: 1 Max: 44910 Err: 3190 (28.14%) Active: 100 Started: 190 Finished: 100</span>
<span style="color: #888888;">summary = 24050 in 00:01:23 = 290.4/s Avg: 334 Min: 1 Max: 44910 Err: 3190 (13.26%)</span>
<span style="color: #888888;">summary + 5950 in 00:00:19 = 308.0/s Avg: 237 Min: 1 Max: 3149 Err: 2004 (33.68%) Active: 0 Started: 190 Finished: 200</span>
<span style="color: #888888;">summary = 30000 in 00:01:42 = 293.7/s Avg: 315 Min: 1 Max: 44910 Err: 5194 (17.31%)</span>
<span style="color: #888888;">Generate Summary Results + 5950 in 00:00:19 = 307.8/s Avg: 237 Min: 1 Max: 3149 Err: 2004 (33.68%) Active: 0 Started: 190 Finished: 200</span>
<span style="color: #888888;">Generate Summary Results = 30000 in 00:01:43 = 292.5/s Avg: 315 Min: 1 Max: 44910 Err: 5194 (17.31%)</span>
<span style="color: #888888;">Tidying up remote @ Wed Oct 25 13:57:19 EET 2017 (1508929039353)</span>
<span style="color: #888888;">... end of run</span>
</pre>
</div>
<br />
<span style="font-family: Georgia, Times New Roman, serif;">Düğümlerde, test isteğinin alındığını, testin başlatıldığını ve sonlandığını konsol logundan izleyebilirsiniz:</span><br />
<br />
<span style="font-family: Georgia, Times New Roman, serif;"><b>Düğüm #1</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">Found ApacheJMeter_core.jar</span>
<span style="color: #888888;">Created remote object: UnicastServerRef [liveRef: [endpoint:[172.17.1.49:8939](local),objID:[4b4db1f4:15f532af954:-7fff, -616991648860323928]]]</span>
<span style="color: #888888;">Starting the test on host 172.17.1.10:4100 @ Wed Oct 25 13:55:41 EET 2017 (1508928941579)</span>
<span style="color: #888888;">Finished the test on host 172.17.1.10:4100 @ Wed Oct 25 13:57:19 EET 2017 (1508929039355)</span>
</pre>
</div>
<br />
<span style="font-family: Georgia, Times New Roman, serif;"><b>Düğüm #2</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">Found ApacheJMeter_core.jar</span>
<span style="color: #888888;">Created remote object: UnicastServerRef [liveRef: [endpoint:[172.17.1.49:8940](local),objID:[-7fb12730:15f532b1e7d:-7fff, -2674299161861049649]]]</span>
<span style="color: #888888;">Starting the test on host 172.17.1.10:4200 @ Wed Oct 25 13:55:36 EET 2017 (1508928936705)</span>
<span style="color: #888888;">Finished the test on host 172.17.1.10:4200 @ Wed Oct 25 13:56:47 EET 2017 (1508929007679)</span>
</pre>
</div>
<br />
<span style="font-family: Georgia, Times New Roman, serif;"><b>Düğüm #3</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">Found ApacheJMeter_core.jar</span>
<span style="color: #888888;">Created remote object: UnicastServerRef [liveRef: [endpoint:[172.17.1.49:8941](local),objID:[-14a765f7:15f532b3e5b:-7fff, 7046302240035060005]]]</span>
<span style="color: #888888;">Starting the test on host 172.17.1.10:4300 @ Wed Oct 25 13:55:38 EET 2017 (1508928938426)</span>
<span style="color: #888888;">Finished the test on host 172.17.1.10:4300 @ Wed Oct 25 13:57:13 EET 2017 (1508929033828)</span>
</pre>
</div>
<br />
<span style="font-family: Georgia, Times New Roman, serif;"><b>Düğüm #4</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">Found ApacheJMeter_core.jar</span>
<span style="color: #888888;">Created remote object: UnicastServerRef [liveRef: [endpoint:[172.17.1.49:8942](local),objID:[-467ada28:15f532b536b:-7fff, 4333599663267891393]]]</span>
<span style="color: #888888;">Starting the test on host 172.17.1.10:4400 @ Wed Oct 25 13:55:35 EET 2017 (1508928935776)</span>
<span style="color: #888888;">Finished the test on host 172.17.1.10:4400 @ Wed Oct 25 13:56:41 EET 2017 (1508929001484)</span>
</pre>
</div>
<br />
<br />Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-23634535270567653232017-10-21T13:04:00.001+03:002017-10-28T09:07:28.511+03:00Exercises to study Java Stream API<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiP4GY7OEMmEazhZmAaiYEi7ex3lHWsLLCctr3ag7-WNBXG9-oLdVJNKaoYJpsZR5gCohLkPKk0A62wN82FUejeEA03Qz2SL2g995icLqYHuRbG-0kQZkMws7EUln7znXcwT7FHc8FA-0IF/s1600/stream-api.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="228" data-original-width="639" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiP4GY7OEMmEazhZmAaiYEi7ex3lHWsLLCctr3ag7-WNBXG9-oLdVJNKaoYJpsZR5gCohLkPKk0A62wN82FUejeEA03Qz2SL2g995icLqYHuRbG-0kQZkMws7EUln7znXcwT7FHc8FA-0IF/s1600/stream-api.png" /></a></div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">In this blog post, we will study <b>Stream API</b> of <b>Java 9</b> with several exercise questions. In these exercises, we will use two different domains: </span><br />
<ul>
<li><b style="font-family: georgia, "times new roman", serif;">IMDB Movies</b></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>World Countries</b></span></li>
</ul>
<span style="font-family: "georgia" , "times new roman" , serif;">Before we dive into the exercise questions, let's take a look at these domains:</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br />
</b></span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>IMDB Movies: </b>We have three domain classes: <b>Movie</b>, <b>Director </b>and <b>Genre</b>. Each movie has a title, a year and a unique id assigned by <a href="http://www.imdb.com/" target="_blank">Internet Movie DataBase</a> (IMDB). Each movie has been directed by at least one director, and each director has many movies. Each movie belongs to at least one genre.</span><br />
<br />
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">package </span>com.example.domain;
<span style="color: navy; font-weight: bold;">import </span>java.util.ArrayList;
<span style="color: navy; font-weight: bold;">import </span>java.util.List;
<span style="color: navy; font-size: 10.5pt; font-weight: bold;">
</span></pre>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-size: 10.5pt; font-weight: bold;">public class </span><span style="font-size: 10.5pt;">Movie {</span>
</pre>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">private int </span><span style="color: #660e7a; font-weight: bold;">id</span>;
<span style="color: navy; font-weight: bold;">private </span>String <span style="color: #660e7a; font-weight: bold;">title</span>;
<span style="color: navy; font-weight: bold;">private int </span><span style="color: #660e7a; font-weight: bold;">year</span>;
<span style="color: navy; font-weight: bold;">private </span>String <span style="color: #660e7a; font-weight: bold;">imdb</span>;
<span style="color: navy; font-weight: bold;">private </span>List<Genre> <span style="color: #660e7a; font-weight: bold;">genres</span>;
<span style="color: navy; font-weight: bold;">private </span>List<Director> <span style="color: #660e7a; font-weight: bold;">directors</span>;
{
<span style="color: #660e7a; font-weight: bold;">genres </span>= <span style="color: navy; font-weight: bold;">new </span>ArrayList<>();
<span style="color: #660e7a; font-weight: bold;">directors </span>= <span style="color: navy; font-weight: bold;">new </span>ArrayList<>();
}
<span style="color: navy; font-weight: bold;">public </span>Movie() {
}
<span style="color: navy; font-weight: bold;">public </span>Movie(<span style="color: navy; font-weight: bold;">int </span>id, String title, <span style="color: navy; font-weight: bold;">int </span>year, String imdb) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">id </span>= id;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">title </span>= title;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">year </span>= year;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">imdb </span>= imdb;
}
<span style="color: navy;"><b>// getters and setters</b></span>
<span style="color: olive;">@Override</span><span style="color: olive;"> </span></pre>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;"> public </span>String toString() {
<span style="color: navy; font-weight: bold;">return </span><span style="color: green; font-weight: bold;">"Movie [title=" </span>+ <span style="color: #660e7a; font-weight: bold;">title </span>+ <span style="color: green; font-weight: bold;">", year=" </span>+ <span style="color: #660e7a; font-weight: bold;">year</span><span style="color: #660e7a; font-weight: bold;"> </span>+ <span style="color: green; font-weight: bold;">"]"</span>;
}
</pre>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;">}</pre>
<br />
<br />
<span style="color: navy; font-family: "consolas"; font-size: 10.5pt; font-weight: bold;">package </span><span style="background-color: white; font-family: "consolas"; font-size: 10.5pt;">com.example.domain;</span><br />
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">import </span>java.util.ArrayList;
<span style="color: navy; font-weight: bold;">import </span>java.util.List;
<span style="color: navy; font-weight: bold;">public class </span>Director {
<span style="color: navy; font-weight: bold;">private int </span><span style="color: #660e7a; font-weight: bold;">id</span>;
<span style="color: navy; font-weight: bold;">private </span>String <span style="color: #660e7a; font-weight: bold;">name</span>;
<span style="color: navy; font-weight: bold;">private </span>String <span style="color: #660e7a; font-weight: bold;">imdb</span>;
<span style="color: navy; font-weight: bold;">private </span>List<Movie> <span style="color: #660e7a; font-weight: bold;">movies</span>= <span style="color: navy; font-weight: bold;">new </span>ArrayList<>();
<span style="color: navy; font-weight: bold;">public </span>Director() {
}
<span style="color: navy; font-weight: bold;">public </span>Director(<span style="color: navy; font-weight: bold;">int </span>id, String name, String imdb) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">id </span>= id;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">name </span>= name;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">imdb </span>= imdb;
}
<span style="color: navy; font-size: 10.5pt;"><b>// getters and setters</b></span></pre>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: olive;"> @Override</span><span style="color: olive;"> </span></pre>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;"> public </span>String toString() {
<span style="color: navy; font-weight: bold;">return </span><span style="color: green; font-weight: bold;">"Director [id=" </span>+ <span style="color: #660e7a; font-weight: bold;">id </span>+ <span style="color: green; font-weight: bold;">", name=" </span>+ <span style="color: #660e7a; font-weight: bold;">name </span>+ <span style="color: green; font-weight: bold;">", imdb=" </span>+ <span style="color: #660e7a; font-weight: bold;">imdb </span>+ <span style="color: green; font-weight: bold;">"]"</span>;
}
}</pre>
<br />
<span style="color: navy; font-family: "consolas"; font-size: 10.5pt; font-weight: bold;">package </span><span style="background-color: white; font-family: "consolas"; font-size: 10.5pt;">com.example.domain;</span><br />
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">public class </span>Genre {
<span style="color: navy; font-weight: bold;">private int </span><span style="color: #660e7a; font-weight: bold;">id</span>;
<span style="color: navy; font-weight: bold;">private </span>String <span style="color: #660e7a; font-weight: bold;">name</span>;
<span style="color: navy; font-weight: bold;">public </span>Genre() {
}
<span style="color: navy; font-weight: bold;">public </span>Genre(<span style="color: navy; font-weight: bold;">int </span>id, String name) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">id </span>= id;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">name </span>= name;
}
<pre style="font-family: consolas; font-size: 10.5pt;"><span style="color: navy;"><b> // getters and setters</b></span></pre>
<span style="color: olive;"> @Override</span><span style="color: olive;"> </span></pre>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;"> public </span>String toString() {
<span style="color: navy; font-weight: bold;">return </span><span style="color: green; font-weight: bold;">"Genre [id=" </span>+ <span style="color: #660e7a; font-weight: bold;">id </span>+ <span style="color: green; font-weight: bold;">", name=" </span>+ <span style="color: #660e7a; font-weight: bold;">name </span>+ <span style="color: green; font-weight: bold;">"]"</span>;
}
}</pre>
<br />
<b style="font-family: georgia, "times new roman", serif;">World Countries: </b><span style="font-family: "georgia" , "times new roman" , serif;">There are two domain classes: <b>Country </b>and <b>City</b>. Each <b><i>city </i></b>belongs to a <b><i>country </i></b>defined by the <i>attribute</i>, <b><i>countryCode</i></b>. Each <b><i>country </i></b>has a unique <b>code </b>and has many <b>cities</b>.</span><br />
<div>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">
</span></pre>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">package </span>com.example.domain;
<span style="color: navy; font-weight: bold;">import </span>java.util.ArrayList;
<span style="color: navy; font-weight: bold;">import </span>java.util.List;
<span style="color: grey; font-style: italic;">
</span><span style="color: navy; font-weight: bold;">public class </span>Country {
<span style="color: navy; font-weight: bold;">private </span>String <span style="color: #660e7a; font-weight: bold;">code</span>;
<span style="color: navy; font-weight: bold;">private </span>String <span style="color: #660e7a; font-weight: bold;">name</span>;
<span style="color: navy; font-weight: bold;">private </span>String <span style="color: #660e7a; font-weight: bold;">continent</span>;
<span style="color: navy; font-weight: bold;">private double </span><span style="color: #660e7a; font-weight: bold;">surfaceArea</span>;
<span style="color: navy; font-weight: bold;">private int </span><span style="color: #660e7a; font-weight: bold;">population</span>;
<span style="color: navy; font-weight: bold;">private double </span><span style="color: #660e7a; font-weight: bold;">gnp</span>;
<span style="color: navy; font-weight: bold;">private int </span><span style="color: #660e7a; font-weight: bold;">capital</span>;
<span style="color: navy; font-weight: bold;">private </span>List<City> <span style="color: #660e7a; font-weight: bold;">cities</span>;
{
<span style="color: #660e7a; font-weight: bold;">cities </span>= <span style="color: navy; font-weight: bold;">new </span>ArrayList<>();
}
<span style="color: navy; font-weight: bold;">public </span>Country() {
}
<span style="color: navy; font-weight: bold;">public </span>Country(String code, String name, String continent, <span style="color: navy; font-weight: bold;">int </span>population,
<span style="color: navy; font-weight: bold;">double </span>surfaceArea, <span style="color: navy; font-weight: bold;">double </span>gnp, <span style="color: navy; font-weight: bold;">int </span>capital) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">code </span>= code;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">name </span>= name;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">continent </span>= continent;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">surfaceArea </span>= surfaceArea;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">population </span>= population;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">capital </span>= capital;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">gnp </span>= gnp;
}
<pre style="font-family: consolas; font-size: 10.5pt;"><span style="color: navy;"><b> // getters and setters</b></span>
</pre>
</pre>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: olive;"> @Override</span><span style="color: olive;"> </span></pre>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;"> public </span>String toString() {
<span style="color: navy; font-weight: bold;">return </span><span style="color: green; font-weight: bold;">"Country [ name=" </span>+ <span style="color: #660e7a; font-weight: bold;">name </span>+ <span style="color: green; font-weight: bold;">", population="</span><span style="color: green; font-weight: bold;"> </span>+ <span style="color: #660e7a; font-weight: bold;">population </span>+ <span style="color: green; font-weight: bold;">"]"</span>;
}
}</pre>
<br />
<span style="color: navy; font-family: "consolas"; font-size: 10.5pt; font-weight: bold;">package </span><span style="background-color: white; font-family: "consolas"; font-size: 10.5pt;">com.example.domain;</span><br />
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: grey; font-style: italic;">
</span><span style="color: navy; font-weight: bold;">public class </span>City {
<span style="color: navy; font-weight: bold;">private int </span><span style="color: #660e7a; font-weight: bold;">id</span>;
<span style="color: navy; font-weight: bold;">private </span>String <span style="color: #660e7a; font-weight: bold;">name</span>;
<span style="color: navy; font-weight: bold;">private int </span><span style="color: #660e7a; font-weight: bold;">population</span>;
<span style="color: navy; font-weight: bold;">private </span>String <span style="color: #660e7a; font-weight: bold;">countryCode</span>;
<span style="color: navy; font-weight: bold;">public </span>City() {
}
<span style="color: navy; font-weight: bold;">public </span>City(<span style="color: navy; font-weight: bold;">int </span>id, String name, String countryCode, <span style="color: navy; font-weight: bold;">int </span>population) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">id </span>= id;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">name </span>= name;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">population </span>= population;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">countryCode </span>= countryCode;
}
<span style="color: navy; font-size: 10.5pt;"><b>// getters and setters</b></span>
</pre>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: olive;"> @Override</span><span style="color: olive;"> </span></pre>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;"> public </span>String toString() {
<span style="color: navy; font-weight: bold;">return </span><span style="color: green; font-weight: bold;">"City [id=" </span>+ <span style="color: #660e7a; font-weight: bold;">id </span>+ <span style="color: green; font-weight: bold;">", name=" </span>+ <span style="color: #660e7a; font-weight: bold;">name </span>+ <span style="color: green; font-weight: bold;">", population="</span><span style="color: green; font-weight: bold;"> </span>+ <span style="color: #660e7a; font-weight: bold;">population </span>+ <span style="color: green; font-weight: bold;">", countryCode=" </span>+ <span style="color: #660e7a; font-weight: bold;">countryCode </span>+ <span style="color: green; font-weight: bold;">"]"</span>;
};
}</pre>
<br />
<b><span style="font-family: "georgia" , "times new roman" , serif; font-size: medium;">EXERCISE #1</span></b><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><u>Find the highest populated city of each country</u>:</span></div>
<div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></div>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">package </span>com.example.exercise;
<span style="color: navy; font-weight: bold;">import </span>java.util.Comparator;
<span style="color: navy; font-weight: bold;">import </span>java.util.List;
<span style="color: navy; font-weight: bold;">import </span>java.util.Optional;
<span style="color: navy; font-weight: bold;">import </span>java.util.stream.Collectors;
<span style="color: navy; font-weight: bold;">import </span>com.example.dao.CountryDao;
<span style="color: navy; font-weight: bold;">import </span>com.example.dao.InMemoryWorldDao;
<span style="color: navy; font-weight: bold;">import </span>com.example.domain.City;
<span style="color: navy; font-weight: bold;">public class </span>Exercise1 {
<span style="color: navy; font-weight: bold;">public static void </span>main(String[] args) {
CountryDao countryDao= InMemoryWorldDao.<span style="font-style: italic;">getInstance</span>();
List<City> highPopulatedCitiesOfCountries = countryDao.findAllCountries()
.stream()
.map( country -> country.getCities().stream().max(Comparator.<span style="font-style: italic;">comparing</span>(City::getPopulation)))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.<span style="font-style: italic;">toList</span>());
highPopulatedCitiesOfCountries.forEach(System.<span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>::println);
}
}</pre>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">The code given above will produce the following output:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">City [id=3494, name=Auckland, population=381800, countryCode=NZL]</span>
<span style="color: #888888;">City [id=764, name=Suva, population=77366, countryCode=FJI]</span>
<span style="color: #888888;">City [id=2884, name=Port Moresby, population=247000, countryCode=PNG]</span>
<span style="color: #888888;">City [id=918, name=Les Abymes, population=62947, countryCode=GLP]</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">City [id=4067, name=Charlotte Amalie, population=13000, countryCode=VIR]</span>
<span style="color: #888888;">City [id=712, name=Cape Town, population=2352121, countryCode=ZAF]</span>
<span style="color: #888888;">City [id=538, name=Bandar Seri Begawan, population=21484, countryCode=BRN]</span>
<span style="color: #888888;">City [id=933, name=Tegucigalpa, population=813900, countryCode=HND]</span>
</pre>
</div>
<br />
<b><span style="font-family: "georgia" , "times new roman" , serif; font-size: medium;">EXERCISE #2</span></b><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><u>Find the most populated city of each continent</u></span><span style="font-family: "georgia" , "times new roman" , serif;">:</span><br />
<br />
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><pre style="font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">package </span>com.example.exercise;
<span style="color: navy; font-weight: bold;">import </span>java.util.Comparator;
<span style="color: navy; font-weight: bold;">import </span>java.util.Map;
<span style="color: navy; font-weight: bold;">import </span>java.util.Map.Entry;
<span style="color: navy; font-weight: bold;">import </span>java.util.Optional;
<span style="color: navy; font-weight: bold;">import </span>java.util.function.BiConsumer;
<span style="color: navy; font-weight: bold;">import </span>java.util.function.Consumer;
<span style="color: navy; font-weight: bold;">import </span>java.util.function.Predicate;
<span style="color: navy; font-weight: bold;">import </span>java.util.stream.Collector;
<span style="color: navy; font-weight: bold;">import </span>java.util.stream.Collectors;
<span style="color: navy; font-weight: bold;">import </span>com.example.dao.CountryDao;
<span style="color: navy; font-weight: bold;">import </span>com.example.dao.InMemoryWorldDao;
<span style="color: navy; font-weight: bold;">import </span>com.example.domain.City;
<span style="color: grey; font-style: italic;">
</span><span style="color: navy; font-weight: bold;">public class </span>Exercise2 {
<span style="color: navy; font-weight: bold;">public static void </span>main(String[] args) {
<span style="color: grey; font-style: italic;"> </span>CountryDao countryDao = InMemoryWorldDao.<span style="font-style: italic;">getInstance</span>();
<span style="color: navy; font-weight: bold;">final </span>Predicate<Entry<String, Optional<City>>> isPresent = entry -> entry.getValue().isPresent();
<span style="color: navy; font-weight: bold;">final </span>BiConsumer<String, Optional<City>> printEntry =
(k,v) -> {
City city = v.get();
System.<span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>.println(k + <span style="color: green; font-weight: bold;">": City [ name= " </span>+ city.getName() + <span style="color: green; font-weight: bold;">", population= " </span>+ city.getPopulation() + <span style="color: green; font-weight: bold;">" ]"</span>);
};
Collector<City, ?, Map<String, Optional<City>>> groupingHighPopulatedCitiesByContinent = Collectors.<span style="font-style: italic;">groupingBy</span>(city -> <span style="color: #660e7a;">countryDao</span>.findCountryByCode(city.getCountryCode()).getContinent(), Collectors.<span style="font-style: italic;">maxBy</span>(Comparator.<span style="font-style: italic;">comparing</span>(City::getPopulation)));
Map<String, Optional<City>> highPopulatedCitiesByContinent = countryDao.findAllCountries()
.stream()
.flatMap(country -> country.getCities().stream())
.collect(groupingHighPopulatedCitiesByContinent);
highPopulatedCitiesByContinent.forEach(printEntry);
}
}</pre>
</pre>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">The code given above will produce the following output:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">South America: City [ name= SÆo Paulo, population= 9968485 ]</span>
<span style="color: #888888;">Asia: City [ name= Mumbai (Bombay), population= 10500000 ]</span>
<span style="color: #888888;">Europe: City [ name= Moscow, population= 8389200 ]</span>
<span style="color: #888888;">Africa: City [ name= Cairo, population= 6789479 ]</span>
<span style="color: #888888;">North America: City [ name= Ciudad de M‚xico, population= 8591309 ]</span>
<span style="color: #888888;">Oceania: City [ name= Sydney, population= 3276207 ]</span>
</pre>
</div>
<br />
<br />
<b><span style="font-family: "georgia" , "times new roman" , serif; font-size: medium;">EXERCISE #3</span></b><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><u>Find the number of movies of each director</u></span><span style="font-family: "georgia" , "times new roman" , serif;">:</span><span style="font-family: "georgia" , "times new roman" , serif;"> Try to solve this problem by assuming that <b>Director </b>class has not the member<b><i> movies</i></b>. </span><br />
<br />
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><pre style="font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">package </span>com.example.exercise;
<span style="color: navy; font-weight: bold;">import </span>java.util.Collection;
<span style="color: navy; font-weight: bold;">import </span>java.util.List;
<span style="color: navy; font-weight: bold;">import </span>java.util.Map;
<span style="color: navy; font-weight: bold;">import </span>java.util.stream.Collectors;
<span style="color: navy; font-weight: bold;">import </span>com.example.domain.Director;
<span style="color: navy; font-weight: bold;">import </span>com.example.domain.Movie;
<span style="color: navy; font-weight: bold;">import </span>com.example.service.InMemoryMovieService;
<span style="color: navy; font-weight: bold;">import </span>com.example.service.MovieService;
<span style="color: navy; font-weight: bold;">public class </span>Exercise3 {
<span style="color: navy; font-weight: bold;">public static void </span>main(String[] args) {
<span style="color: grey; font-style: italic;"> </span>MovieService movieService = InMemoryMovieService.<span style="font-style: italic;">getInstance</span>();
Collection<Movie> movies = movieService.findAllMovies();
Map<String, Long> directorMovieCounts =
movies.stream()
.map(Movie::getDirectors)
.flatMap(List::stream)
.collect(Collectors.<span style="font-style: italic;">groupingBy</span>(Director::getName, Collectors.<span style="font-style: italic;">counting</span>()));
directorMovieCounts.entrySet().forEach(System.<span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>::println);
}
}</pre>
</pre>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"></pre>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">The code given above will produce the following output:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">Sam Taylor Wood=1</span>
<span style="color: #888888;">F. Gary Gray=1</span>
<span style="color: #888888;">Oliver Hirschbiegel=1</span>
<span style="color: #888888;">Scott Cooper=1</span>
<span style="color: #888888;">Katherine Dieckmann=1</span>
<span style="color: #888888;">Kevin Macdonald=1</span>
<span style="color: #888888;">Peter Jackson=2</span>
<span style="color: #888888;">Andy Tennant=1</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">Isabel Coixet=1</span>
<span style="color: #888888;">Jason Reitman=1</span>
<span style="color: #888888;">Louie Psihoyos=1</span>
<span style="color: #888888;">Brian De Palma=1</span>
<span style="color: #888888;">Jay DiPietro=1</span></pre>
</div>
<br />
<h2>
<b><span style="font-family: "georgia" , "times new roman" , serif; font-size: small;">EXERCISE #4</span></b></h2>
<br />
<span style="font-size: small;"><span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Find the number of genres of each director's movies</u></b></span><b style="font-family: georgia, "times new roman", serif;">:</b></span><br />
<br />
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">package </span>com.example.exercise;
<span style="color: navy; font-weight: bold;">import </span>java.util.Collection;
<span style="color: navy; font-weight: bold;">import </span>java.util.Map;
<span style="color: navy; font-weight: bold;">import </span>java.util.stream.Stream;
<span style="color: navy; font-weight: bold;">import </span>com.example.domain.Director;
<span style="color: navy; font-weight: bold;">import </span>com.example.domain.Genre;
<span style="color: navy; font-weight: bold;">import </span>com.example.domain.Movie;
<span style="color: navy; font-weight: bold;">import </span>com.example.service.InMemoryMovieService;
<span style="color: navy; font-weight: bold;">import </span>com.example.service.MovieService;
<span style="color: navy; font-weight: bold;">import static </span>java.util.stream.Collectors.*;
<span style="color: navy; font-weight: bold;">public class </span>Exercise4 {
<span style="color: navy; font-weight: bold;">public static void </span>main(String[] args) {
<span style="color: grey; font-style: italic;"> </span>MovieService movieService = InMemoryMovieService.<span style="font-style: italic;">getInstance</span>();
Collection<Director> directors = movieService.findAllDirectors();
Stream<DirectorGenre> stream =
directors.stream()
.flatMap(director -> director.getMovies()
.stream()
.map(Movie::getGenres)
.flatMap(Collection::stream)
.map(genre -> <span style="color: navy; font-weight: bold;">new </span>DirectorGenre(<span style="color: #660e7a;">director</span>, genre))
.collect(<span style="font-style: italic;">toList</span>()).stream()
);
Map<Director, Map<Genre, Long>> directorGenreList =
stream.collect(
<span style="font-style: italic;">groupingBy</span>(
DirectorGenre::getKey,
<span style="font-style: italic;">groupingBy</span>(DirectorGenre::getValue, <span style="font-style: italic;">counting</span>())
)
);
directorGenreList.forEach(
(k1,v1) -> {
System.<span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>.println(k1.getName());
v1.forEach( (k2,v2) -> {
System.<span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>.println(String.<span style="font-style: italic;">format</span>(<span style="color: green; font-weight: bold;">"</span><span style="color: navy; font-weight: bold;">\t</span><span style="color: green; font-weight: bold;">%-12s: %2d"</span>, k2.getName(), v2));
});
System.<span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>.println();
}
);
}
}
<span style="color: navy; font-weight: bold;">class </span>DirectorGenre <span style="color: navy; font-weight: bold;">implements </span>Map.Entry<Director, Genre> {
<span style="color: navy; font-weight: bold;">private </span>Director <span style="color: #660e7a; font-weight: bold;">director</span>;
<span style="color: navy; font-weight: bold;">private </span>Genre <span style="color: #660e7a; font-weight: bold;">genre</span>;
<span style="color: navy; font-weight: bold;">public </span>DirectorGenre(Director director, Genre genre) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">director </span>= director;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">genre </span>= genre;
}
<span style="color: olive;">@Override</span><span style="color: olive;"> </span><span style="color: navy; font-weight: bold;">public </span>Director getKey() {
<span style="color: navy; font-weight: bold;">return </span><span style="color: #660e7a; font-weight: bold;">director</span>;
}
<span style="color: olive;">@Override</span><span style="color: olive;"> </span><span style="color: navy; font-weight: bold;">public </span>Genre getValue() {
<span style="color: navy; font-weight: bold;">return </span><span style="color: #660e7a; font-weight: bold;">genre</span>;
}
<span style="color: olive;">@Override</span><span style="color: olive;"> </span><span style="color: navy; font-weight: bold;">public </span>Genre setValue(Genre genre) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">genre </span>= genre;
<span style="color: navy; font-weight: bold;">return </span>genre;
}
}</pre>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">The code given above will produce the following output:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">Marc Webb</span>
<span style="color: #888888;"> Comedy : 1</span>
<span style="color: #888888;"> Drama : 1</span>
<span style="color: #888888;"> Romance : 1</span>
<span style="color: #888888;">Peter Hyams</span>
<span style="color: #888888;"> Drama : 1</span>
<span style="color: #888888;"> Mystery : 1</span>
<span style="color: #888888;">Mark Neveldine</span>
<span style="color: #888888;"> Action : 1</span>
<span style="color: #888888;"> Sci-Fi : 1</span>
<span style="color: #888888;"> Thriller : 1</span>
<span style="color: #888888;">Brian Taylor</span>
<span style="color: #888888;"> Action : 1</span>
<span style="color: #888888;"> Sci-Fi : 1</span>
<span style="color: #888888;"> Thriller : 1</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">Ryûhei Kitamura</span>
<span style="color: #888888;"> Fantasy : 1</span>
<span style="color: #888888;"> Drama : 1</span>
<span style="color: #888888;"> Action : 1</span>
<span style="color: #888888;"> Thriller : 1</span>
<span style="color: #888888;"> Adventure : 1</span>
<span style="color: #888888;">Shusuke Kaneko</span>
<span style="color: #888888;"> Action : 1</span>
<span style="color: #888888;">Gregor Jordan</span>
<span style="color: #888888;"> Drama : 1</span>
<span style="color: #888888;"> Thriller : 1</span>
</pre>
</div>
<br />
<h2>
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b>EXERCISE #5</b></span></h2>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><u>Find the highest populated capital city</u>:</span><br />
<br />
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><pre style="font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">package </span>com.example.exercise;
<span style="color: navy; font-weight: bold;">import </span>com.example.dao.CityDao;
<span style="color: navy; font-weight: bold;">import </span>com.example.dao.CountryDao;
<span style="color: navy; font-weight: bold;">import </span>com.example.dao.InMemoryWorldDao;
<span style="color: navy; font-weight: bold;">import </span>com.example.domain.City;
<span style="color: navy; font-weight: bold;">import </span>com.example.domain.Country;
<span style="color: navy; font-weight: bold;">import </span>java.util.Objects;
<span style="color: navy; font-weight: bold;">import </span>java.util.Optional;
<span style="color: navy; font-weight: bold;">import static </span>java.lang.System.<span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>;
<span style="color: navy; font-weight: bold;">import static </span>java.util.Comparator.<span style="font-style: italic;">comparing</span>;
<span style="color: navy; font-weight: bold;">import static </span>java.util.stream.Collectors.<span style="font-style: italic;">maxBy</span>;
<span style="color: navy; font-weight: bold;">public class </span>Exercise5 {
<span style="color: navy; font-weight: bold;">public static void </span>main(String[] args) {
<span style="color: grey; font-style: italic;"> </span>CountryDao countryDao = InMemoryWorldDao.<span style="font-style: italic;">getInstance</span>();
CityDao cityDao = InMemoryWorldDao.<span style="font-style: italic;">getInstance</span>();
Optional<City> capital = countryDao.findAllCountries()
.stream()
.map(Country::getCapital)
.map(cityDao::findCityById)
.filter(Objects::<span style="font-style: italic;">nonNull</span>)
.collect(<span style="font-style: italic;">maxBy</span>(<span style="font-style: italic;">comparing</span>(City::getPopulation)));
capital.ifPresent(<span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>::println);
}
}</pre>
</pre>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">The code given above will produce the following output:</span><br />
<br />
<div>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">City [id=2331, name=Seoul, population=9981619, countryCode=KOR]</span>
</pre>
</div>
<br />
<h2>
<b><span style="font-family: "georgia" , "times new roman" , serif; font-size: small;">EXERCISE #6</span></b></h2>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><u>Find the highest populated capital city of each continent</u>:</span><br />
<br />
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">package </span>com.example.exercise;
<span style="color: navy; font-weight: bold;">import </span>com.example.dao.CityDao;
<span style="color: navy; font-weight: bold;">import </span>com.example.dao.CountryDao;
<span style="color: navy; font-weight: bold;">import </span>com.example.dao.InMemoryWorldDao;
<span style="color: navy; font-weight: bold;">import </span>com.example.domain.City;
<span style="color: navy; font-weight: bold;">import </span>java.util.Map;
<span style="color: navy; font-weight: bold;">import </span>java.util.Optional;
<span style="color: navy; font-weight: bold;">import </span>java.util.function.BiConsumer;
<span style="color: navy; font-weight: bold;">import </span>java.util.function.Consumer;
<span style="color: navy; font-weight: bold;">import static </span>java.lang.System.<span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>;
<span style="color: navy; font-weight: bold;">import static </span>java.util.Comparator.*;
<span style="color: navy; font-weight: bold;">import static </span>java.util.stream.Collectors.*;
<span style="color: navy; font-weight: bold;">public class </span>Exercise6 {
<span style="color: navy; font-weight: bold;">public static void </span>main(String[] args) {
<span style="color: grey; font-style: italic;"> </span>CountryDao countryDao = InMemoryWorldDao.<span style="font-style: italic;">getInstance</span>();
CityDao cityDao = InMemoryWorldDao.<span style="font-style: italic;">getInstance</span>();
Map<String, Optional<ContinentPopulatedCity>> continentsCapitals = countryDao.findAllCountries()
.stream()
.filter(country -> country.getCapital() > <span style="color: blue;">0</span>)
.map(country -> <span style="color: navy; font-weight: bold;">new </span>ContinentPopulatedCity(country.getContinent(), <span style="color: #660e7a;">cityDao</span>.findCityById(country.getCapital())))
.collect(<span style="font-style: italic;">groupingBy</span>(ContinentPopulatedCity::getKey, <span style="font-style: italic;">maxBy</span>(<span style="font-style: italic;">comparing</span>(cpc -> cpc.getValue().getPopulation()))));
BiConsumer<String, Optional<ContinentPopulatedCity>> print= (k, v) -> {
Consumer<ContinentPopulatedCity> continentPopulatedCityConsumer = cpc -> <span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>.println(cpc.getKey() + <span style="color: green; font-weight: bold;">": " </span>+ <span style="color: #660e7a;">v</span>.get().getValue());
v.ifPresent(continentPopulatedCityConsumer);
};
continentsCapitals.forEach(print);
}
}
<span style="color: navy; font-weight: bold;">class </span>ContinentPopulatedCity <span style="color: navy; font-weight: bold;">implements </span>Map.Entry<String, City> {
<span style="color: navy; font-weight: bold;">private </span>String <span style="color: #660e7a; font-weight: bold;">continent</span>;
<span style="color: navy; font-weight: bold;">private </span>City <span style="color: #660e7a; font-weight: bold;">city</span>;
<span style="color: navy; font-weight: bold;">public </span>ContinentPopulatedCity(String continent, City city) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">continent </span>= continent;
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">city </span>= city;
}
<span style="color: olive;">@Override</span><span style="color: olive;"> </span><span style="color: navy; font-weight: bold;">public </span>String getKey() {
<span style="color: navy; font-weight: bold;">return </span><span style="color: #660e7a; font-weight: bold;">continent</span>;
}
<span style="color: olive;">@Override</span><span style="color: olive;"> </span><span style="color: navy; font-weight: bold;">public </span>City getValue() {
<span style="color: navy; font-weight: bold;">return </span><span style="color: #660e7a; font-weight: bold;">city</span>;
}
<span style="color: olive;">@Override</span><span style="color: olive;"> </span><span style="color: navy; font-weight: bold;">public </span>City setValue(City city) {
<span style="color: navy; font-weight: bold;">this</span>.<span style="color: #660e7a; font-weight: bold;">city </span>= city;
<span style="color: navy; font-weight: bold;">return </span>city;
}
}</pre>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">The code given above will produce the following output:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">South America: City [id=2890, name=Lima, population=6464693, countryCode=PER]</span>
<span style="color: #888888;">Asia: City [id=2331, name=Seoul, population=9981619, countryCode=KOR]</span>
<span style="color: #888888;">Europe: City [id=3580, name=Moscow, population=8389200, countryCode=RUS]</span>
<span style="color: #888888;">Africa: City [id=608, name=Cairo, population=6789479, countryCode=EGY]</span>
<span style="color: #888888;">North America: City [id=2515, name=Ciudad de M‚xico, population=8591309, countryCode=MEX]</span>
<span style="color: #888888;">Oceania: City [id=135, name=Canberra, population=322723, countryCode=AUS]</span>
</pre>
</div>
<br />
<h2>
<b><span style="font-family: "georgia" , "times new roman" , serif; font-size: small;">EXERCISE #7</span></b></h2>
<span style="font-size: small;"><span style="font-family: "georgia" , "times new roman" , serif;"><b><u><br />
</u></b></span></span> <span style="font-size: small;"><span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Sort the countries by number of their cities in desending order</u></b></span><b style="font-family: georgia, "times new roman", serif;">:</b></span><br />
<br />
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">package </span>com.example.exercise;
<span style="color: navy; font-weight: bold;">import </span>com.example.dao.CountryDao;
<span style="color: navy; font-weight: bold;">import </span>com.example.dao.InMemoryWorldDao;
<span style="color: navy; font-weight: bold;">import </span>com.example.domain.Country;
<span style="color: navy; font-weight: bold;">import </span>java.util.Comparator;
<span style="color: navy; font-weight: bold;">import </span>java.util.List;
<span style="color: navy; font-weight: bold;">import </span>java.util.function.Predicate;
<span style="color: navy; font-weight: bold;">import static </span>java.lang.String.<span style="font-style: italic;">format</span>;
<span style="color: navy; font-weight: bold;">import static </span>java.lang.System.<span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>;
<span style="color: navy; font-weight: bold;">import static </span>java.util.Comparator.<span style="font-style: italic;">comparing</span>;
<span style="color: navy; font-weight: bold;">import static </span>java.util.stream.Collectors.<span style="font-style: italic;">toList</span>;
<span style="color: navy; font-weight: bold;">public class </span>Exercise7 {
<span style="color: navy; font-weight: bold;">public static void </span>main(String[] args) {
<span style="color: grey; font-style: italic;"> </span>CountryDao countryDao = InMemoryWorldDao.<span style="font-style: italic;">getInstance</span>();
Comparator<Country> sortByNumOfCities = <span style="font-style: italic;">comparing</span>(country -> country.getCities().size());
Predicate<Country> countriesHavingNoCities = country -> country.getCities().isEmpty();
List<Country> countries = countryDao.findAllCountries()
.stream()
.filter(countriesHavingNoCities.negate())
.sorted(sortByNumOfCities.reversed())
.collect(<span style="font-style: italic;">toList</span>());
countries.forEach(country -> <span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>.println(<span style="font-style: italic;">format</span>(<span style="color: green; font-weight: bold;">"%38s %3d"</span>, country.getName(), country.getCities().size())));
}
}</pre>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"></pre>
<span style="font-family: "georgia" , "times new roman" , serif;">The code given above will produce the following output:</span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;"> China 363</span>
<span style="color: #888888;"> India 341</span>
<span style="color: #888888;"> United States 274</span>
<span style="color: #888888;"> Brazil 250</span>
<span style="color: #888888;"> Japan 248</span>
<span style="color: #888888;"> Russian Federation 189</span>
<span style="color: #888888;"> Mexico 173</span>
<span style="color: #888888;"> .</span>
<span style="color: #888888;"> .</span>
<span style="color: #888888;"> .</span>
<span style="color: #888888;"> Barbados 1</span>
<span style="color: #888888;"> Tuvalu 1</span>
<span style="color: #888888;"> Niue 1</span>
<span style="color: #888888;"> Virgin Islands, U.S. 1</span>
<span style="color: #888888;"> Brunei 1</span>
</pre>
</div>
<br />
<b><span style="font-family: "georgia" , "times new roman" , serif; font-size: small;">EXERCISE #8</span></b><br />
<span style="font-size: small;"><span style="font-family: "georgia" , "times new roman" , serif;"><b><u><br />
</u></b></span></span><span style="font-size: small;"><span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Find the list of movies having the genres "Drama" and "Comedy" only</u></b></span><b style="font-family: georgia, "times new roman", serif;">:</b></span><br />
<br />
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">package </span>com.example.exercise;
<span style="color: navy; font-weight: bold;">import </span>com.example.domain.Genre;
<span style="color: navy; font-weight: bold;">import </span>com.example.domain.Movie;
<span style="color: navy; font-weight: bold;">import </span>com.example.service.InMemoryMovieService;
<span style="color: navy; font-weight: bold;">import </span>com.example.service.MovieService;
<span style="color: navy; font-weight: bold;">import </span>java.util.Collection;
<span style="color: navy; font-weight: bold;">import </span>java.util.List;
<span style="color: navy; font-weight: bold;">import </span>java.util.function.Predicate;
<span style="color: navy; font-weight: bold;">import static </span>java.lang.String.<span style="font-style: italic;">format</span>;
<span style="color: navy; font-weight: bold;">import static </span>java.lang.System.<span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>;
<span style="color: navy; font-weight: bold;">import static </span>java.util.stream.Collectors.<span style="font-style: italic;">joining</span>;
<span style="color: navy; font-weight: bold;">import static </span>java.util.stream.Collectors.<span style="font-style: italic;">toList</span>;
<span style="color: navy; font-weight: bold;">public class </span>Exercise8 {
<span style="color: navy; font-weight: bold;">public static void </span>main(String[] args) {
<span style="color: grey; font-style: italic;"> </span>MovieService movieService = InMemoryMovieService.<span style="font-style: italic;">getInstance</span>();
Collection<Movie> movies = movieService.findAllMovies();
Predicate<Movie> drama = movie -> movie.getGenres().stream().anyMatch(genre -> genre.getName().equals(<span style="color: green; font-weight: bold;">"Drama"</span>));
Predicate<Movie> comedy = movie -> movie.getGenres().stream().anyMatch(genre -> genre.getName().equals(<span style="color: green; font-weight: bold;">"Comedy"</span>));
Predicate<Movie> havingTwoGenresOnly = movie -> movie.getGenres().size() == <span style="color: blue;">2</span>;
List<Movie> dramaAndComedyMovies = movies.stream()
.filter(havingTwoGenresOnly.and(drama.and(comedy)))
.collect(<span style="font-style: italic;">toList</span>());
dramaAndComedyMovies.forEach(movie -> <span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>.println(<span style="font-style: italic;">format</span>(<span style="color: green; font-weight: bold;">"%-32s: %12s"</span>, movie.getTitle(), movie.getGenres().stream().map(Genre::getName).collect(<span style="font-style: italic;">joining</span>(<span style="color: green; font-weight: bold;">","</span>)))));
}
}</pre>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"></pre>
<span style="font-family: "georgia" , "times new roman" , serif;">The code given above will produce the following output:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">Away We Go : Comedy,Drama</span>
<span style="color: #888888;">A Serious Man : Comedy,Drama</span>
<span style="color: #888888;">High Life : Comedy,Drama</span>
<span style="color: #888888;">Cold Souls : Comedy,Drama</span>
<span style="color: #888888;">Worlds Greatest Dad : Comedy,Drama</span>
<span style="color: #888888;">My One and Only : Comedy,Drama</span>
<span style="color: #888888;">Sunshine Cleaning : Comedy,Drama</span>
<span style="color: #888888;">The Vicious Kind : Comedy,Drama</span>
<span style="color: #888888;">Defendor : Comedy,Drama</span>
<span style="color: #888888;">I Love You Phillip Morris : Comedy,Drama</span>
</pre>
</div>
<br />
<b><span style="font-family: "georgia" , "times new roman" , serif; font-size: small;">EXERCISE #9</span></b><br />
<span style="font-size: small;"><span style="font-family: "georgia" , "times new roman" , serif;"><b><u><br />
</u></b></span></span><span style="font-size: small;"><span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Group the movies by the year and list them</u></b></span><b style="font-family: georgia, "times new roman", serif;">:</b></span><br />
<br />
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<div style="margin: 0px;">
<span style="font-size: small;"><b style="font-family: georgia, "times new roman", serif;"></b></span></div>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><pre style="font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">package </span>com.example.exercise;
<span style="color: navy; font-weight: bold;">import </span>com.example.domain.Movie;
<span style="color: navy; font-weight: bold;">import </span>com.example.service.InMemoryMovieService;
<span style="color: navy; font-weight: bold;">import </span>com.example.service.MovieService;
<span style="color: navy; font-weight: bold;">import </span>java.util.Collection;
<span style="color: navy; font-weight: bold;">import </span>java.util.Map;
<span style="color: navy; font-weight: bold;">import static </span>java.lang.String.<span style="font-style: italic;">format</span>;
<span style="color: navy; font-weight: bold;">import static </span>java.lang.System.<span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>;
<span style="color: navy; font-weight: bold;">import static </span>java.util.Comparator.<span style="font-style: italic;">comparing</span>;
<span style="color: navy; font-weight: bold;">import static </span>java.util.Map.*;
<span style="color: navy; font-weight: bold;">import static </span>java.util.stream.Collectors.*;
<span style="color: navy; font-weight: bold;">public class </span>Exercise9 {
<span style="color: navy; font-weight: bold;">public static void </span>main(String[] args) {
<span style="color: grey; font-style: italic;"> </span>MovieService movieService = InMemoryMovieService.<span style="font-style: italic;">getInstance</span>();
Collection<Movie> movies = movieService.findAllMovies();
Map<Integer, String> moviesByYear = movies.stream().collect(<span style="font-style: italic;">groupingBy</span>(Movie::getYear, <span style="font-style: italic;">mapping</span>(Movie::getTitle, <span style="font-style: italic;">joining</span>(<span style="color: green; font-weight: bold;">","</span>))));
moviesByYear.entrySet().stream().sorted(<span style="font-style: italic;">comparing</span>(Entry::getKey)).forEach(entry -> <span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>.println(<span style="font-style: italic;">format</span>(<span style="color: green; font-weight: bold;">"%4d: %s"</span>, entry.getKey(), entry.getValue())));
}
}</pre>
</pre>
</div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">The code given above will produce the following output:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">1940: The Return of Frank James</span>
<span style="color: #888888;">1944: Double Indemnity</span>
<span style="color: #888888;">1948: The Treasure of the Sierra Madre</span>
<span style="color: #888888;">1950: Sunset Blvd.</span>
<span style="color: #888888;">1951: A Streetcar Named Desire</span>
<span style="color: #888888;">1953: Stalag 17</span>
<span style="color: #888888;">1954: Them!,Shichinin no samurai,Dial M for Murder</span>
<span style="color: #888888;">1958: Vertigo</span>
<span style="color: #888888;">1960: Psycho</span>
<span style="color: #888888;">1963: The Great Escape</span>
<span style="color: #888888;">1968: The Party</span>
<span style="color: #888888;">1969: Butch Cassidy and the Sundance Kid,Easy Rider,The Wild Brunch</span>
<span style="color: #888888;">1973: Le magnifique</span>
<span style="color: #888888;">1975: Dog Day Afternoon</span>
<span style="color: #888888;">1976: Network,The Little Girl Who Lives Down the Lane</span>
<span style="color: #888888;">1977: Der amerikanische Freund,The Last Wave</span>
<span style="color: #888888;">1983: Rembetiko,Danton,The Outsiders,Scarface</span>
<span style="color: #888888;">1987: Empire of the Sun</span>
<span style="color: #888888;">1988: The Accused</span>
<span style="color: #888888;">1989: My Left Foot: The Story of Christy Brown</span>
<span style="color: #888888;">1991: My Own Private Idaho</span>
<span style="color: #888888;">1992: Of Mice and Men</span>
<span style="color: #888888;">1993: Tombstone,Germinal</span>
<span style="color: #888888;">1994: Before the Rain,Heavenly Creatures</span>
<span style="color: #888888;">1996: L appartement</span>
<span style="color: #888888;">1997: Bacheha-Ye aseman,The Rainmaker</span>
<span style="color: #888888;">2000: Almost Famous</span>
<span style="color: #888888;">2001: Yeopgijeogin geunyeo</span>
<span style="color: #888888;">2002: Ice Age</span>
<span style="color: #888888;">2003: Bom yeoreum gaeul gyeoul geurigo bom,Oldboy,Jeux Denfants,Keulraesik,Azumi</span>
<span style="color: #888888;">2004: Bin-jip,Nae meorisokui jiwoogae,Samaria,Wicker Park,2046,Voditel dlya Very</span>
<span style="color: #888888;">2005: Hiroshima,Hwal,Just Like Heaven,Azumi 2: Death or Love</span>
<span style="color: #888888;">2006: Deiji,Ice Age: The Meltdown,La Sconosciuta</span>
<span style="color: #888888;">2007: Paranormal Activity,Before the Devil Knows You are Dead,Broken English,Ex Drummer</span>
<span style="color: #888888;">2008: Adam Resurrected,Nothing But the Truth,100 Feet,Nordwand,The Other Man,God on Trial,Sunshine Cleaning,Oorlogswinter,Bin-mong,Pazar - Bir Ticaret Masalı,The Hurt Locker,My Only Sunshine,Karamazovi,Ghost Town,To Verdener,Sonbahar,Yip Man,Elegy,What Doesnt Kill You,Faubourg 36</span>
<span style="color: #888888;">2009: 500 Days Of Summer,Beyond a Reasonable Doubt,Gamer,Cheri,Dorian Gray,Inglourious Basterds,Invictus,Julie and Julia,Los abrazos rotos,Armored,Bornova Bornova,Coco avant Chanel,Nefes: Vatan sağolsun,Up,Whiteout,The Time Travelers Wife,Whatever Works,Anonyma - Eine Frau in Berlin,Zombieland,Weather Girl,Watchmen,Angels and Deamons,Away We Go,Last Ride,The Boys Are Back,The Tournament,A Serious Man,Saw VI,Ne te retourne pas,District 9,Extract,Five Minutes of Haven,High Life,The Proposal,Veronika Decides to Die,The Goods: Live Hard, Sell Hard,The Hangover,Public Enemies,Creation,Amelia,The Rebound,Powder Blue,The Men Who Stare at Goats,Bright Star,Case 39,Cold Souls,Moon,Worlds Greatest Dad,State of Play,The Brothers Bloom,My One and Only,Man Som Hatar Kvinnor,Mary and Max,The Limits of Control,A Perfect Getaway,My Sisters Keeper,Planet 51,I Love You, Man,Amelia,The Damned United,New York, I Love You,Fish Tank,The Informant!,The Courageous Heart of Irena Sendler,Storm,Triangle,2012,The Cry of the Owl,13B,El secreto de sus ojos,Surrogates,Kimssi pyoryugi,Uzak İhtimal,Daybreakers,Cairo Time,The Cove,Tenderness,Hachiko: A Dogs Story,The Box,Everybodys Fine,Peter and Vandy,Women in Trouble,Un prophete,The Vicious Kind,Bakjwi,Up in the air,Law Abiding Citizen,Nine,The Soloist,Agora,Motherhood,Neşeli Hayat,The Greatest,The Boondock Saints II: All Saints Day,The Private Lives of Pippa Lee,The Imaginarium of Doctor Parnassus,The Men Who Stare at Goats,Cloudy with a Chance of Meatballs,The Princess and the Frog,An Education,Avatar,Avatar 3D,Precious: Based on the Novel Push by Sapphire,The Blind Side,New Moon,Fantastic Mr. Fox,Sherlock Holmes,The Road,Man som hatar kvinnor,The Collector,Leaves of Grass,Brooklyns Finest,Alice,Duplicity,Harry Brown,Defendor,Brothers,Crazy Heart,Kıskanmak,Das weisse Band - Eine deutsche Kindergeschichte,The Lovely Bones,Eastern Plays,Cargo,Glorious 39,Fifty Dead Men Walking,Grey Gardens,Vavien,Lebanon,Harry Potter and the Half-Blood Prince,Slovenka,9:06,2081,The Electric Mist,Serious Moonlight,Ice Age: Dawn of the Dinosaurs,La doppia ora,A Single Man,Cracks,The Missing Person,Nowhere Boy,Chloe,Drag Me to Hell,Eloise's Lover,Başka Dilde Aşk,Air Doll</span>
<span style="color: #888888;">2010: From Paris with Love,Edge of Darkness,Shutter Island,The Bounty Hunter,Dear John,Extraordinary Measures,Leap Year,Yahşi Batı,I Love You Phillip Morris,You Dont Know Jack,Yip Man 2: Chung si chuen kei,Alice in Wonderland,Romantik Komedi,Veda,Sin Nombre,The Book of Eli,Unthinkable,Shrek Forever After</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <b><span style="font-family: "georgia" , "times new roman" , serif; font-size: small;">EXERCISE #10</span></b><br />
<span style="font-size: small;"><span style="font-family: "georgia" , "times new roman" , serif;"><b><u><br />
</u></b></span></span><span style="font-size: small;"><span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Sort the countries by their population densities in descending order ignoring zero population countries</u></b></span><b style="font-family: georgia, "times new roman", serif;">:</b></span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"></span><br />
<div style="font-family: "times new roman";">
<div style="margin: 0px;">
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-size: small;"><b style="font-family: georgia, "times new roman", serif;"></b></span></span></div>
</div>
<pre style="background-color: white; font-family: Consolas; font-size: 10.5pt;"><span style="color: navy; font-weight: bold;">package </span>com.example.exercise;
<span style="color: navy; font-weight: bold;">import </span>com.example.dao.InMemoryWorldDao;
<span style="color: navy; font-weight: bold;">import </span>com.example.dao.WorldDao;
<span style="color: navy; font-weight: bold;">import </span>com.example.domain.Country;
<span style="color: navy; font-weight: bold;">import </span>java.util.Collection;
<span style="color: navy; font-weight: bold;">import </span>java.util.Comparator;
<span style="color: navy; font-weight: bold;">import </span>java.util.function.Predicate;
<span style="color: navy; font-weight: bold;">import static </span>java.lang.System.<span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>;
<span style="color: navy; font-weight: bold;">import static </span>java.util.Comparator.<span style="font-style: italic;">comparingDouble</span>;
<span style="color: navy; font-weight: bold;">public class </span>Exercise10 {
<span style="color: navy; font-weight: bold;">public static void </span>main(String[] args) {
<span style="color: grey; font-style: italic;"> </span>WorldDao worldDao = InMemoryWorldDao.<span style="font-style: italic;">getInstance</span>();
Collection<Country> countries = worldDao.findAllCountries();
Comparator<Country> populationDensityComparator = <span style="font-style: italic;">comparingDouble</span>(country -> country.getPopulation() / country.getSurfaceArea());
Predicate<Country> livesNobody = country -> country.getPopulation() == <span style="color: blue;">0L</span>;
countries.stream().filter(livesNobody.negate()).sorted(populationDensityComparator.reversed())
.forEach(<span style="color: #660e7a; font-style: italic; font-weight: bold;">out</span>::println);
}
}</pre>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">The code given above will produce the following output:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">Country [ name=Macao, population=473000]</span>
<span style="color: #888888;">Country [ name=Monaco, population=34000]</span>
<span style="color: #888888;">Country [ name=Hong Kong, population=6782000]</span>
<span style="color: #888888;">Country [ name=Singapore, population=3567000]</span>
<span style="color: #888888;">Country [ name=Gibraltar, population=25000]</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">Country [ name=Western Sahara, population=293000]</span>
<span style="color: #888888;">Country [ name=Pitcairn, population=50]</span>
<span style="color: #888888;">Country [ name=Falkland Islands, population=2000]</span>
<span style="color: #888888;">Country [ name=Svalbard and Jan Mayen, population=3200]</span>
<span style="color: #888888;">Country [ name=Greenland, population=56000]</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">You can download the source of the domain through </span><a href="http://www.omegaegitim.com/sources/java9-stream-api-exercises.zip" style="font-family: georgia, "times new roman", serif;" target="_blank">this link</a><span style="font-family: "georgia" , "times new roman" , serif;">.</span></div>
Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com9tag:blogger.com,1999:blog-2756890279096274314.post-39755217264324972592017-08-31T18:04:00.000+03:002017-09-03T03:46:24.230+03:00C++17'de Fonksiyonel Programlama<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsNsjru5sYEMpjQziqSHkHltEe8XfPuZLSms8YygjiAUtXVjSm_YyoepPnnXpIQV-GNADzzOgJm2SlLruebcN4BwCsq1AXkT_lBAyngx35KUjMfem998iALyHe5IdacgDmbR9pK1UbasTE/s1600/oop_generic_functional_cpp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="589" data-original-width="908" height="207" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsNsjru5sYEMpjQziqSHkHltEe8XfPuZLSms8YygjiAUtXVjSm_YyoepPnnXpIQV-GNADzzOgJm2SlLruebcN4BwCsq1AXkT_lBAyngx35KUjMfem998iALyHe5IdacgDmbR9pK1UbasTE/s320/oop_generic_functional_cpp.png" width="320" /></a></div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><b>C++11</b> ile birlikte <b>C++</b>'da <i>fonksiyonel programlama</i> yapılabiliniyor. <i>Standard Template Library</i> (<b>STL</b>) ile </span><span style="font-family: "georgia" , "times new roman" , serif;">fonksiyonel programlama </span><span style="font-family: "georgia" , "times new roman" , serif;">birlikte kullanıldığında karmaşık kod parçalarını daha basit ve yalın hale indirgediği söylenebilir. Bu yazıda bu yalınlığı göstermek üzere örnekler sunacağım. Önce problem uzayını tanıtacağım. Yazılarımın çoğunda kullandığım dünya ülkeleri ve şehirlerinden yararlanacağım:</span></div>
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u><br />
</u></b></span> <span style="font-family: "georgia" , "times new roman" , serif;"><b><u>city.h</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#ifndef __city_h__</span>
<span style="color: #557799;">#define __city_h__</span>
<span style="color: #557799;">#include "country.h"</span>
<span style="color: #557799;">#include <string></span>
<span style="color: #557799;">#include <memory></span>
<span style="color: #557799;">#include <iostream></span>
<span style="color: #008800; font-weight: bold;">namespace</span> world {
<span style="color: #888888;">// forward declaration</span>
<span style="color: #008800; font-weight: bold;">struct</span> country;
<span style="color: #008800; font-weight: bold;">struct</span> city;
<span style="color: #008800; font-weight: bold;">struct</span> city {
<span style="color: #333399; font-weight: bold;">int</span> id;
std<span style="color: #333333;">::</span>string name;
std<span style="color: #333333;">::</span>string country_code;
<span style="color: #333399; font-weight: bold;">int</span> population;
std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">></span> belongs_to;
city(<span style="color: #333399; font-weight: bold;">int</span> id,<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span> name,<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span> country_code,<span style="color: #333399; font-weight: bold;">int</span> population);
};
};
std<span style="color: #333333;">::</span>ostream<span style="color: #333333;">&</span> <span style="color: #008800; font-weight: bold;">operator</span><span style="color: #333333;"><<</span>(std<span style="color: #333333;">::</span>ostream<span style="color: #333333;">&</span> out,<span style="color: #008800; font-weight: bold;">const</span> world<span style="color: #333333;">::</span>city<span style="color: #333333;">&</span> _city);
<span style="color: #557799;">#endif</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>city.cpp</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#include "city.h"</span>
<span style="color: #008800; font-weight: bold;">namespace</span> world {
city<span style="color: #333333;">::</span>city(<span style="color: #333399; font-weight: bold;">int</span> id,<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span> name,<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span> country_code,<span style="color: #333399; font-weight: bold;">int</span> population){
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>id<span style="color: #333333;">=</span> id;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>name<span style="color: #333333;">=</span> name;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>population<span style="color: #333333;">=</span> population;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>country_code<span style="color: #333333;">=</span> country_code;
}
};
std<span style="color: #333333;">::</span>ostream<span style="color: #333333;">&</span> <span style="color: #008800; font-weight: bold;">operator</span><span style="color: #333333;"><<</span>(std<span style="color: #333333;">::</span>ostream<span style="color: #333333;">&</span> out,<span style="color: #008800; font-weight: bold;">const</span> world<span style="color: #333333;">::</span>city<span style="color: #333333;">&</span> _city){
out <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">"city [ id="</span> <span style="color: #333333;"><<</span> _city.id
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">", name="</span> <span style="color: #333333;"><<</span> _city.name
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">", "</span> <span style="color: #333333;"><<</span> <span style="color: #333333;">*</span>(_city.belongs_to)
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">", population="</span>
<span style="color: #333333;"><<</span> _city.population
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">" ]"</span>;
<span style="color: #008800; font-weight: bold;">return</span> out;
}
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>country.h</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#ifndef __country_h__</span>
<span style="color: #557799;">#define __country_h__</span>
<span style="color: #557799;">#include "city.h"</span>
<span style="color: #557799;">#include <vector></span>
<span style="color: #557799;">#include <memory></span>
<span style="color: #557799;">#include <iostream></span>
<span style="color: #557799;">#include <string></span>
<span style="color: #008800; font-weight: bold;">namespace</span> world {
<span style="color: #888888;">// forward declaration</span>
<span style="color: #008800; font-weight: bold;">struct</span> city;
<span style="color: #008800; font-weight: bold;">struct</span> country;
<span style="color: #008800; font-weight: bold;">struct</span> country {
std<span style="color: #333333;">::</span>string code;
std<span style="color: #333333;">::</span>string continent;
std<span style="color: #333333;">::</span>string name;
<span style="color: #333399; font-weight: bold;">double</span> surface_area;
<span style="color: #333399; font-weight: bold;">int</span> population;
<span style="color: #333399; font-weight: bold;">double</span> gnp;
<span style="color: #333399; font-weight: bold;">int</span> capital_id;
std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">></span> capital;
std<span style="color: #333333;">::</span>vector<span style="color: #333333;"><</span>std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>></span> cities;
country(<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span>,<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span>,<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span>,<span style="color: #333399; font-weight: bold;">int</span>,<span style="color: #333399; font-weight: bold;">double</span>,<span style="color: #333399; font-weight: bold;">double</span>,<span style="color: #333399; font-weight: bold;">int</span>);
country(<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span>,<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span>,<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span>,<span style="color: #333399; font-weight: bold;">int</span>,<span style="color: #333399; font-weight: bold;">double</span>,<span style="color: #333399; font-weight: bold;">double</span>,<span style="color: #333399; font-weight: bold;">int</span>,std<span style="color: #333333;">::</span>vector<span style="color: #333333;"><</span>std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>>&</span>,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>&</span>);
};
};
std<span style="color: #333333;">::</span>ostream<span style="color: #333333;">&</span> <span style="color: #008800; font-weight: bold;">operator</span><span style="color: #333333;"><<</span>(std<span style="color: #333333;">::</span>ostream<span style="color: #333333;">&</span>,<span style="color: #008800; font-weight: bold;">const</span> world<span style="color: #333333;">::</span>country<span style="color: #333333;">&</span>);
<span style="color: #557799;">#endif</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>country.cpp</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#include "country.h"</span>
<span style="color: #008800; font-weight: bold;">namespace</span> world {
country<span style="color: #333333;">::</span>country(<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span> code,<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span> name,<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span> continent,<span style="color: #333399; font-weight: bold;">int</span> population,<span style="color: #333399; font-weight: bold;">double</span> surface_area,<span style="color: #333399; font-weight: bold;">double</span> gnp,<span style="color: #333399; font-weight: bold;">int</span> capital_id){
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>code<span style="color: #333333;">=</span> code;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>name<span style="color: #333333;">=</span> name;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>continent<span style="color: #333333;">=</span> continent;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>population<span style="color: #333333;">=</span> population;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>surface_area<span style="color: #333333;">=</span> surface_area;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>gnp<span style="color: #333333;">=</span> gnp;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>capital_id<span style="color: #333333;">=</span> capital_id;
}
country<span style="color: #333333;">::</span>country(<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span> code,<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span> name,<span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string<span style="color: #333333;">&</span> continent,<span style="color: #333399; font-weight: bold;">int</span> population,<span style="color: #333399; font-weight: bold;">double</span> surface_area,<span style="color: #333399; font-weight: bold;">double</span> gnp,<span style="color: #333399; font-weight: bold;">int</span> capital_id,std<span style="color: #333333;">::</span>vector<span style="color: #333333;"><</span>std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>>&</span> cities,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>&</span> capital){
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>code<span style="color: #333333;">=</span> code;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>name<span style="color: #333333;">=</span> name;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>continent<span style="color: #333333;">=</span> continent;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>population<span style="color: #333333;">=</span> population;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>surface_area<span style="color: #333333;">=</span> surface_area;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>gnp<span style="color: #333333;">=</span> gnp;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>capital_id<span style="color: #333333;">=</span> capital_id;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>cities<span style="color: #333333;">=</span> cities;
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">-></span>capital<span style="color: #333333;">=</span> capital;
}
};
std<span style="color: #333333;">::</span>ostream<span style="color: #333333;">&</span> <span style="color: #008800; font-weight: bold;">operator</span><span style="color: #333333;"><<</span>(std<span style="color: #333333;">::</span>ostream<span style="color: #333333;">&</span> out,<span style="color: #008800; font-weight: bold;">const</span> world<span style="color: #333333;">::</span>country<span style="color: #333333;">&</span> _country){
out <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">"country [ code="</span> <span style="color: #333333;"><<</span> _country.code
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">", name="</span> <span style="color: #333333;"><<</span> _country.name
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">", population="</span> <span style="color: #333333;"><<</span> _country.population
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">", surface_area="</span> <span style="color: #333333;"><<</span> _country.surface_area
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">", capital="</span> <span style="color: #333333;"><<</span> _country.capital_id
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">", # of cities= "</span> <span style="color: #333333;"><<</span> _country.cities.size()
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">" ]"</span>;
<span style="color: #008800; font-weight: bold;">return</span> out;
}
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>country</b> ve <b>city</b> sınıfları dünya ülke ve şehirlerini modeller. <b>country</b> ve <b>city</b> sınıfları arasında <b><i>bire-çoklu</i></b> ve <b><i>bire-bir</i></b> bir ilişki bulunuyor:</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtSeKJKD-kBqBVL2SlodxKvKfM7AfRnHzLkYhKLGEhVxNgEikghcmriE0bK0z11whyKmcWzn48syNVwRJ15uJi0f22xWer6HhHWtK0WZTs8qybdBWGYgogCMtHCY1k7yfRmMbbr-Uy2uSs/s1600/country_city_relation.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="204" data-original-width="589" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtSeKJKD-kBqBVL2SlodxKvKfM7AfRnHzLkYhKLGEhVxNgEikghcmriE0bK0z11whyKmcWzn48syNVwRJ15uJi0f22xWer6HhHWtK0WZTs8qybdBWGYgogCMtHCY1k7yfRmMbbr-Uy2uSs/s1600/country_city_relation.png" /></a></div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <br />
<b><span style="font-family: "georgia" , "times new roman" , serif;"><u>world-util.h</u>:</span></b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#ifndef __world_util_h__</span>
<span style="color: #557799;">#define __world_util_h__</span>
<span style="color: #557799;">#include "city.h"</span>
<span style="color: #557799;">#include "country.h"</span>
<span style="color: #557799;">#include <memory></span>
<span style="color: #557799;">#include <map></span>
<span style="color: #557799;">#include <string></span>
<span style="color: #557799;">#include <iostream></span>
<span style="color: #557799;">#include <algorithm></span>
<span style="color: #008800; font-weight: bold;">extern</span> std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span>,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>></span> cities;
<span style="color: #008800; font-weight: bold;">extern</span> std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span>std<span style="color: #333333;">::</span>string,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">>></span> countries;
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">create_cities</span>();
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">create_countries</span>();
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">create_world</span>();
<span style="color: #557799;">#endif</span>
</pre>
</div>
<br />
<b><span style="font-family: "georgia" , "times new roman" , serif;"><u>world-util.cpp</u>:</span></b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#include "world-util.h"</span>
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">create_cities</span>(){
std<span style="color: #333333;">::</span>cout <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">"Creating cities..."</span> ;
cities[<span style="color: #0000dd; font-weight: bold;">1</span>]<span style="color: #333333;">=</span> std<span style="color: #333333;">::</span>make_shared<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">></span>(world<span style="color: #333333;">::</span>city(<span style="color: #0000dd; font-weight: bold;">1</span>, std<span style="color: #333333;">::</span>string(<span style="background-color: #fff0f0;">"Kabul"</span>), std<span style="color: #333333;">::</span>string(<span style="background-color: #fff0f0;">"AFG"</span>), <span style="color: #0000dd; font-weight: bold;">1780000</span>));
.
.
.
cities[<span style="color: #0000dd; font-weight: bold;">4079</span>]<span style="color: #333333;">=</span> std<span style="color: #333333;">::</span>make_shared<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">></span>(world<span style="color: #333333;">::</span>city(<span style="color: #0000dd; font-weight: bold;">4079</span>, std<span style="color: #333333;">::</span>string(<span style="background-color: #fff0f0;">"Rafah"</span>), std<span style="color: #333333;">::</span>string(<span style="background-color: #fff0f0;">"PSE"</span>), <span style="color: #0000dd; font-weight: bold;">92020</span>));
std<span style="color: #333333;">::</span>cout <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">"done."</span> <span style="color: #333333;"><<</span> std<span style="color: #333333;">::</span>endl;
}
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">create_countries</span>(){
std<span style="color: #333333;">::</span>cout <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">"Creating countries..."</span> ;
countries[std<span style="color: #333333;">::</span>string(<span style="background-color: #fff0f0;">"ABW"</span>)]<span style="color: #333333;">=</span> std<span style="color: #333333;">::</span>make_shared<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">></span>(world<span style="color: #333333;">::</span>country(std<span style="color: #333333;">::</span>string(<span style="background-color: #fff0f0;">"ABW"</span>), std<span style="color: #333333;">::</span>string(<span style="background-color: #fff0f0;">"Aruba"</span>), std<span style="color: #333333;">::</span>string(<span style="background-color: #fff0f0;">"North America"</span>), <span style="color: #0000dd; font-weight: bold;">103000</span>, <span style="color: #6600ee; font-weight: bold;">193.00</span>, <span style="color: #6600ee; font-weight: bold;">828.00</span>, <span style="color: #0000dd; font-weight: bold;">129</span>));
.
.
.
countries[std<span style="color: #333333;">::</span>string(<span style="background-color: #fff0f0;">"ZWE"</span>)]<span style="color: #333333;">=</span> std<span style="color: #333333;">::</span>make_shared<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">></span>(world<span style="color: #333333;">::</span>country(std<span style="color: #333333;">::</span>string(<span style="background-color: #fff0f0;">"ZWE"</span>), std<span style="color: #333333;">::</span>string(<span style="background-color: #fff0f0;">"Zimbabwe"</span>), std<span style="color: #333333;">::</span>string(<span style="background-color: #fff0f0;">"Africa"</span>), <span style="color: #0000dd; font-weight: bold;">11669000</span>, <span style="color: #6600ee; font-weight: bold;">390757.00</span>, <span style="color: #6600ee; font-weight: bold;">5951.00</span>, <span style="color: #0000dd; font-weight: bold;">4068</span>));
std<span style="color: #333333;">::</span>cout <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">"done."</span> <span style="color: #333333;"><<</span> std<span style="color: #333333;">::</span>endl;
}
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">create_world</span>(){
create_cities();
create_countries();
<span style="color: #008800; font-weight: bold;">auto</span> linkCityToCountry<span style="color: #333333;">=</span> [](std<span style="color: #333333;">::</span>pair<span style="color: #333333;"><</span><span style="color: #008800; font-weight: bold;">const</span> <span style="color: #333399; font-weight: bold;">int</span>,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>>&</span> entry) <span style="color: #333333;">-></span> <span style="color: #333399; font-weight: bold;">void</span> {
<span style="color: #008800; font-weight: bold;">auto</span> city<span style="color: #333333;">=</span> entry.second.get();
<span style="color: #008800; font-weight: bold;">auto</span> country<span style="color: #333333;">=</span> countries[city<span style="color: #333333;">-></span>country_code];
city<span style="color: #333333;">-></span>belongs_to <span style="color: #333333;">=</span> std<span style="color: #333333;">::</span>make_shared<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">></span>(<span style="color: #333333;">*</span>country);
country<span style="color: #333333;">-></span>cities.push_back(std<span style="color: #333333;">::</span>make_shared<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">></span>(<span style="color: #333333;">*</span>city));
};
<span style="color: #008800; font-weight: bold;">auto</span> linkCapitalCityToCountry<span style="color: #333333;">=</span> [](std<span style="color: #333333;">::</span>pair<span style="color: #333333;"><</span><span style="color: #008800; font-weight: bold;">const</span> std<span style="color: #333333;">::</span>string,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">>>&</span> entry) <span style="color: #333333;">-></span> <span style="color: #333399; font-weight: bold;">void</span> {
<span style="color: #008800; font-weight: bold;">auto</span> country<span style="color: #333333;">=</span> entry.second.get();
<span style="color: #008800; font-weight: bold;">if</span> (country<span style="color: #333333;">-></span>capital_id<span style="color: #333333;">>=</span><span style="color: #0000dd; font-weight: bold;">0</span>){
<span style="color: #008800; font-weight: bold;">auto</span> capital<span style="color: #333333;">=</span> cities[country<span style="color: #333333;">-></span>capital_id];
country<span style="color: #333333;">-></span>capital<span style="color: #333333;">=</span> std<span style="color: #333333;">::</span>make_shared<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">></span>(<span style="color: #333333;">*</span>capital);
}
};
std<span style="color: #333333;">::</span>for_each(cities.begin(),cities.end(),linkCityToCountry);
std<span style="color: #333333;">::</span>for_each(countries.begin(),countries.end(),linkCapitalCityToCountry);
}
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Artık bu alan modeli üzerinden örnek problemler çözerek hem STL hem de fonksiyonel programlama çalışabiliriz:</span><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>1.</b> Dünyadaki kıtaların bir listesini hesaplayalım:</span><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>exercise1.cpp</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#include "city.h"</span>
<span style="color: #557799;">#include "country.h" </span>
<span style="color: #557799;">#include "world-util.h" </span>
<span style="color: #557799;">#include <set></span>
<span style="color: #557799;">#include <map></span>
<span style="color: #557799;">#include <iostream></span>
<span style="color: #557799;">#include <string></span>
<span style="color: #557799;">#include <memory></span>
<span style="color: #557799;">#include <algorithm></span>
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> std;
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> world;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span>,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>></span> cities;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span>std<span style="color: #333333;">::</span>string,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">>></span> countries;
<span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">main</span>(<span style="color: #333399; font-weight: bold;">int</span> argc, <span style="color: #333399; font-weight: bold;">char</span><span style="color: #333333;">*</span> argv[]){
create_world();
<span style="color: #008800; font-weight: bold;">auto</span> distinctContinentReducer<span style="color: #333333;">=</span> [](set<span style="color: #333333;"><</span>string<span style="color: #333333;">>&</span> continents, pair<span style="color: #333333;"><</span><span style="color: #008800; font-weight: bold;">const</span> string,shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>>&</span> entry) <span style="color: #333333;">-></span> set<span style="color: #333333;"><</span>string<span style="color: #333333;">>&</span> {
<span style="color: #008800; font-weight: bold;">auto</span> country<span style="color: #333333;">=</span> entry.second.get();
continents.insert(country<span style="color: #333333;">-></span>continent);
<span style="color: #008800; font-weight: bold;">return</span> continents;
};
<span style="color: #008800; font-weight: bold;">auto</span> continents<span style="color: #333333;">=</span> accumulate(countries.begin(),countries.end(),set<span style="color: #333333;"><</span>string<span style="color: #333333;">></span>(), distinctContinentReducer);
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">auto</span><span style="color: #333333;">&</span> continent<span style="color: #333333;">:</span> continents){
cout <span style="color: #333333;"><<</span> continent <span style="color: #333333;"><<</span> endl;
}
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0000dd; font-weight: bold;">0</span>;
}
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">$</span> ./exercise1
<span style="color: #888888;">Creating cities...done.</span>
<span style="color: #888888;">Creating countries...done.</span>
<span style="color: #888888;">Africa</span>
<span style="color: #888888;">Antarctica</span>
<span style="color: #888888;">Asia</span>
<span style="color: #888888;">Europe</span>
<span style="color: #888888;">North America</span>
<span style="color: #888888;">Oceania</span>
<span style="color: #888888;">South America</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>2.</b> Her bir kıtada kaç ülke olduğunu bulalım:</span><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>exercise2.cpp</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#include "city.h"</span>
<span style="color: #557799;">#include "country.h" </span>
<span style="color: #557799;">#include "world-util.h" </span>
<span style="color: #557799;">#include <set></span>
<span style="color: #557799;">#include <map></span>
<span style="color: #557799;">#include <iostream></span>
<span style="color: #557799;">#include <string></span>
<span style="color: #557799;">#include <memory></span>
<span style="color: #557799;">#include <algorithm></span>
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> std;
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> world;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span>,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>></span> cities;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span>std<span style="color: #333333;">::</span>string,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">>></span> countries;
<span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">main</span>(<span style="color: #333399; font-weight: bold;">int</span> argc, <span style="color: #333399; font-weight: bold;">char</span><span style="color: #333333;">*</span> argv[]){
create_world();
<span style="color: #008800; font-weight: bold;">auto</span> countCountriesInContinentReducer<span style="color: #333333;">=</span> [](map<span style="color: #333333;"><</span>string,<span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">>&</span> numberOfCountriesInEachContinent, pair<span style="color: #333333;"><</span><span style="color: #008800; font-weight: bold;">const</span> string,shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>>&</span> entry) <span style="color: #333333;">-></span> map<span style="color: #333333;"><</span>string,<span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">>&</span> {
<span style="color: #008800; font-weight: bold;">auto</span> country<span style="color: #333333;">=</span> entry.second.get();
<span style="color: #008800; font-weight: bold;">auto</span> continent<span style="color: #333333;">=</span> country<span style="color: #333333;">-></span>continent;
<span style="color: #008800; font-weight: bold;">auto</span> end<span style="color: #333333;">=</span> numberOfCountriesInEachContinent.end();
<span style="color: #008800; font-weight: bold;">auto</span> iterator<span style="color: #333333;">=</span> numberOfCountriesInEachContinent.emplace_hint(end,continent,<span style="color: #0000dd; font-weight: bold;">0</span>);
(iterator<span style="color: #333333;">-></span>second)<span style="color: #333333;">++</span>;
<span style="color: #008800; font-weight: bold;">return</span> numberOfCountriesInEachContinent;
};
<span style="color: #008800; font-weight: bold;">auto</span> continentCountriesCounter<span style="color: #333333;">=</span> accumulate(countries.begin(),countries.end(),map<span style="color: #333333;"><</span>string,<span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">></span>(),countCountriesInContinentReducer);
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">auto</span><span style="color: #333333;">&</span> entry<span style="color: #333333;">:</span> continentCountriesCounter){
cout <span style="color: #333333;"><<</span> entry.first <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">": "</span> <span style="color: #333333;"><<</span> entry.second <span style="color: #333333;"><<</span> endl;
}
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0000dd; font-weight: bold;">0</span>;
}
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">$</span> ./exercise2
<span style="color: #888888;">Creating cities...done.</span>
<span style="color: #888888;">Creating countries...done.</span>
<span style="color: #888888;">Africa: 58</span>
<span style="color: #888888;">Antarctica: 5</span>
<span style="color: #888888;">Asia: 51</span>
<span style="color: #888888;">Europe: 46</span>
<span style="color: #888888;">North America: 37</span>
<span style="color: #888888;">Oceania: 28</span>
<span style="color: #888888;">South America: 14</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>3.</b> Dünyanın, GNP (Gross National Product)(=Gayri Safi Milli Hasıla) değerine göre en zengin ülkesini bulalım:</span><br />
<br />
<b><span style="font-family: "georgia" , "times new roman" , serif;"><u>exercise3.cpp</u>:</span></b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#include "city.h"</span>
<span style="color: #557799;">#include "country.h" </span>
<span style="color: #557799;">#include "world-util.h" </span>
<span style="color: #557799;">#include <set></span>
<span style="color: #557799;">#include <map></span>
<span style="color: #557799;">#include <iostream></span>
<span style="color: #557799;">#include <string></span>
<span style="color: #557799;">#include <memory></span>
<span style="color: #557799;">#include <algorithm></span>
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> std;
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> world;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span>,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>></span> cities;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span>std<span style="color: #333333;">::</span>string,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">>></span> countries;
<span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">main</span>(<span style="color: #333399; font-weight: bold;">int</span> argc, <span style="color: #333399; font-weight: bold;">char</span><span style="color: #333333;">*</span> argv[]){
create_world();
<span style="color: #008800; font-weight: bold;">auto</span> gnpComparator<span style="color: #333333;">=</span> [](pair<span style="color: #333333;"><</span><span style="color: #008800; font-weight: bold;">const</span> string,shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>>&</span> left, pair<span style="color: #333333;"><</span><span style="color: #008800; font-weight: bold;">const</span> string,shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>>&</span> right) <span style="color: #333333;">-></span> <span style="color: #333399; font-weight: bold;">bool</span> {
<span style="color: #008800; font-weight: bold;">return</span> left.second<span style="color: #333333;">-></span>gnp <span style="color: #333333;"><</span> right.second<span style="color: #333333;">-></span>gnp;
};
<span style="color: #008800; font-weight: bold;">auto</span> richestCountryPair<span style="color: #333333;">=</span> max_element(countries.begin(),countries.end(),gnpComparator);
<span style="color: #008800; font-weight: bold;">auto</span> richestCountry<span style="color: #333333;">=</span> <span style="color: #333333;">*</span>(richestCountryPair<span style="color: #333333;">-></span>second);
cout <span style="color: #333333;"><<</span> richestCountry <span style="color: #333333;"><<</span> endl;
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0000dd; font-weight: bold;">0</span>;
}
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">$</span> ./exercise3
<span style="color: #888888;">Creating cities...done.</span>
<span style="color: #888888;">Creating countries...done.</span>
<span style="color: #888888;">country [ code=USA, name=United States, population=278357000, surface_area=9.36352e+06, capital=3813, # of cities= 274 ]</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>4.</b> Şimdi her kıtanın GNP (Gross National Product)(=Gayri Safi Milli Hasıla) değerine göre en zengin ülkesini bulalım:</span><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>exercise4.cpp</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#include "city.h"</span>
<span style="color: #557799;">#include "country.h" </span>
<span style="color: #557799;">#include "world-util.h" </span>
<span style="color: #557799;">#include <vector></span>
<span style="color: #557799;">#include <map></span>
<span style="color: #557799;">#include <iostream></span>
<span style="color: #557799;">#include <string></span>
<span style="color: #557799;">#include <memory></span>
<span style="color: #557799;">#include <algorithm></span>
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> std;
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> world;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span>,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>></span> cities;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span>std<span style="color: #333333;">::</span>string,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">>></span> countries;
<span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">main</span>(<span style="color: #333399; font-weight: bold;">int</span> argc, <span style="color: #333399; font-weight: bold;">char</span><span style="color: #333333;">*</span> argv[]){
create_world();
<span style="color: #008800; font-weight: bold;">auto</span> gnpComparator<span style="color: #333333;">=</span> [](shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>&</span> left, shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>&</span> right) <span style="color: #333333;">-></span> <span style="color: #333399; font-weight: bold;">bool</span> {
<span style="color: #008800; font-weight: bold;">return</span> left<span style="color: #333333;">-></span>gnp <span style="color: #333333;"><</span> right<span style="color: #333333;">-></span>gnp;
};
<span style="color: #008800; font-weight: bold;">auto</span> richestCountryOfContinentReducer<span style="color: #333333;">=</span> [<span style="color: #333333;">&</span>gnpComparator](map<span style="color: #333333;"><</span>string,shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>>&</span> richestCountriesOfContinents, pair<span style="color: #333333;"><</span><span style="color: #008800; font-weight: bold;">const</span> string,shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>>&</span> entry) <span style="color: #333333;">-></span> map<span style="color: #333333;"><</span>string,shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>>&</span> {
<span style="color: #008800; font-weight: bold;">auto</span> country<span style="color: #333333;">=</span> entry.second;
<span style="color: #008800; font-weight: bold;">auto</span> continent<span style="color: #333333;">=</span> country<span style="color: #333333;">-></span>continent;
<span style="color: #008800; font-weight: bold;">auto</span> richestCountryIterator<span style="color: #333333;">=</span> richestCountriesOfContinents.find(continent);
<span style="color: #008800; font-weight: bold;">auto</span> richestCountry<span style="color: #333333;">=</span> richestCountryIterator<span style="color: #333333;">-></span>second;
<span style="color: #008800; font-weight: bold;">if</span> (richestCountryIterator<span style="color: #333333;">==</span>richestCountriesOfContinents.end() <span style="color: #333333;">||</span> gnpComparator(richestCountry,country) )
richestCountriesOfContinents[continent]<span style="color: #333333;">=</span> country;
<span style="color: #008800; font-weight: bold;">return</span> richestCountriesOfContinents;
};
<span style="color: #008800; font-weight: bold;">auto</span> richestCountriesOfContinents<span style="color: #333333;">=</span> accumulate(countries.begin(),countries.end(),map<span style="color: #333333;"><</span>string,shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>></span>(),richestCountryOfContinentReducer);
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">auto</span><span style="color: #333333;">&</span> entry<span style="color: #333333;">:</span> richestCountriesOfContinents){
cout <span style="color: #333333;"><<</span> entry.first <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">": "</span> <span style="color: #333333;"><<</span> <span style="color: #333333;">*</span>(entry.second) <span style="color: #333333;"><<</span> endl;
}
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0000dd; font-weight: bold;">0</span>;
}
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">$</span> ./exercise4
<span style="color: #888888;">Creating cities...done.</span>
<span style="color: #888888;">Creating countries...done.</span>
<span style="color: #888888;">Africa: country [ code=ZAF, name=South Africa, population=40377000, surface_area=1.22104e+06, gnp=116729, # of cities= 44 ]</span>
<span style="color: #888888;">Antarctica: country [ code=ATA, name=Antarctica, population=0, surface_area=1.312e+07, gnp=0, # of cities= 0 ]</span>
<span style="color: #888888;">Asia: country [ code=JPN, name=Japan, population=126714000, surface_area=377829, gnp=3.78704e+06, # of cities= 248 ]</span>
<span style="color: #888888;">Europe: country [ code=DEU, name=Germany, population=82164700, surface_area=357022, gnp=2.13337e+06, # of cities= 93 ]</span>
<span style="color: #888888;">North America: country [ code=USA, name=United States, population=278357000, surface_area=9.36352e+06, gnp=8.5107e+06, # of cities= 274 ]</span>
<span style="color: #888888;">Oceania: country [ code=AUS, name=Australia, population=18886000, surface_area=7.74122e+06, gnp=351182, # of cities= 14 ]</span>
<span style="color: #888888;">South America: country [ code=BRA, name=Brazil, population=170115000, surface_area=8.5474e+06, gnp=776739, # of cities= 250 ]</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>5.</b> Her bir kıtadaki ülkelerin listesini alalım:</span><br />
<br />
exercise5.cpp:<br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#include "city.h"</span>
<span style="color: #557799;">#include "country.h" </span>
<span style="color: #557799;">#include "world-util.h" </span>
<span style="color: #557799;">#include <vector></span>
<span style="color: #557799;">#include <map></span>
<span style="color: #557799;">#include <iostream></span>
<span style="color: #557799;">#include <string></span>
<span style="color: #557799;">#include <memory></span>
<span style="color: #557799;">#include <algorithm></span>
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> std;
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> world;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span>,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>></span> cities;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span>std<span style="color: #333333;">::</span>string,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">>></span> countries;
<span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">main</span>(<span style="color: #333399; font-weight: bold;">int</span> argc, <span style="color: #333399; font-weight: bold;">char</span><span style="color: #333333;">*</span> argv[]){
create_world();
<span style="color: #008800; font-weight: bold;">auto</span> continentCountriesReducer<span style="color: #333333;">=</span> [](map<span style="color: #333333;"><</span>string,vector<span style="color: #333333;"><</span>shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>>>&</span> continentCountries, pair<span style="color: #333333;"><</span><span style="color: #008800; font-weight: bold;">const</span> string,shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>>&</span> entry) <span style="color: #333333;">-></span> map<span style="color: #333333;"><</span>string,vector<span style="color: #333333;"><</span>shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>>>&</span> {
<span style="color: #008800; font-weight: bold;">auto</span> country<span style="color: #333333;">=</span> entry.second;
<span style="color: #008800; font-weight: bold;">auto</span> continent<span style="color: #333333;">=</span> country<span style="color: #333333;">-></span>continent;
<span style="color: #008800; font-weight: bold;">auto</span> not_found<span style="color: #333333;">=</span> continentCountries.end();
<span style="color: #008800; font-weight: bold;">auto</span> iterator<span style="color: #333333;">=</span> continentCountries.find(continent);
<span style="color: #008800; font-weight: bold;">if</span> (iterator<span style="color: #333333;">==</span>not_found) continentCountries[continent]<span style="color: #333333;">=</span> vector<span style="color: #333333;"><</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">>></span>();
continentCountries[continent].push_back(country);
<span style="color: #008800; font-weight: bold;">return</span> continentCountries;
};
<span style="color: #008800; font-weight: bold;">auto</span> countriesOfContinents<span style="color: #333333;">=</span> accumulate(countries.begin(),countries.end(),map<span style="color: #333333;"><</span>string,vector<span style="color: #333333;"><</span>shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>>></span>(),continentCountriesReducer);
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">auto</span><span style="color: #333333;">&</span> entry<span style="color: #333333;">:</span> countriesOfContinents){
cout <span style="color: #333333;"><<</span> entry.first <span style="color: #333333;"><<</span> endl;
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">auto</span><span style="color: #333333;">&</span> eachCountry <span style="color: #333333;">:</span> entry.second){
cout <span style="color: #333333;"><<</span> <span style="color: #333333;">*</span>eachCountry <span style="color: #333333;"><<</span> endl;
}
cout <span style="color: #333333;"><<</span> endl;
}
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0000dd; font-weight: bold;">0</span>;
}
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">$</span> ./exercise5
<span style="color: #888888;">Creating cities...done.</span>
<span style="color: #888888;">Creating countries...done.</span>
<span style="color: #888888;">Africa</span>
<span style="color: #888888;">country [ code=AGO, name=Angola, population=12878000, surface_area=1.2467e+06, gnp=6648, continent=Africa, # of cities= 5 ]</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">country [ code=ZWE, name=Zimbabwe, population=11669000, surface_area=390757, gnp=5951, continent=Africa, # of cities= 6 ]</span>
<span style="color: #888888;">Antarctica</span>
<span style="color: #888888;">country [ code=ATA, name=Antarctica, population=0, surface_area=1.312e+07, gnp=0, continent=Antarctica, # of cities= 0 ]</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">country [ code=SGS, name=South Georgia and the South Sandwich Islands, population=0, surface_area=3903, gnp=0, continent=Antarctica, # of cities= 0 ]</span>
<span style="color: #888888;">Asia</span>
<span style="color: #888888;">country [ code=AFG, name=Afghanistan, population=22720000, surface_area=652090, gnp=5976, continent=Asia, # of cities= 4 ]</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">country [ code=YEM, name=Yemen, population=18112000, surface_area=527968, gnp=6041, continent=Asia, # of cities= 6 ]</span>
<span style="color: #888888;">Europe</span>
<span style="color: #888888;">country [ code=ALB, name=Albania, population=3401200, surface_area=28748, gnp=3205, continent=Europe, # of cities= 1 ]</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">country [ code=YUG, name=Yugoslavia, population=10640000, surface_area=102173, gnp=17000, continent=Europe, # of cities= 8 ]</span>
<span style="color: #888888;">North America</span>
<span style="color: #888888;">country [ code=ABW, name=Aruba, population=103000, surface_area=193, gnp=828, continent=North America, # of cities= 1 ]</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">country [ code=VIR, name=Virgin Islands, U.S., population=93000, surface_area=347, gnp=0, continent=North America, # of cities= 1 ]</span>
<span style="color: #888888;">Oceania</span>
<span style="color: #888888;">country [ code=ASM, name=American Samoa, population=68000, surface_area=199, gnp=334, continent=Oceania, # of cities= 2 ]</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">country [ code=WSM, name=Samoa, population=180000, surface_area=2831, gnp=141, continent=Oceania, # of cities= 1 ]</span>
<span style="color: #888888;">South America</span>
<span style="color: #888888;">country [ code=ARG, name=Argentina, population=37032000, surface_area=2.7804e+06, gnp=340238, continent=South America, # of cities= 57 ]</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">country [ code=VEN, name=Venezuela, population=24170000, surface_area=912050, gnp=95023, continent=South America, # of cities= 41 ]</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>6.</b> Her bir kıta için minimum, maksimum ve ortalama nüfus sayılarını hesaplayalım:</span><br />
<br />
<b><span style="font-family: "georgia" , "times new roman" , serif;"><u>exercise6.cpp</u>:</span></b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#include "city.h"</span>
<span style="color: #557799;">#include "country.h" </span>
<span style="color: #557799;">#include "world-util.h" </span>
<span style="color: #557799;">#include <vector></span>
<span style="color: #557799;">#include <map></span>
<span style="color: #557799;">#include <iostream></span>
<span style="color: #557799;">#include <string></span>
<span style="color: #557799;">#include <memory></span>
<span style="color: #557799;">#include <algorithm></span>
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> std;
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> world;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span>,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>></span> cities;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span>std<span style="color: #333333;">::</span>string,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">>></span> countries;
<span style="color: #008800; font-weight: bold;">template</span> <span style="color: #333333;"><</span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">T</span><span style="color: #333333;">></span>
<span style="color: #008800; font-weight: bold;">struct</span> statistics {
T minimum;
T maximum;
<span style="color: #333399; font-weight: bold;">double</span> sum;
<span style="color: #333399; font-weight: bold;">int</span> numberOfSamples;
statistics() <span style="color: #333333;">:</span> sum(<span style="color: #0000dd; font-weight: bold;">0</span>), numberOfSamples(<span style="color: #0000dd; font-weight: bold;">0</span>) {}
statistics(T value) <span style="color: #333333;">:</span> sum(value), numberOfSamples(<span style="color: #0000dd; font-weight: bold;">1</span>),minimum(value),maximum(value) {}
<span style="color: #333399; font-weight: bold;">double</span> average() <span style="color: #008800; font-weight: bold;">const</span> {
<span style="color: #008800; font-weight: bold;">if</span> (numberOfSamples<span style="color: #333333;">==</span><span style="color: #0000dd; font-weight: bold;">0</span>) <span style="color: #008800; font-weight: bold;">return</span> <span style="color: #6600ee; font-weight: bold;">0.0</span>;
<span style="color: #008800; font-weight: bold;">return</span> sum<span style="color: #333333;">/</span>numberOfSamples;
}
};
<span style="color: #008800; font-weight: bold;">template</span> <span style="color: #333333;"><</span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">T</span><span style="color: #333333;">></span>
std<span style="color: #333333;">::</span>ostream<span style="color: #333333;">&</span> <span style="color: #008800; font-weight: bold;">operator</span><span style="color: #333333;"><<</span>(std<span style="color: #333333;">::</span>ostream<span style="color: #333333;">&</span> out,<span style="color: #008800; font-weight: bold;">const</span> statistics<span style="color: #333333;"><</span>T<span style="color: #333333;">>&</span> stats){
out <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">"statistics [ number of samples= "</span> <span style="color: #333333;"><<</span> stats.numberOfSamples
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">", minimum="</span> <span style="color: #333333;"><<</span> stats.minimum
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">", maximum="</span> <span style="color: #333333;"><<</span> stats.maximum
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">", sum="</span> <span style="color: #333333;"><<</span>stats.sum
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">", average="</span> <span style="color: #333333;"><<</span> stats.average()
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">" ]"</span>;
<span style="color: #008800; font-weight: bold;">return</span> out;
}
<span style="color: #333399; font-weight: bold;">int</span> main(<span style="color: #333399; font-weight: bold;">int</span> argc, <span style="color: #333399; font-weight: bold;">char</span><span style="color: #333333;">*</span> argv[]){
create_world();
<span style="color: #008800; font-weight: bold;">auto</span> statisticsReducer<span style="color: #333333;">=</span> [](map<span style="color: #333333;"><</span>string,shared_ptr<span style="color: #333333;"><</span>statistics<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">>>>&</span> continentStatistics, pair<span style="color: #333333;"><</span><span style="color: #008800; font-weight: bold;">const</span> string,shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>>&</span> entry) <span style="color: #333333;">-></span> map<span style="color: #333333;"><</span>string,shared_ptr<span style="color: #333333;"><</span>statistics<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">>>>&</span> {
<span style="color: #008800; font-weight: bold;">auto</span> country<span style="color: #333333;">=</span> entry.second;
<span style="color: #008800; font-weight: bold;">auto</span> continent<span style="color: #333333;">=</span> country<span style="color: #333333;">-></span>continent;
<span style="color: #008800; font-weight: bold;">auto</span> continentStatisticsIterator<span style="color: #333333;">=</span> continentStatistics.find(continent);
<span style="color: #008800; font-weight: bold;">if</span> (continentStatisticsIterator<span style="color: #333333;">==</span>continentStatistics.end())
continentStatistics[continent]<span style="color: #333333;">=</span> make_shared<span style="color: #333333;"><</span>statistics<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">>></span>(statistics<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">></span>(country<span style="color: #333333;">-></span>population));
<span style="color: #008800; font-weight: bold;">else</span> {
<span style="color: #008800; font-weight: bold;">auto</span> continentStat<span style="color: #333333;">=</span> continentStatisticsIterator<span style="color: #333333;">-></span>second;
<span style="color: #008800; font-weight: bold;">auto</span> countryPopulation<span style="color: #333333;">=</span> country<span style="color: #333333;">-></span>population;
<span style="color: #008800; font-weight: bold;">if</span> (continentStat<span style="color: #333333;">-></span>minimum <span style="color: #333333;">></span> countryPopulation) continentStat<span style="color: #333333;">-></span>minimum<span style="color: #333333;">=</span> countryPopulation;
<span style="color: #008800; font-weight: bold;">if</span> (continentStat<span style="color: #333333;">-></span>maximum <span style="color: #333333;"><</span> countryPopulation) continentStat<span style="color: #333333;">-></span>maximum<span style="color: #333333;">=</span> countryPopulation;
continentStat<span style="color: #333333;">-></span>sum <span style="color: #333333;">+=</span> countryPopulation;
continentStat<span style="color: #333333;">-></span>numberOfSamples<span style="color: #333333;">++</span>;
}
<span style="color: #008800; font-weight: bold;">return</span> continentStatistics;
};
<span style="color: #008800; font-weight: bold;">auto</span> continentStatistics<span style="color: #333333;">=</span> accumulate(countries.begin(),countries.end(),map<span style="color: #333333;"><</span>string,shared_ptr<span style="color: #333333;"><</span>statistics<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">>>></span>(),statisticsReducer);
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">auto</span><span style="color: #333333;">&</span> entry<span style="color: #333333;">:</span> continentStatistics){
cout <span style="color: #333333;"><<</span> entry.first <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">": "</span> <span style="color: #333333;"><<</span> <span style="color: #333333;">*</span>(entry.second) <span style="color: #333333;"><<</span> endl;
}
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0000dd; font-weight: bold;">0</span>;
}
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">$</span> ./exercise6
<span style="color: #888888;">Creating cities...done.</span>
<span style="color: #888888;">Creating countries...done.</span>
<span style="color: #888888;">Africa: statistics [ number of samples= 58, minimum=0, maximum=111506000, sum=7.84475e+08, average=1.35254e+07 ]</span>
<span style="color: #888888;">Antarctica: statistics [ number of samples= 5, minimum=0, maximum=0, sum=0, average=0 ]</span>
<span style="color: #888888;">Asia: statistics [ number of samples= 51, minimum=286000, maximum=1277558000, sum=3.70503e+09, average=7.26476e+07 ]</span>
<span style="color: #888888;">Europe: statistics [ number of samples= 46, minimum=1000, maximum=146934000, sum=7.30075e+08, average=1.58712e+07 ]</span>
<span style="color: #888888;">North America: statistics [ number of samples= 37, minimum=7000, maximum=278357000, sum=4.82993e+08, average=1.30539e+07 ]</span>
<span style="color: #888888;">Oceania: statistics [ number of samples= 28, minimum=0, maximum=18886000, sum=3.04012e+07, average=1.08576e+06 ]</span>
<span style="color: #888888;">South America: statistics [ number of samples= 14, minimum=2000, maximum=170115000, sum=3.4578e+08, average=2.46986e+07 ]</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>7.</b> Ülkelerin, en az nüfusa ve en çok nüfusa sahip şehirlerini bulalım:</span><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>exercise7.cpp</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#include "city.h"</span>
<span style="color: #557799;">#include "country.h" </span>
<span style="color: #557799;">#include "world-util.h" </span>
<span style="color: #557799;">#include <vector></span>
<span style="color: #557799;">#include <map></span>
<span style="color: #557799;">#include <iostream></span>
<span style="color: #557799;">#include <string></span>
<span style="color: #557799;">#include <memory></span>
<span style="color: #557799;">#include <algorithm></span>
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> std;
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> world;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span>,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>></span> cities;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span>std<span style="color: #333333;">::</span>string,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">>></span> countries;
<span style="color: #008800; font-weight: bold;">template</span> <span style="color: #333333;"><</span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">E</span>,<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">T</span><span style="color: #333333;">></span>
<span style="color: #008800; font-weight: bold;">struct</span> statistics {
E min_element;
E max_element;
T min;
T max;
<span style="color: #333399; font-weight: bold;">int</span> numberOfSamples;
statistics() <span style="color: #333333;">:</span> numberOfSamples(<span style="color: #0000dd; font-weight: bold;">0</span>) {}
};
std<span style="color: #333333;">::</span>ostream<span style="color: #333333;">&</span> <span style="color: #008800; font-weight: bold;">operator</span><span style="color: #333333;"><<</span>(std<span style="color: #333333;">::</span>ostream<span style="color: #333333;">&</span> out,<span style="color: #008800; font-weight: bold;">const</span> statistics<span style="color: #333333;"><</span>shared_ptr<span style="color: #333333;"><</span>city<span style="color: #333333;">></span>,<span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">>&</span> stats){
<span style="color: #008800; font-weight: bold;">if</span> (stats.min_element.get()<span style="color: #333333;">==</span>nullptr) {
out <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">"No body lives in this country!"</span> ;
}<span style="color: #008800; font-weight: bold;">else</span>{
out <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">"statistics [ "</span>
<span style="color: #333333;"><<</span> stats.min_element<span style="color: #333333;">-></span>name
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">" ( "</span> <span style="color: #333333;"><<</span> stats.min <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">" )"</span>
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">", "</span> <span style="color: #333333;"><<</span> stats.max_element<span style="color: #333333;">-></span>name
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">" ( "</span> <span style="color: #333333;"><<</span> stats.max <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">" )"</span>
<span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">" ]"</span>;
}
<span style="color: #008800; font-weight: bold;">return</span> out;
}
<span style="color: #333399; font-weight: bold;">int</span> main(<span style="color: #333399; font-weight: bold;">int</span> argc, <span style="color: #333399; font-weight: bold;">char</span><span style="color: #333333;">*</span> argv[]){
create_world();
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">auto</span><span style="color: #333333;">&</span> entry<span style="color: #333333;">:</span> countries){
<span style="color: #008800; font-weight: bold;">auto</span> this_country<span style="color: #333333;">=</span> entry.second;
<span style="color: #008800; font-weight: bold;">auto</span> country_cities<span style="color: #333333;">=</span> this_country<span style="color: #333333;">-></span>cities;
<span style="color: #008800; font-weight: bold;">auto</span> statisticsReducer<span style="color: #333333;">=</span> [](statistics<span style="color: #333333;"><</span>shared_ptr<span style="color: #333333;"><</span>city<span style="color: #333333;">></span>,<span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">>&</span> cityPopulationStatistics, shared_ptr<span style="color: #333333;"><</span>city<span style="color: #333333;">>&</span> a_city) <span style="color: #333333;">-></span> statistics<span style="color: #333333;"><</span>shared_ptr<span style="color: #333333;"><</span>city<span style="color: #333333;">></span>,<span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">>&</span> {
<span style="color: #008800; font-weight: bold;">auto</span> cityPopulation<span style="color: #333333;">=</span> a_city<span style="color: #333333;">-></span>population;
<span style="color: #008800; font-weight: bold;">if</span> (cityPopulationStatistics.numberOfSamples<span style="color: #333333;">==</span><span style="color: #0000dd; font-weight: bold;">0</span>){
cityPopulationStatistics.min<span style="color: #333333;">=</span> cityPopulation;
cityPopulationStatistics.min_element<span style="color: #333333;">=</span> a_city;
cityPopulationStatistics.max<span style="color: #333333;">=</span> cityPopulation;
cityPopulationStatistics.max_element<span style="color: #333333;">=</span> a_city;
}
cityPopulationStatistics.numberOfSamples<span style="color: #333333;">++</span>;
<span style="color: #008800; font-weight: bold;">if</span> (cityPopulationStatistics.min<span style="color: #333333;">></span>cityPopulation){
cityPopulationStatistics.min<span style="color: #333333;">=</span> cityPopulation;
cityPopulationStatistics.min_element<span style="color: #333333;">=</span> a_city;
}
<span style="color: #008800; font-weight: bold;">if</span> (cityPopulationStatistics.max<span style="color: #333333;">></span>cityPopulation){
cityPopulationStatistics.max<span style="color: #333333;">=</span> cityPopulation;
cityPopulationStatistics.max_element<span style="color: #333333;">=</span> a_city;
}
<span style="color: #008800; font-weight: bold;">return</span> cityPopulationStatistics;
};
<span style="color: #008800; font-weight: bold;">auto</span> populationStatistics<span style="color: #333333;">=</span> accumulate(country_cities.begin(),country_cities.end(),statistics<span style="color: #333333;"><</span>shared_ptr<span style="color: #333333;"><</span>city<span style="color: #333333;">></span>,<span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">></span>(),statisticsReducer);
cout <span style="color: #333333;"><<</span> this_country<span style="color: #333333;">-></span>name <span style="color: #333333;"><<</span> <span style="background-color: #fff0f0;">"'s statistics:"</span> <span style="color: #333333;"><<</span> endl;
cout <span style="color: #333333;"><<</span> populationStatistics <span style="color: #333333;"><<</span> endl;
}
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0000dd; font-weight: bold;">0</span>;
}
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">$</span> ./exercise7
<span style="color: #888888;">Creating cities...done.</span>
<span style="color: #888888;">Creating countries...done.</span>
<span style="color: #888888;">Aruba's statistics:</span>
<span style="color: #888888;">statistics [ Oranjestad ( 29034 ), Oranjestad ( 29034 ) ]</span>
<span style="color: #888888;">Afghanistan's statistics:</span>
<span style="color: #888888;">statistics [ Mazar-e-Sharif ( 127800 ), Mazar-e-Sharif ( 127800 ) ]</span>
<span style="color: #888888;">Angola's statistics:</span>
<span style="color: #888888;">statistics [ Namibe ( 118200 ), Namibe ( 118200 ) ]</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">.</span>
<span style="color: #888888;">South Africa's statistics:</span>
<span style="color: #888888;">statistics [ Ladysmith ( 89292 ), Ladysmith ( 89292 ) ]</span>
<span style="color: #888888;">Zambia's statistics:</span>
<span style="color: #888888;">statistics [ Luanshya ( 118100 ), Luanshya ( 118100 ) ]</span>
<span style="color: #888888;">Zimbabwe's statistics:</span>
<span style="color: #888888;">statistics [ Gweru ( 128037 ), Gweru ( 128037 ) ]</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>8.</b> En kalabalık başkenti bulalım:</span><br />
<br />
<b><span style="font-family: "georgia" , "times new roman" , serif;"><u>exercise8.cpp</u>:</span></b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#include "city.h"</span>
<span style="color: #557799;">#include "country.h" </span>
<span style="color: #557799;">#include "world-util.h" </span>
<span style="color: #557799;">#include <vector></span>
<span style="color: #557799;">#include <map></span>
<span style="color: #557799;">#include <iostream></span>
<span style="color: #557799;">#include <string></span>
<span style="color: #557799;">#include <memory></span>
<span style="color: #557799;">#include <algorithm></span>
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> std;
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> world;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span>,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>></span> cities;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span>std<span style="color: #333333;">::</span>string,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">>></span> countries;
<span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">main</span>(<span style="color: #333399; font-weight: bold;">int</span> argc, <span style="color: #333399; font-weight: bold;">char</span><span style="color: #333333;">*</span> argv[]){
create_world();
<span style="color: #008800; font-weight: bold;">auto</span> highPopulatedCapitalReducer<span style="color: #333333;">=</span> [](shared_ptr<span style="color: #333333;"><</span>city<span style="color: #333333;">>&</span> highPopulatedCapital, pair<span style="color: #333333;"><</span><span style="color: #008800; font-weight: bold;">const</span> string,shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">>>&</span> entry) <span style="color: #333333;">-></span> shared_ptr<span style="color: #333333;"><</span>city<span style="color: #333333;">>&</span> {
<span style="color: #008800; font-weight: bold;">auto</span> capital<span style="color: #333333;">=</span> entry.second<span style="color: #333333;">-></span>capital;
<span style="color: #008800; font-weight: bold;">if</span>(capital<span style="color: #333333;">==</span>nullptr) <span style="color: #008800; font-weight: bold;">return</span> highPopulatedCapital;
<span style="color: #008800; font-weight: bold;">auto</span> population<span style="color: #333333;">=</span> capital<span style="color: #333333;">-></span>population;
<span style="color: #008800; font-weight: bold;">if</span> (highPopulatedCapital<span style="color: #333333;">==</span>nullptr){
highPopulatedCapital<span style="color: #333333;">=</span> capital;
} <span style="color: #008800; font-weight: bold;">else</span> <span style="color: #008800; font-weight: bold;">if</span> (highPopulatedCapital<span style="color: #333333;">-></span>population<span style="color: #333333;"><</span>population) {
highPopulatedCapital<span style="color: #333333;">=</span> capital;
}
<span style="color: #008800; font-weight: bold;">return</span> highPopulatedCapital;
};
<span style="color: #008800; font-weight: bold;">auto</span> highPopulatedCapital <span style="color: #333333;">=</span> accumulate(countries.begin(),countries.end(),shared_ptr<span style="color: #333333;"><</span>city<span style="color: #333333;">></span>(nullptr),highPopulatedCapitalReducer).get();
cout <span style="color: #333333;"><<</span> <span style="color: #333333;">*</span>highPopulatedCapital <span style="color: #333333;"><<</span> endl;
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0000dd; font-weight: bold;">0</span>;
}
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">$</span> ./exercise8
<span style="color: #888888;">Creating cities...done.</span>
<span style="color: #888888;">Creating countries...done.</span>
<span style="color: #888888;">city [ id=2331, name=Seoul, country [ code=KOR, name=South Korea, population=46844000, surface_area=99434, gnp=320749, continent=Asia, # of cities= 0 ], population=9981619 ]</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><b>Ranges</b></span><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki örnek problemlerin çözümünde <b>STL</b> kütüphanesini ve <i><b>fonksiyonel programlamayı</b></i> kullanmış olmak, kodlama üretkenliğimizi iyileştirmiş olsa da hala her çözümde tekrar ettiğimiz noktalar bulunuyor. Üstelik STL torbalaları üzerinde yaptığımız işlemlerin bellek kullanımı ve çalışma zamanı başarımında problemler bulunuyor. Bu problemlerin çözümü için geliştirilen iki kütüphane bulunuyor:</span><br />
<br />
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><a href="http://www.boost.org/doc/libs/1_64_0/libs/range/doc/html/index.html" target="_blank">Boost Range 2.0</a></span></li>
<li><a href="https://github.com/ericniebler/range-v3" target="_blank"><span style="font-family: "georgia" , "times new roman" , serif;">Range 3.0</span></a></li>
</ul>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">İkinci çözüm <a href="https://github.com/ericniebler" target="_blank">Eric Niebler</a>'e ait ve <b>C++20</b> standardına eklenmek üzere kabul edilmiş durumda. <b>2020</b> yılında çıkacak <b>C++</b>'ın yeni sürümünde hazır olarak ulaşacağımız bir çözüm sunuyor. Eğer <b>C++14</b> ve sonrası bir <b>C++</b> derleyiciniz varsa şimdiden kullanabilirsiniz. Şimdi yukarıda çözdüğümüz problemlerin bir kaçını tekrar ele alalım ve <b>Range v3</b> ile tekrar çözelim:</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>1.</b> Asya kıtasındaki ülkelerin bir listesini almak istiyoruz:</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b><u>ranges1.cpp</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#include "city.h"</span>
<span style="color: #557799;">#include "country.h"</span>
<span style="color: #557799;">#include "world-util.h"</span>
<span style="color: #557799;">#include <vector></span>
<span style="color: #557799;">#include <functional></span>
<span style="color: #557799;">#include <map></span>
<span style="color: #557799;">#include <iostream></span>
<span style="color: #557799;">#include <string></span>
<span style="color: #557799;">#include <memory></span>
<span style="color: #557799;">#include <range/v3/core.hpp></span>
<span style="color: #557799;">#include <range/v3/view/transform.hpp></span>
<span style="color: #557799;">#include <range/v3/view/map.hpp></span>
<span style="color: #557799;">#include <range/v3/view/view.hpp></span>
<span style="color: #557799;">#include <range/v3/view/filter.hpp></span>
<span style="color: #557799;">#include <range/v3/algorithm/for_each.hpp></span>
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> std;
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> world;
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> ranges<span style="color: #333333;">::</span>v3;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span>,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>></span> cities;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span>std<span style="color: #333333;">::</span>string,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">>></span> countries;
<span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">main</span>(<span style="color: #333399; font-weight: bold;">int</span> argc, <span style="color: #333399; font-weight: bold;">char</span><span style="color: #333333;">*</span> argv[]){
create_world();
<span style="color: #008800; font-weight: bold;">auto</span> is_asian <span style="color: #333333;">=</span> [](shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">></span> <span style="color: #333333;">&</span>a_country) <span style="color: #333333;">-></span> <span style="color: #333399; font-weight: bold;">bool</span> {
<span style="color: #008800; font-weight: bold;">return</span> a_country<span style="color: #333333;">-></span>continent.compare(<span style="background-color: #fff0f0;">"Asia"</span>) <span style="color: #333333;">==</span> <span style="color: #0000dd; font-weight: bold;">0</span>;
};
<span style="color: #008800; font-weight: bold;">const</span> <span style="color: #008800; font-weight: bold;">auto</span> asian_countries<span style="color: #333333;">=</span>countries <span style="color: #333333;">|</span> view<span style="color: #333333;">::</span>values <span style="color: #333333;">|</span> view<span style="color: #333333;">::</span>filter(is_asian) <span style="color: #333333;">|</span> to_vector ;
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">auto</span><span style="color: #333333;">&</span> a_country <span style="color: #333333;">:</span> asian_countries)
cout <span style="color: #333333;"><<</span> <span style="color: #333333;">*</span>a_country <span style="color: #333333;"><<</span> endl;
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0000dd; font-weight: bold;">0</span>;
}
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>2.</b> Ülkelerin adlarından oluşan bir liste oluşturmak istiyoruz:</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b><u>ranges2.cpp</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#include "city.h"</span>
<span style="color: #557799;">#include "country.h" </span>
<span style="color: #557799;">#include "world-util.h" </span>
<span style="color: #557799;">#include <vector></span>
<span style="color: #557799;">#include <functional></span>
<span style="color: #557799;">#include <map></span>
<span style="color: #557799;">#include <iostream></span>
<span style="color: #557799;">#include <string></span>
<span style="color: #557799;">#include <memory></span>
<span style="color: #557799;">#include <range/v3/core.hpp></span>
<span style="color: #557799;">#include <range/v3/view/transform.hpp></span>
<span style="color: #557799;">#include <range/v3/view/map.hpp></span>
<span style="color: #557799;">#include <range/v3/view/view.hpp></span>
<span style="color: #557799;">#include <range/v3/view/filter.hpp></span>
<span style="color: #557799;">#include <range/v3/algorithm/for_each.hpp></span>
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> std;
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> world;
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> ranges<span style="color: #333333;">::</span>v3;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span>,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>></span> cities;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span>std<span style="color: #333333;">::</span>string,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">>></span> countries;
<span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">main</span>(<span style="color: #333399; font-weight: bold;">int</span> argc, <span style="color: #333399; font-weight: bold;">char</span><span style="color: #333333;">*</span> argv[]){
create_world();
<span style="color: #008800; font-weight: bold;">auto</span> country_name_mapper <span style="color: #333333;">=</span> [](shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">></span> <span style="color: #333333;">&</span>a_country) <span style="color: #333333;">-></span> string {
<span style="color: #008800; font-weight: bold;">return</span> a_country<span style="color: #333333;">-></span>name ;
};
<span style="color: #008800; font-weight: bold;">const</span> <span style="color: #008800; font-weight: bold;">auto</span> countries_names<span style="color: #333333;">=</span> countries <span style="color: #333333;">|</span> view<span style="color: #333333;">::</span>values <span style="color: #333333;">|</span> view<span style="color: #333333;">::</span>transform(country_name_mapper) <span style="color: #333333;">|</span> to_vector ;
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">auto</span><span style="color: #333333;">&</span> country_name <span style="color: #333333;">:</span> countries_names)
cout <span style="color: #333333;"><<</span> country_name <span style="color: #333333;"><<</span> endl;
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0000dd; font-weight: bold;">0</span>;
}
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>3.</b> Dünya ülkelerini, <b>GNP</b> değerleri <b>25000</b>'nin <i>altında</i> olan ülkeler ve </span><b style="font-family: Georgia, "Times New Roman", serif;">25000</b><span style="font-family: "georgia" , "times new roman" , serif;">'nin </span><span style="font-family: "georgia" , "times new roman" , serif;"><i>üstünde </i>olan ülkeler olarak <i><b>iki sınıfta</b></i> gruplayalım:</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br /></span>
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>ranges3.cpp</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;">#include "city.h"</span>
<span style="color: #557799;">#include "country.h" </span>
<span style="color: #557799;">#include "world-util.h" </span>
<span style="color: #557799;">#include <vector></span>
<span style="color: #557799;">#include <functional></span>
<span style="color: #557799;">#include <map></span>
<span style="color: #557799;">#include <iostream></span>
<span style="color: #557799;">#include <string></span>
<span style="color: #557799;">#include <memory></span>
<span style="color: #557799;">#include <range/v3/core.hpp></span>
<span style="color: #557799;">#include <range/v3/view/transform.hpp></span>
<span style="color: #557799;">#include <range/v3/view/map.hpp></span>
<span style="color: #557799;">#include <range/v3/view/group_by.hpp></span>
<span style="color: #557799;">#include <range/v3/view/all.hpp></span>
<span style="color: #557799;">#include <range/v3/view/join.hpp></span>
<span style="color: #557799;">#include <range/v3/view/view.hpp></span>
<span style="color: #557799;">#include <range/v3/action/sort.hpp></span>
<span style="color: #557799;">#include <range/v3/view/filter.hpp></span>
<span style="color: #557799;">#include <range/v3/algorithm/for_each.hpp></span>
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> std;
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> world;
<span style="color: #008800; font-weight: bold;">using</span> <span style="color: #008800; font-weight: bold;">namespace</span> ranges;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span><span style="color: #333399; font-weight: bold;">int</span>,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>city<span style="color: #333333;">>></span> cities;
std<span style="color: #333333;">::</span>map<span style="color: #333333;"><</span>std<span style="color: #333333;">::</span>string,std<span style="color: #333333;">::</span>shared_ptr<span style="color: #333333;"><</span>world<span style="color: #333333;">::</span>country<span style="color: #333333;">>></span> countries;
<span style="color: #008800; font-weight: bold;">auto</span> <span style="color: #0066bb; font-weight: bold;">group_by_gnp</span>() {
<span style="color: #008800; font-weight: bold;">return</span>
view<span style="color: #333333;">::</span>group_by(
[](shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">></span> a,shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">></span> b) <span style="color: #333333;">-></span> <span style="color: #333399; font-weight: bold;">bool</span> {
<span style="color: #008800; font-weight: bold;">auto</span> is_a_rich<span style="color: #333333;">=</span> a<span style="color: #333333;">-></span>gnp <span style="color: #333333;">>=</span> <span style="color: #6600ee; font-weight: bold;">25000.0</span> ;
<span style="color: #008800; font-weight: bold;">auto</span> is_b_rich<span style="color: #333333;">=</span> b<span style="color: #333333;">-></span>gnp <span style="color: #333333;">>=</span> <span style="color: #6600ee; font-weight: bold;">25000.0</span> ;
<span style="color: #008800; font-weight: bold;">return</span> is_a_rich <span style="color: #333333;">==</span> is_b_rich ;
}
);
}
<span style="color: #008800; font-weight: bold;">auto</span> order_by_gnp <span style="color: #333333;">=</span> [](shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">></span> <span style="color: #333333;">&</span>a,shared_ptr<span style="color: #333333;"><</span>country<span style="color: #333333;">></span> <span style="color: #333333;">&</span>b) <span style="color: #333333;">-></span> <span style="color: #333399; font-weight: bold;">bool</span> {
<span style="color: #008800; font-weight: bold;">return</span> a<span style="color: #333333;">-></span>gnp <span style="color: #333333;"><</span> b<span style="color: #333333;">-></span>gnp ;
};
<span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">main</span>(<span style="color: #333399; font-weight: bold;">int</span> argc, <span style="color: #333399; font-weight: bold;">char</span><span style="color: #333333;">*</span> argv[]){
create_world();
<span style="color: #008800; font-weight: bold;">auto</span> all<span style="color: #333333;">=</span> countries <span style="color: #333333;">|</span> view<span style="color: #333333;">::</span>values <span style="color: #333333;">|</span> to_vector <span style="color: #333333;">|</span> action<span style="color: #333333;">::</span>sort(order_by_gnp);
<span style="color: #008800; font-weight: bold;">auto</span> rich_poor_countries<span style="color: #333333;">=</span> all <span style="color: #333333;">|</span> group_by_gnp() ;
RANGES_FOR(<span style="color: #008800; font-weight: bold;">auto</span> cluster, rich_poor_countries)
{
RANGES_FOR(<span style="color: #008800; font-weight: bold;">auto</span> c, cluster)
{
cout <span style="color: #333333;"><<</span> <span style="color: #333333;">*</span>c <span style="color: #333333;"><<</span> endl;
}
cout <span style="color: #333333;"><<</span> endl;
}
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0000dd; font-weight: bold;">0</span>;
}
</pre>
</div>
Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-10578801859558517292017-08-05T00:29:00.000+03:002017-08-05T00:29:11.888+03:00Spring Boot Uygulamalarının SSL Yapılandırması<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Spring Boot</b> uygulamalarında yapılandırma dosyası varsayılan olarak <b>application.properties</b> dosyasıdır. <b>Spring Boot</b> uygulamalarının <b>SSL</b> yapılandırmasını da <b>application.properties</b> dosyasından gerçekleştireceğiz. Sertifika otaritesinden aldığımız sertifikaları <b>PKCS12 </b>formatında <b>Anahtar Deposu</b> </span><span style="font-family: "georgia" , "times new roman" , serif;"> (=<b>KeyStore</b>) dosyasında saklıyoruz. <b>PKCS12</b>, </span><span style="font-family: "georgia" , "times new roman" , serif;">kapalı anahtar ve sertifikaları depolamak ve uygulamalar tarafından erişilebilmesini sağlamak amacıyla geliştirlen dilden ve platformdan bağımsız bir saklama kabı standardıdır. <b>PKCS12 </b>dosyasını oluşturmak amacıyla aşağıdaki komutu çalıştırmanız gerekir:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">openssl pkcs12 -export -inkey example.com.key -in example.com.cer -name mywebapp -out /tmp/keystore.p12 -password</span>
</pre>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Bu komut, parametre olarak <b><i>kapalı anahtar</i></b> (<i>example.com.key</i>) ve <b>sertifikayı </b>(<b><i>example.com.cer</i></b>) alıyor ve <b>PKCS12 </b>standardına uygun olarak <b><i>/tmp/keystore.p12</i></b> isimli dosyada saklıyor. Komutu çalıştırdığımızda bizden bir parola isteyecektir. Parola olarak <b>Secret_1234</b> karakter katarını girmiş olalım. Bu parola ile uygulamalar <b>Anahtar Deposundaki</b> <i>anahtar </i>ya da <i>sertifikayı </i>okuyabilirler. Anahtar Deposunda çok sayıda anahtar ve sertifika saklamak mümkündür. Bu nedenle Anahtar ve sertifikayı saklarken bir etiket atıyoruz. Örneğimizde, <b>Anahtar Deposunda</b> sakladığımız <b><i>kapalı anahtar</i></b> ve <i><b>sertifikaya </b></i><b>mywebapp</b> etiketini verdik. Sonuç olarak, uygulamalar, <b>Anahtar Deposunda </b>sakladığımız anahtarı ve sertifikayı <b>mywebapp </b>etiketi ve <b>Secret_1234 </b>parolası ile okuyabilirler.</span></div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Artık <b>Spring Boot</b> uygulamasında <b>SSL </b>yapılandırması için <b>application.properties</b> dosyası içerisine gerekli tanımlamaları yapabiliriz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">server.ssl.key-store=/tmp/keystore.p12</span>
<span style="color: #888888;">server.ssl.key-store-password=Secret_1234</span>
<span style="color: #888888;">server.ssl.keyStoreType=PKCS12</span>
<span style="color: #888888;">server.ssl.keyAlias=mywebapp</span>
</pre>
</div>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: Georgia, Times New Roman, serif;"><b>Spring Boot </b>uygulamalarından bağımsız olarak <b>Java </b>uygulamalarının sertifika dosyasını okuyabilmeleri için <b><i>Java Sanal Makinasına</i></b> aşağıdaki parametreleri geçirmek gerekir:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">export JAVA_OPTS="-Dserver.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.trustStoreType=jks -Djavax.net.ssl.keyStoreType=pkcs12"</span>
</pre>
</div>
Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-88343378717036858602017-08-02T13:00:00.001+03:002017-08-04T23:07:16.461+03:00Java'da Dizin Arşivleme, Sıkıştırma ve Açma İşlemleri<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhBE-jGICZV-dteSugv-OCQMVu1iGYeXDiFESbBA-g44A8LRiBb1KJOI-rY7MvJv5RwrddBmtF8PZkmh14dEEQIy4dnxRq3ScyKrGrGs_pd-JQvFwpZqBnhueJXnmk07cHmXdk-i42G-je/s1600/java-zip-apismall.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="257" data-original-width="359" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhBE-jGICZV-dteSugv-OCQMVu1iGYeXDiFESbBA-g44A8LRiBb1KJOI-rY7MvJv5RwrddBmtF8PZkmh14dEEQIy4dnxRq3ScyKrGrGs_pd-JQvFwpZqBnhueJXnmk07cHmXdk-i42G-je/s1600/java-zip-apismall.png" /></a></div>
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br />
</b></span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>Java 7</b> ile birlikte <i>üçüncü parti bir kütüphane kullanmadan</i> <b>ZIP API</b> yardımı ile arşivleme, sıkıştırma ve sıkıştırılmış dosyayı geri açma işlemlerini kolaylıkla gerçekleştirebiliyoruz. <b>ZIP API</b>, <b>NIO.2</b> ve <b>Stream API</b> ile yakın işbirliği olan bir <b>API</b>. <b>ZIP API</b>, bize <b>Java 7</b>'de ve <b>Java 8</b>'de gelen yenilikleri kullandırıyor. Bu yazıda <b>ZIP API</b>'nin yeteneklerini örnek problemler üzerinden inceleyeceğiz.</span></div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span><span style="font-family: "georgia" , "times new roman" , serif;"><b>1. Java Nesnelerini Sıkıştırılmış Zip Dosyası Olarak Saklamak</b></span><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Bir dizi <b>Customer</b> sınıfı nesnesini <b>zip <i>dosyası</i></b> içinde <b><i>customers.dat</i></b> kaydıyla saklamak istiyoruz:</span><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Customer.java</u>:</b></span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">zip</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.Serializable</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Customer</span> <span style="color: #008800; font-weight: bold;">implements</span> Serializable <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> String identityNo<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String firstName<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String lastName<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Customer</span><span style="color: #333333;">(</span>String identityNo<span style="color: #333333;">,</span> String firstName<span style="color: #333333;">,</span> String lastName<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">identityNo</span> <span style="color: #333333;">=</span> identityNo<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">firstName</span> <span style="color: #333333;">=</span> firstName<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">lastName</span> <span style="color: #333333;">=</span> lastName<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">getIdentityNo</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> identityNo<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setIdentityNo</span><span style="color: #333333;">(</span>String identityNo<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">identityNo</span> <span style="color: #333333;">=</span> identityNo<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">getFirstName</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> firstName<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setFirstName</span><span style="color: #333333;">(</span>String firstName<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">firstName</span> <span style="color: #333333;">=</span> firstName<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">getLastName</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> lastName<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setLastName</span><span style="color: #333333;">(</span>String lastName<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">lastName</span> <span style="color: #333333;">=</span> lastName<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">toString</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="background-color: #fff0f0;">"Customer{"</span> <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"identityNo="</span> <span style="color: #333333;">+</span> identityNo <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">", firstName="</span> <span style="color: #333333;">+</span> firstName <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">", lastName="</span> <span style="color: #333333;">+</span> lastName <span style="color: #333333;">+</span> <span style="color: #0044dd;">'}'</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>CompressJavaObjects.java</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">zip</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.BufferedOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.File</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.ObjectOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipEntry</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">CompressJavaObjects</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> Exception <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">final</span> File zipFile <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"customers.zip"</span><span style="color: #333333;">);</span>
List<span style="color: #333333;"><</span>Customer<span style="color: #333333;">></span> customers<span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Customer</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"1"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"jack"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"shephard"</span><span style="color: #333333;">),</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Customer</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"2"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"kate"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"austen"</span><span style="color: #333333;">),</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Customer</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"3"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"james"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"sawyer"</span><span style="color: #333333;">),</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Customer</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"4"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"ben"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"linus"</span><span style="color: #333333;">),</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Customer</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"5"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"jin"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"kwon"</span><span style="color: #333333;">)</span>
<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">try</span><span style="color: #333333;">(</span>
<span style="color: #008800; font-weight: bold;">final</span> FileOutputStream fos <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> FileOutputStream<span style="color: #333333;">(</span>zipFile<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> ZipOutputStream zos<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ZipOutputStream<span style="color: #333333;">(</span>fos<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> BufferedOutputStream bos<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> BufferedOutputStream<span style="color: #333333;">(</span>zos<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> ObjectOutputStream oos<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ObjectOutputStream<span style="color: #333333;">(</span>bos<span style="color: #333333;">);</span>
<span style="color: #333333;">){</span>
<span style="color: #008800; font-weight: bold;">final</span> ZipEntry zipEntry <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ZipEntry<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"customers.dat"</span><span style="color: #333333;">);</span>
zos<span style="color: #333333;">.</span><span style="color: #0000cc;">putNextEntry</span><span style="color: #333333;">(</span>zipEntry<span style="color: #333333;">);</span>
oos<span style="color: #333333;">.</span><span style="color: #0000cc;">writeObject</span><span style="color: #333333;">(</span>customers<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>2. Java Nesnelerini Sıkıştırılmış Dosyadan Geri Kazanmak</b></span><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Bir dizi <b>Customer</b> sınıfı nesnesini <i><b>zip dosyası</b></i> içindeki <b>customers.dat</b> kaydından geri almak istiyoruz:</span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">zip</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.BufferedInputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.File</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileInputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.ObjectInputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Path</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Paths</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipEntry</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipFile</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipInputStream</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">DecompressJavaObjects</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> Exception <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">final</span> Path path <span style="color: #333333;">=</span> Paths<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"customers.zip"</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> File file <span style="color: #333333;">=</span> path<span style="color: #333333;">.</span><span style="color: #0000cc;">toFile</span><span style="color: #333333;">();</span>
ZipFile zipFile<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ZipFile<span style="color: #333333;">(</span>file<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">try</span><span style="color: #333333;">(</span>
<span style="color: #008800; font-weight: bold;">final</span> FileInputStream fis <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> FileInputStream<span style="color: #333333;">(</span>file<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> ZipInputStream zis<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ZipInputStream<span style="color: #333333;">(</span>fis<span style="color: #333333;">);</span>
<span style="color: #333333;">){</span>
<span style="color: #008800; font-weight: bold;">final</span> ZipEntry zipEntry <span style="color: #333333;">=</span> zis<span style="color: #333333;">.</span><span style="color: #0000cc;">getNextEntry</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">final</span> BufferedInputStream bis<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> BufferedInputStream<span style="color: #333333;">(</span>zipFile<span style="color: #333333;">.</span><span style="color: #0000cc;">getInputStream</span><span style="color: #333333;">(</span>zipEntry<span style="color: #333333;">));</span>
<span style="color: #008800; font-weight: bold;">final</span> ObjectInputStream ois<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ObjectInputStream<span style="color: #333333;">(</span>bis<span style="color: #333333;">);</span>
List<span style="color: #333333;"><</span>Customer<span style="color: #333333;">></span> customers<span style="color: #333333;">=</span> <span style="color: #333333;">(</span>List<span style="color: #333333;"><</span>Customer<span style="color: #333333;">>)</span> ois<span style="color: #333333;">.</span><span style="color: #0000cc;">readObject</span><span style="color: #333333;">();</span>
ois<span style="color: #333333;">.</span><span style="color: #0000cc;">close</span><span style="color: #333333;">();</span>
bis<span style="color: #333333;">.</span><span style="color: #0000cc;">close</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span></pre>
</div>
<b><br />
</b> <b>3. Zip Dosya İçindeki Dizinleri Sözlük Sırasına Göre Sıralı Olarak Listelemek</b><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">zip</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.IOException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Paths</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.Collectors</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipEntry</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipFile</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ListDirectoriesInZipFile</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> IOException <span style="color: #333333;">{</span>
ZipFile zipFile<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ZipFile<span style="color: #333333;">(</span>Paths<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"mastermind-game.zip"</span><span style="color: #333333;">).</span><span style="color: #0000cc;">toFile</span><span style="color: #333333;">());</span>
List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> directories<span style="color: #333333;">=</span> zipFile<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">ZipEntry:</span><span style="color: #333333;">:</span>isDirectory<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">ZipEntry:</span><span style="color: #333333;">:</span>getName<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>path <span style="color: #333333;">-></span> path<span style="color: #333333;">.</span><span style="color: #0000cc;">substring</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> path<span style="color: #333333;">.</span><span style="color: #0000cc;">length</span><span style="color: #333333;">()-</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">sorted</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">String:</span><span style="color: #333333;">:</span>compareTo<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">toList</span><span style="color: #333333;">());</span>
directories<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki uygulamayı çalıştırdığımızda aşağıda verildiği gibi bir ekran çıktısı elde ediyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">mastermind-game</span>
<span style="color: #888888;">mastermind-game/.settings</span>
<span style="color: #888888;">mastermind-game/src</span>
<span style="color: #888888;">mastermind-game/src/main</span>
<span style="color: #888888;">mastermind-game/src/main/java</span>
<span style="color: #888888;">mastermind-game/src/main/java/com</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/service</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/service/impl</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/validation</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/web</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/web/controller</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/web/model</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/web/viewmodel</span>
<span style="color: #888888;">mastermind-game/src/main/resources</span>
<span style="color: #888888;">mastermind-game/src/main/webapp</span>
<span style="color: #888888;">mastermind-game/src/main/webapp/WEB-INF</span>
<span style="color: #888888;">mastermind-game/src/main/webapp/WEB-INF/pages</span>
<span style="color: #888888;">mastermind-game/src/main/webapp/WEB-INF/tags</span>
<span style="color: #888888;">mastermind-game/src/main/webapp/resources</span>
<span style="color: #888888;">mastermind-game/src/main/webapp/resources/css</span>
<span style="color: #888888;">mastermind-game/src/main/webapp/resources/images</span></pre>
</div>
<br />
<b>4. Zip Dosya İçindeki Dizin ve Dosyaları Saymak</b><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Zip</b> dosya içindeki toplam dizin ve sıradan dosya sayısını bulmak istiyoruz. Bunu yaparken ayrıca her bir dizindeki dosya sayısını da elde etmek istiyoruz.</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">zip</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.IOException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Paths</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.Map</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.function.Function</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.function.Predicate</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.Collectors</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipEntry</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipFile</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">CountFilesInZipFile</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> IOException <span style="color: #333333;">{</span>
ZipFile zipFile<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ZipFile<span style="color: #333333;">(</span>Paths<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"mastermind-game.zip"</span><span style="color: #333333;">).</span><span style="color: #0000cc;">toFile</span><span style="color: #333333;">());</span>
<span style="color: #008800; font-weight: bold;">final</span> Function<span style="color: #333333;"><</span>ZipEntry<span style="color: #333333;">,</span> String<span style="color: #333333;">></span> groupByParentDirectory <span style="color: #333333;">=</span> entry <span style="color: #333333;">-></span> entry<span style="color: #333333;">.</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">().</span><span style="color: #0000cc;">substring</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> entry<span style="color: #333333;">.</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">().</span><span style="color: #0000cc;">lastIndexOf</span><span style="color: #333333;">(</span><span style="color: #0044dd;">'/'</span><span style="color: #333333;">));</span>
<span style="color: #008800; font-weight: bold;">final</span> Predicate<span style="color: #333333;"><</span>ZipEntry<span style="color: #333333;">></span> isDirectory <span style="color: #333333;">=</span> <span style="color: #997700; font-weight: bold;">ZipEntry:</span><span style="color: #333333;">:</span>isDirectory<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">final</span> Predicate<span style="color: #333333;"><</span>ZipEntry<span style="color: #333333;">></span> isFile <span style="color: #333333;">=</span> isDirectory<span style="color: #333333;">.</span><span style="color: #0000cc;">negate</span><span style="color: #333333;">();</span>
Map<span style="color: #333333;"><</span>String<span style="color: #333333;">,</span>Long<span style="color: #333333;">></span> fileCounts<span style="color: #333333;">=</span>
zipFile<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span>isFile<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">groupingBy</span><span style="color: #333333;">(</span>groupByParentDirectory<span style="color: #333333;">,</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">counting</span><span style="color: #333333;">()));</span>
fileCounts<span style="color: #333333;">.</span><span style="color: #0000cc;">entrySet</span><span style="color: #333333;">().</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>
pair <span style="color: #333333;">-></span> System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>
String<span style="color: #333333;">.</span><span style="color: #0000cc;">format</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"There are %d files in the directory %s"</span><span style="color: #333333;">,</span>pair<span style="color: #333333;">.</span><span style="color: #0000cc;">getValue</span><span style="color: #333333;">(),</span>pair<span style="color: #333333;">.</span><span style="color: #0000cc;">getKey</span><span style="color: #333333;">())</span>
<span style="color: #333333;">)</span>
<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">long</span> numberOfFiles<span style="color: #333333;">=</span> fileCounts<span style="color: #333333;">.</span><span style="color: #0000cc;">values</span><span style="color: #333333;">().</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">mapToLong</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Long:</span><span style="color: #333333;">:</span>longValue<span style="color: #333333;">).</span><span style="color: #0000cc;">sum</span><span style="color: #333333;">();</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Total number of files: "</span><span style="color: #333333;">+</span>numberOfFiles<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Total number of directories: "</span><span style="color: #333333;">+</span>fileCounts<span style="color: #333333;">.</span><span style="color: #0000cc;">size</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki uygulamayı çalıştırdığımızda aşağıda verildiği gibi bir ekran çıktısı elde ediyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">There are 10 files in the directory mastermind-game/.settings</span>
<span style="color: #888888;">There are 2 files in the directory mastermind-game/src/main/webapp/resources/images</span>
<span style="color: #888888;">There are 4 files in the directory mastermind-game/src/main/java/com/example/web/model</span>
<span style="color: #888888;">There are 2 files in the directory mastermind-game/src/main/webapp/resources/css</span>
<span style="color: #888888;">There are 4 files in the directory mastermind-game</span>
<span style="color: #888888;">There are 1 files in the directory mastermind-game/src/main/java/com/example/service/impl</span>
<span style="color: #888888;">There are 1 files in the directory mastermind-game/src/main/java/com/example/service</span>
<span style="color: #888888;">There are 4 files in the directory mastermind-game/src/main/webapp/WEB-INF</span>
<span style="color: #888888;">There are 2 files in the directory mastermind-game/src/main/java/com/example/web/controller</span>
<span style="color: #888888;">There are 5 files in the directory mastermind-game/src/main/webapp/WEB-INF/pages</span>
<span style="color: #888888;">There are 5 files in the directory mastermind-game/src/main/resources</span>
<span style="color: #888888;">There are 1 files in the directory mastermind-game/src/main/java/com/example/web/viewmodel</span>
<span style="color: #888888;">There are 6 files in the directory mastermind-game/src/main/java/com/example/validation</span>
<span style="color: #888888;">There are 7 files in the directory mastermind-game/src/main/webapp/WEB-INF/tags</span>
<span style="color: #888888;">Total number of files: 54</span>
<span style="color: #888888;">Total number of directories: 14</span>
</pre>
</div>
<br />
<b>5. Zip Dosya İçindeki java Uzantılı Dosyaları Listelemek</b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">zip</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.IOException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Paths</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.Comparator</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.function.Predicate</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.Collectors</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipEntry</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipFile</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ListJavaFilesInZipFile</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> IOException <span style="color: #333333;">{</span>
ZipFile zipFile<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ZipFile<span style="color: #333333;">(</span>Paths<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"mastermind-game.zip"</span><span style="color: #333333;">).</span><span style="color: #0000cc;">toFile</span><span style="color: #333333;">());</span>
<span style="color: #008800; font-weight: bold;">final</span> Predicate<span style="color: #333333;"><</span>ZipEntry<span style="color: #333333;">></span> isDirectory <span style="color: #333333;">=</span> <span style="color: #997700; font-weight: bold;">ZipEntry:</span><span style="color: #333333;">:</span>isDirectory<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">final</span> Predicate<span style="color: #333333;"><</span>ZipEntry<span style="color: #333333;">></span> isFile <span style="color: #333333;">=</span> isDirectory<span style="color: #333333;">.</span><span style="color: #0000cc;">negate</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">final</span> Comparator<span style="color: #333333;"><</span>ZipEntry<span style="color: #333333;">></span> sortByName <span style="color: #333333;">=</span> <span style="color: #333333;">(</span>z1<span style="color: #333333;">,</span>z2<span style="color: #333333;">)</span> <span style="color: #333333;">-></span> Paths<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span>z1<span style="color: #333333;">.</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">()).</span><span style="color: #0000cc;">toFile</span><span style="color: #333333;">().</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">().</span><span style="color: #0000cc;">compareTo</span><span style="color: #333333;">(</span>Paths<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span>z2<span style="color: #333333;">.</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">()).</span><span style="color: #0000cc;">toFile</span><span style="color: #333333;">().</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">());</span>
Predicate<span style="color: #333333;"><</span>ZipEntry<span style="color: #333333;">></span> isJavaFile<span style="color: #333333;">=</span> entry <span style="color: #333333;">-></span> entry<span style="color: #333333;">.</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">().</span><span style="color: #0000cc;">endsWith</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">".java"</span><span style="color: #333333;">);</span>
List<span style="color: #333333;"><</span>ZipEntry<span style="color: #333333;">></span> javaFiles<span style="color: #333333;">=</span>
zipFile<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span>isFile<span style="color: #333333;">.</span><span style="color: #0000cc;">and</span><span style="color: #333333;">(</span>isJavaFile<span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">sorted</span><span style="color: #333333;">(</span>sortByName<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">toList</span><span style="color: #333333;">());</span>
javaFiles<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki uygulamayı çalıştırdığımızda aşağıda verildiği gibi bir ekran çıktısı elde ediyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">mastermind-game/src/main/java/com/example/service/AuthenticationService.java</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/validation/Email.java</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/web/model/Game.java</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/web/controller/GameController.java</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/web/model/GameStatus.java</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/validation/Iban.java</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/validation/IbanValidator.java</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/web/controller/LogonController.java</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/web/viewmodel/LogonViewModel.java</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/web/model/Move.java</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/web/model/Player.java</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/service/impl/SimpleAuthenticationService.java</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/validation/StrongPassword.java</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/validation/TcKimlikNo.java</span>
<span style="color: #888888;">mastermind-game/src/main/java/com/example/validation/TcKimlikNoValidator.java</span>
</pre>
</div>
<br />
<b>6. Bir Dizini Özyinelemeli (=Recursive) Olarak Zip Formatında Sıkıştırmak</b><br />
<b><br />
</b> <br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><b>c:/tmp/figures</b> dizini altındaki, ne kadar derinlikte olursa olsun tüm dosya ve dizinleri <b>Zip </b>dosyasında <i><b>arşivlemek</b></i> ve <i><b>sıkıştırılmış olarak saklamak</b></i> istiyoruz:</span></div>
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">zip</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.File</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileNotFoundException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.IOException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.FileVisitResult</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.FileVisitor</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Files</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Path</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Paths</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.attribute.BasicFileAttributes</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipEntry</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">CreateZipFileRecursivelyFromDirectory</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> FileNotFoundException<span style="color: #333333;">,</span> IOException <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">final</span> Path directory <span style="color: #333333;">=</span> Paths<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp/figures"</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> File zipFile <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"figures.zip"</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">try</span><span style="color: #333333;">(</span>
<span style="color: #008800; font-weight: bold;">final</span> FileOutputStream fos <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> FileOutputStream<span style="color: #333333;">(</span>zipFile<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> ZipOutputStream zos<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ZipOutputStream<span style="color: #333333;">(</span>fos<span style="color: #333333;">);</span>
<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
Files<span style="color: #333333;">.</span><span style="color: #0000cc;">walkFileTree</span><span style="color: #333333;">(</span>directory<span style="color: #333333;">,</span> <span style="color: #008800; font-weight: bold;">new</span> ZipperVisitor<span style="color: #333333;">(</span>zos<span style="color: #333333;">));</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">catch</span> <span style="color: #333333;">(</span>IOException e<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Exception: "</span> <span style="color: #333333;">+</span> e<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ZipperVisitor</span> <span style="color: #008800; font-weight: bold;">implements</span> FileVisitor<span style="color: #333333;"><</span>Path<span style="color: #333333;">>{</span>
<span style="color: #008800; font-weight: bold;">final</span> ZipOutputStream zos<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">ZipperVisitor</span><span style="color: #333333;">(</span>ZipOutputStream zos<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">zos</span> <span style="color: #333333;">=</span> zos<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> FileVisitResult <span style="color: #0066bb; font-weight: bold;">preVisitDirectory</span><span style="color: #333333;">(</span>Path dir<span style="color: #333333;">,</span> BasicFileAttributes attrs<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> IOException <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> FileVisitResult<span style="color: #333333;">.</span><span style="color: #0000cc;">CONTINUE</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> FileVisitResult <span style="color: #0066bb; font-weight: bold;">visitFile</span><span style="color: #333333;">(</span>Path file<span style="color: #333333;">,</span> BasicFileAttributes attrs<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> IOException <span style="color: #333333;">{</span>
ZipEntry zipEntry<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ZipEntry<span style="color: #333333;">(</span>file<span style="color: #333333;">.</span><span style="color: #0000cc;">toFile</span><span style="color: #333333;">().</span><span style="color: #0000cc;">getPath</span><span style="color: #333333;">());</span>
zos<span style="color: #333333;">.</span><span style="color: #0000cc;">putNextEntry</span><span style="color: #333333;">(</span>zipEntry<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>file<span style="color: #333333;">.</span><span style="color: #0000cc;">toFile</span><span style="color: #333333;">().</span><span style="color: #0000cc;">isFile</span><span style="color: #333333;">()){</span>
Files<span style="color: #333333;">.</span><span style="color: #0000cc;">copy</span><span style="color: #333333;">(</span>file<span style="color: #333333;">,</span> zos<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">return</span> FileVisitResult<span style="color: #333333;">.</span><span style="color: #0000cc;">CONTINUE</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> FileVisitResult <span style="color: #0066bb; font-weight: bold;">visitFileFailed</span><span style="color: #333333;">(</span>Path file<span style="color: #333333;">,</span> IOException exc<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> IOException <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> FileVisitResult<span style="color: #333333;">.</span><span style="color: #0000cc;">CONTINUE</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> FileVisitResult <span style="color: #0066bb; font-weight: bold;">postVisitDirectory</span><span style="color: #333333;">(</span>Path dir<span style="color: #333333;">,</span> IOException exc<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> IOException <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> FileVisitResult<span style="color: #333333;">.</span><span style="color: #0000cc;">CONTINUE</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<b>7. Zip Dosyasını Bir Dizine Açmak</b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">zip</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.File</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.IOException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Files</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Paths</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.StandardCopyOption</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.function.Consumer</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.logging.Level</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.logging.Logger</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipEntry</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipFile</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ExtractZipFile</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> IOException <span style="color: #333333;">{</span>
ZipFile zipFile<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ZipFile<span style="color: #333333;">(</span>Paths<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"figures.zip"</span><span style="color: #333333;">).</span><span style="color: #0000cc;">toFile</span><span style="color: #333333;">());</span>
Consumer<span style="color: #333333;"><</span>ZipEntry<span style="color: #333333;">></span> extractFile<span style="color: #333333;">=</span> zipEntry <span style="color: #333333;">-></span> <span style="color: #333333;">{</span>
File file<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span>zipEntry<span style="color: #333333;">.</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">());</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>zipEntry<span style="color: #333333;">.</span><span style="color: #0000cc;">isDirectory</span><span style="color: #333333;">()){</span>
file<span style="color: #333333;">.</span><span style="color: #0000cc;">mkdirs</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">else</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">try</span> <span style="color: #333333;">{</span>
Files<span style="color: #333333;">.</span><span style="color: #0000cc;">copy</span><span style="color: #333333;">(</span>zipFile<span style="color: #333333;">.</span><span style="color: #0000cc;">getInputStream</span><span style="color: #333333;">(</span>zipEntry<span style="color: #333333;">),</span> file<span style="color: #333333;">.</span><span style="color: #0000cc;">toPath</span><span style="color: #333333;">(),</span> StandardCopyOption<span style="color: #333333;">.</span><span style="color: #0000cc;">REPLACE_EXISTING</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">catch</span> <span style="color: #333333;">(</span>IOException ex<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
Logger<span style="color: #333333;">.</span><span style="color: #0000cc;">getLogger</span><span style="color: #333333;">(</span>ExtractZipFile<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">.</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">()).</span><span style="color: #0000cc;">log</span><span style="color: #333333;">(</span>Level<span style="color: #333333;">.</span><span style="color: #0000cc;">SEVERE</span><span style="color: #333333;">,</span> <span style="color: #008800; font-weight: bold;">null</span><span style="color: #333333;">,</span> ex<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">};</span>
zipFile<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>extractFile<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<b>8. Zip dosyası Üzerinde Değişiklik Yapmak</b><br />
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Mevcut bir <b>Zip </b>dosyası üzerinde <i><b>dosya silmek</b></i>, <i><b>dosya eklemek</b></i> ve <b><i>dosya içeriğini güncellemek</i></b> gibi değişiklikler yapmak istiyoruz:</span></div>
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">zip</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.File</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.IOException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Files</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Paths</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.StandardCopyOption</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.function.Consumer</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.function.Predicate</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.logging.Level</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.logging.Logger</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipEntry</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipFile</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.zip.ZipOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ModifyZipFile</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> IOException <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">final</span> File originalFile <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"figures.zip"</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> File tempFile <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"figures-temp.zip"</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> filesToAdd <span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:\\tmp\\figures\\jquery-fig1.png"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"c:\\tmp\\figures\\jquery-fig2.png"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"c:\\tmp\\figures\\jquery-fig3.png"</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> filesToDelete <span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:\\tmp\\figures\\jboss-scanner1.png"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"c:\\tmp\\figures\\jboss-scanner2.png"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"c:\\tmp\\figures\\jboss-scanner3.png"</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> filesToUpdate <span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:\\tmp\\figures\\mongo-1.png"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"c:\\tmp\\figures\\mongo-2.png"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"c:\\tmp\\figures/mongo-3.png"</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> ZipFile originalZipFile <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ZipFile<span style="color: #333333;">(</span>originalFile<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> FileOutputStream tempFileOutputStream <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> FileOutputStream<span style="color: #333333;">(</span>tempFile<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> ZipOutputStream zos <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ZipOutputStream<span style="color: #333333;">(</span>tempFileOutputStream<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> Predicate<span style="color: #333333;"><</span>ZipEntry<span style="color: #333333;">></span> deleted <span style="color: #333333;">=</span> zipEntry <span style="color: #333333;">-></span> filesToDelete<span style="color: #333333;">.</span><span style="color: #0000cc;">contains</span><span style="color: #333333;">(</span>zipEntry<span style="color: #333333;">.</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">());</span>
<span style="color: #008800; font-weight: bold;">final</span> Predicate<span style="color: #333333;"><</span>ZipEntry<span style="color: #333333;">></span> notDeleted <span style="color: #333333;">=</span> deleted<span style="color: #333333;">.</span><span style="color: #0000cc;">negate</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">final</span> Predicate<span style="color: #333333;"><</span>ZipEntry<span style="color: #333333;">></span> updated <span style="color: #333333;">=</span> zipEntry <span style="color: #333333;">-></span> filesToUpdate<span style="color: #333333;">.</span><span style="color: #0000cc;">contains</span><span style="color: #333333;">(</span>zipEntry<span style="color: #333333;">.</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">());</span>
<span style="color: #008800; font-weight: bold;">final</span> Predicate<span style="color: #333333;"><</span>ZipEntry<span style="color: #333333;">></span> notUpdated <span style="color: #333333;">=</span> updated<span style="color: #333333;">.</span><span style="color: #0000cc;">negate</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">final</span> Consumer<span style="color: #333333;"><</span>ZipEntry<span style="color: #333333;">></span> copyToTempZipFile <span style="color: #333333;">=</span> zipEntry <span style="color: #333333;">-></span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">try</span> <span style="color: #333333;">{</span>
ZipEntry newZipEntry <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ZipEntry<span style="color: #333333;">(</span>zipEntry<span style="color: #333333;">);</span>
zos<span style="color: #333333;">.</span><span style="color: #0000cc;">putNextEntry</span><span style="color: #333333;">(</span>zipEntry<span style="color: #333333;">);</span>
originalZipFile<span style="color: #333333;">.</span><span style="color: #0000cc;">getInputStream</span><span style="color: #333333;">(</span>zipEntry<span style="color: #333333;">).</span><span style="color: #0000cc;">transferTo</span><span style="color: #333333;">(</span>zos<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">catch</span> <span style="color: #333333;">(</span>IOException ex<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
Logger<span style="color: #333333;">.</span><span style="color: #0000cc;">getLogger</span><span style="color: #333333;">(</span>CreateZipFileFromDirectory<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">.</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">()).</span><span style="color: #0000cc;">log</span><span style="color: #333333;">(</span>Level<span style="color: #333333;">.</span><span style="color: #0000cc;">SEVERE</span><span style="color: #333333;">,</span> <span style="color: #008800; font-weight: bold;">null</span><span style="color: #333333;">,</span> ex<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">};</span>
originalZipFile<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span>notDeleted<span style="color: #333333;">.</span><span style="color: #0000cc;">and</span><span style="color: #333333;">(</span>notUpdated<span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>copyToTempZipFile<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> Consumer<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> addToZipFile <span style="color: #333333;">=</span> file <span style="color: #333333;">-></span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">try</span> <span style="color: #333333;">{</span>
ZipEntry zipEntry<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ZipEntry<span style="color: #333333;">(</span>file<span style="color: #333333;">);</span>
zos<span style="color: #333333;">.</span><span style="color: #0000cc;">putNextEntry</span><span style="color: #333333;">(</span>zipEntry<span style="color: #333333;">);</span>
Files<span style="color: #333333;">.</span><span style="color: #0000cc;">copy</span><span style="color: #333333;">(</span>Paths<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span>file<span style="color: #333333;">),</span> zos<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">catch</span> <span style="color: #333333;">(</span>IOException ex<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
Logger<span style="color: #333333;">.</span><span style="color: #0000cc;">getLogger</span><span style="color: #333333;">(</span>CreateZipFileFromDirectory<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">.</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">()).</span><span style="color: #0000cc;">log</span><span style="color: #333333;">(</span>Level<span style="color: #333333;">.</span><span style="color: #0000cc;">SEVERE</span><span style="color: #333333;">,</span> <span style="color: #008800; font-weight: bold;">null</span><span style="color: #333333;">,</span> ex<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">};</span>
filesToAdd<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span> addToZipFile <span style="color: #333333;">);</span>
filesToUpdate<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span> addToZipFile <span style="color: #333333;">);</span>
originalZipFile<span style="color: #333333;">.</span><span style="color: #0000cc;">close</span><span style="color: #333333;">();</span>
zos<span style="color: #333333;">.</span><span style="color: #0000cc;">close</span><span style="color: #333333;">();</span>
Files<span style="color: #333333;">.</span><span style="color: #0000cc;">move</span><span style="color: #333333;">(</span>tempFile<span style="color: #333333;">.</span><span style="color: #0000cc;">toPath</span><span style="color: #333333;">(),</span> originalFile<span style="color: #333333;">.</span><span style="color: #0000cc;">toPath</span><span style="color: #333333;">(),</span> StandardCopyOption<span style="color: #333333;">.</span><span style="color: #0000cc;">REPLACE_EXISTING</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>9. LZMA2 Algoritması ile Dosya Sıkıştırmak ve Açmak</b></span><br />
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><b>LZMA2</b> algoritması ile daha fazla kayıpsız sıkıştırma elde etmek mümkündür. En yüksek sıkıştırma oranı sağlayan seçeneklerle çalıştırıldığında, sıkıştırma süresi uzun ve bellek kullanımı yüksek olsa da büyük dosyaları sıkıştırmak istiyorsanız <b>LZMA2</b>'yı tercih etmelisiniz. <b>LZMA2</b> ile birlikte sıkıştırma dosyasının uzantısı <b>xz</b> olacaktır. <b>Java </b>uygulamasından bu formatta dosya sıkıştırmak için <b>tukaani </b>kütüphanesini kullanabilirsiniz. Bu amaçla geliştireceğiniz <b>maven </b>projesinde <b>pom.xml</b> dosyasına aşağıdaki bağımlılığı eklemeniz gerekir:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #007700;"><dependency></span>
<span style="color: #007700;"><groupId></span>org.tukaani<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>xz<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"><version></span>1.6<span style="color: #007700;"></version></span>
<span style="color: #007700;"></dependency></span>
</pre>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Java</b>'da <b>Heap yığın</b> (=<b>Heap dump</b>) dosyaları diskte bolca yer kaplar. Bu dosyaları diskten yer kazanabilmek amacıyla <i><b>xz formatında</b></i> saklayabiliriz:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.File</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileNotFoundException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.IOException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Files</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Path</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Paths</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.tukaani.xz.LZMA2Options</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.tukaani.xz.XZOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Example1</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> FileNotFoundException<span style="color: #333333;">,</span> IOException <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">final</span> Path heapDumpFile <span style="color: #333333;">=</span> Paths<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp/dump.hprof"</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> File xzHeapDumpFile <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"dump.hprof.xz"</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> FileOutputStream xzOutput <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> FileOutputStream<span style="color: #333333;">(</span>xzHeapDumpFile<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> LZMA2Options lzmA2Options <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> LZMA2Options<span style="color: #333333;">(</span>LZMA2Options<span style="color: #333333;">.</span><span style="color: #0000cc;">PRESET_DEFAULT</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">try</span> <span style="color: #333333;">(</span>XZOutputStream xzos <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> XZOutputStream<span style="color: #333333;">(</span>xzOutput<span style="color: #333333;">,</span> lzmA2Options<span style="color: #333333;">))</span> <span style="color: #333333;">{</span>
Files<span style="color: #333333;">.</span><span style="color: #0000cc;">copy</span><span style="color: #333333;">(</span>heapDumpFile<span style="color: #333333;">,</span> xzos<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">long</span> originalFileSize <span style="color: #333333;">=</span> heapDumpFile<span style="color: #333333;">.</span><span style="color: #0000cc;">toFile</span><span style="color: #333333;">().</span><span style="color: #0000cc;">length</span><span style="color: #333333;">();</span>
<span style="color: #333399; font-weight: bold;">long</span> xzFileSize <span style="color: #333333;">=</span> xzHeapDumpFile<span style="color: #333333;">.</span><span style="color: #0000cc;">length</span><span style="color: #333333;">();</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">err</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Heap dump file size: "</span> <span style="color: #333333;">+</span> <span style="color: #333333;">(</span>originalFileSize <span style="color: #333333;">/</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1024</span> <span style="color: #333333;">*</span> <span style="color: #0000dd; font-weight: bold;">1024</span><span style="color: #333333;">))</span> <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"MB."</span><span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">err</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"xz file size: "</span> <span style="color: #333333;">+</span> <span style="color: #333333;">(</span>xzFileSize <span style="color: #333333;">/</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1024</span> <span style="color: #333333;">*</span> <span style="color: #0000dd; font-weight: bold;">1024</span><span style="color: #333333;">))</span> <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"MB."</span><span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">err</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Compression ratio: "</span> <span style="color: #333333;">+</span> <span style="color: #333333;">((</span>xzFileSize <span style="color: #333333;">*</span> <span style="color: #0000dd; font-weight: bold;">100</span><span style="color: #333333;">)</span> <span style="color: #333333;">/</span> originalFileSize<span style="color: #333333;">)</span> <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"%."</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Uygulamayı çalıştırdığımızda ekran çıktısı aşağıda verildiği gibidir:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">Heap dump file size: 256MB.</span>
<span style="color: #888888;">xz file size: 33MB.</span>
<span style="color: #888888;">Compression ratio: 12%</span>
</pre>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Java </b>uygulamasından <b><i>xz formatındaki</i></b> sıkıştırılmış dosyadan <i><b>geri açmak</b></i> için aşağıdaki örnekten yararlanabilirsiniz:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.File</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileInputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileNotFoundException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.IOException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Files</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Path</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Paths</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.tukaani.xz.XZInputStream</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066;"><b>Example2 </b></span><span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> FileNotFoundException<span style="color: #333333;">,</span> IOException <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">final</span> Path heapDumpFile <span style="color: #333333;">=</span> Paths<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp/dump.hprof"</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> File xzHeapDumpFile <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"dump.hprof.xz"</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> FileInputStream xzInput <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> FileInputStream<span style="color: #333333;">(</span>xzHeapDumpFile<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">try</span> <span style="color: #333333;">(</span>XZInputStream xzis <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> XZInputStream<span style="color: #333333;">(</span>xzInput<span style="color: #333333;">))</span> <span style="color: #333333;">{</span>
Files<span style="color: #333333;">.</span><span style="color: #0000cc;">copy</span><span style="color: #333333;">(</span>xzis<span style="color: #333333;">,</span>heapDumpFile<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <b><span style="font-family: "georgia" , "times new roman" , serif;">10. Apache Commons Compress ile Dizini Arşivlemek ve LZMA2 Algoritması ile Sıkıştırmak</span></b><br />
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><b>LZMA2</b> sıkıştırma algoritması bir dizini arşivlemek için kullanılamaz. Arşivlemek için <b>TAR </b>formatından yararlanabiliriz. <b>TAR</b> birden fazla dizin ve dosyayı tek bir dosyada birleştirerek bir dizini arşivlememizi sağlar. <b>TAR</b> bir sıkıştırma formatı ya da algoritması değildir. Aşağıda verilen kodda önce <b><i>Apache Commons Compress </i></b>kütüphanesini kullanarak bir dizini ve dizin içindeki dosyaları, <b>TAR</b> formatında arşivleyeceğiz. <b>TAR</b> formatında arşivlediğimiz dosyayı <b>xz </b>formatında sıkıştırıracağız ve böylelikle diskte daha az yer kaplayacak. <b>Maven</b> projesi olarak geliştirdiğimiz projenin <b>pom.xml</b> dosyasına aşağıdaki bağımlılıkları eklememiz gerekir:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #007700;"><dependency></span>
<span style="color: #007700;"><groupId></span>org.tukaani<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>xz<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"><version></span>1.6<span style="color: #007700;"></version></span>
<span style="color: #007700;"></dependency></span>
<span style="color: #007700;"><dependency></span>
<span style="color: #007700;"><groupId></span>org.apache.commons<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>commons-compress<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"><version></span>1.14<span style="color: #007700;"></version></span>
<span style="color: #007700;"></dependency></span>
</pre>
</div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.File</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileNotFoundException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.IOException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Files</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Path</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Paths</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.apache.commons.compress.archivers.tar.TarArchiveEntry</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.apache.commons.compress.archivers.tar.TarArchiveOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.tukaani.xz.LZMA2Options</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.tukaani.xz.XZOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Example3</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> FileNotFoundException<span style="color: #333333;">,</span> IOException <span style="color: #333333;">{</span>
File tarXZFile <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"figures.tar.xz"</span><span style="color: #333333;">);</span>
FileOutputStream fos <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> FileOutputStream<span style="color: #333333;">(</span>tarXZFile<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">try</span><span style="color: #333333;">(</span>TarArchiveOutputStream taos <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> TarArchiveOutputStream<span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> XZOutputStream<span style="color: #333333;">(</span>fos<span style="color: #333333;">,</span> <span style="color: #008800; font-weight: bold;">new</span> LZMA2Options<span style="color: #333333;">(</span>LZMA2Options<span style="color: #333333;">.</span><span style="color: #0000cc;">PRESET_MIN</span><span style="color: #333333;">)))){</span>
taos<span style="color: #333333;">.</span><span style="color: #0000cc;">setBigNumberMode</span><span style="color: #333333;">(</span>TarArchiveOutputStream<span style="color: #333333;">.</span><span style="color: #0000cc;">BIGNUMBER_STAR</span><span style="color: #333333;">);</span>
taos<span style="color: #333333;">.</span><span style="color: #0000cc;">setLongFileMode</span><span style="color: #333333;">(</span>TarArchiveOutputStream<span style="color: #333333;">.</span><span style="color: #0000cc;">LONGFILE_GNU</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> Path directory <span style="color: #333333;">=</span> Paths<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp/figures"</span><span style="color: #333333;">);</span>
addFilesToTar<span style="color: #333333;">(</span>taos<span style="color: #333333;">,</span> directory<span style="color: #333333;">.</span><span style="color: #0000cc;">toFile</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">addFilesToTar</span><span style="color: #333333;">(</span>TarArchiveOutputStream taos<span style="color: #333333;">,</span> File file<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> IOException <span style="color: #333333;">{</span>
taos<span style="color: #333333;">.</span><span style="color: #0000cc;">putArchiveEntry</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> TarArchiveEntry<span style="color: #333333;">(</span>file<span style="color: #333333;">));</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>file<span style="color: #333333;">.</span><span style="color: #0000cc;">isFile</span><span style="color: #333333;">())</span> <span style="color: #333333;">{</span>
Files<span style="color: #333333;">.</span><span style="color: #0000cc;">copy</span><span style="color: #333333;">(</span>file<span style="color: #333333;">.</span><span style="color: #0000cc;">toPath</span><span style="color: #333333;">(),</span> taos<span style="color: #333333;">);</span>
taos<span style="color: #333333;">.</span><span style="color: #0000cc;">closeArchiveEntry</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">else</span> <span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>file<span style="color: #333333;">.</span><span style="color: #0000cc;">isDirectory</span><span style="color: #333333;">())</span> <span style="color: #333333;">{</span>
taos<span style="color: #333333;">.</span><span style="color: #0000cc;">closeArchiveEntry</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span>File child <span style="color: #333333;">:</span> file<span style="color: #333333;">.</span><span style="color: #0000cc;">listFiles</span><span style="color: #333333;">())</span> <span style="color: #333333;">{</span>
addFilesToTar<span style="color: #333333;">(</span>taos<span style="color: #333333;">,</span> child<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><b>LZMA2</b> ile sıkıştırma işlemini <b>Apache Commons Compress</b> kütüphanesi içinden çıkan <b>XZCompressorOutputStream</b> sınıfı ile de gerçekleştirebiliriz:</span></div>
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.File</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileNotFoundException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.IOException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Files</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Path</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Paths</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.apache.commons.compress.archivers.tar.TarArchiveEntry</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.apache.commons.compress.archivers.tar.TarArchiveOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.apache.commons.compress.compressors.xz.XZCompressorOutputStream</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Example4</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> FileNotFoundException<span style="color: #333333;">,</span> IOException <span style="color: #333333;">{</span>
File tarXZFile <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"figures.tar.xz"</span><span style="color: #333333;">);</span>
FileOutputStream fos <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> FileOutputStream<span style="color: #333333;">(</span>tarXZFile<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">try</span><span style="color: #333333;">(</span>TarArchiveOutputStream taos <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> TarArchiveOutputStream<span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> XZCompressorOutputStream<span style="color: #333333;">(</span>fos<span style="color: #333333;">))){</span>
taos<span style="color: #333333;">.</span><span style="color: #0000cc;">setBigNumberMode</span><span style="color: #333333;">(</span>TarArchiveOutputStream<span style="color: #333333;">.</span><span style="color: #0000cc;">BIGNUMBER_STAR</span><span style="color: #333333;">);</span>
taos<span style="color: #333333;">.</span><span style="color: #0000cc;">setLongFileMode</span><span style="color: #333333;">(</span>TarArchiveOutputStream<span style="color: #333333;">.</span><span style="color: #0000cc;">LONGFILE_GNU</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> Path directory <span style="color: #333333;">=</span> Paths<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp/figures"</span><span style="color: #333333;">);</span>
addFilesToTar<span style="color: #333333;">(</span>taos<span style="color: #333333;">,</span> directory<span style="color: #333333;">.</span><span style="color: #0000cc;">toFile</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">addFilesToTar</span><span style="color: #333333;">(</span>TarArchiveOutputStream taos<span style="color: #333333;">,</span> File file<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> IOException <span style="color: #333333;">{</span>
taos<span style="color: #333333;">.</span><span style="color: #0000cc;">putArchiveEntry</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> TarArchiveEntry<span style="color: #333333;">(</span>file<span style="color: #333333;">));</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>file<span style="color: #333333;">.</span><span style="color: #0000cc;">isFile</span><span style="color: #333333;">())</span> <span style="color: #333333;">{</span>
Files<span style="color: #333333;">.</span><span style="color: #0000cc;">copy</span><span style="color: #333333;">(</span>file<span style="color: #333333;">.</span><span style="color: #0000cc;">toPath</span><span style="color: #333333;">(),</span> taos<span style="color: #333333;">);</span>
taos<span style="color: #333333;">.</span><span style="color: #0000cc;">closeArchiveEntry</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">else</span> <span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>file<span style="color: #333333;">.</span><span style="color: #0000cc;">isDirectory</span><span style="color: #333333;">())</span> <span style="color: #333333;">{</span>
taos<span style="color: #333333;">.</span><span style="color: #0000cc;">closeArchiveEntry</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span>File child <span style="color: #333333;">:</span> file<span style="color: #333333;">.</span><span style="color: #0000cc;">listFiles</span><span style="color: #333333;">())</span> <span style="color: #333333;">{</span>
addFilesToTar<span style="color: #333333;">(</span>taos<span style="color: #333333;">,</span> child<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><b>TAR</b> olarak arşivlenmiş ve <b>LZMA2</b> ile sıkıştırılmış dosyayı (<b><i>figures.tar.xz</i></b>), <i><b>arşiv dosyasından tekrar geri açmak</b></i> için aşağıdaki koddan yararlanabilirsiniz:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.BufferedInputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.File</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileInputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileNotFoundException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.IOException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.Files</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.nio.file.StandardCopyOption</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.Objects</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.apache.commons.compress.archivers.tar.TarArchiveEntry</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.apache.commons.compress.archivers.tar.TarArchiveInputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.apache.commons.compress.compressors.xz.XZCompressorInputStream</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Example5</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> FileNotFoundException<span style="color: #333333;">,</span> IOException <span style="color: #333333;">{</span>
File tarXZFile <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"c:/tmp"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"figures.tar.xz"</span><span style="color: #333333;">);</span>
String targetDirectory<span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"c:/"</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">try</span> <span style="color: #333333;">(</span>
<span style="color: #008800; font-weight: bold;">final</span> FileInputStream fis <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> FileInputStream<span style="color: #333333;">(</span>tarXZFile<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> BufferedInputStream bis<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> BufferedInputStream<span style="color: #333333;">(</span>fis<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> XZCompressorInputStream xzCompressorInputStream <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> XZCompressorInputStream<span style="color: #333333;">(</span>bis<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> TarArchiveInputStream tais <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> TarArchiveInputStream<span style="color: #333333;">(</span>xzCompressorInputStream<span style="color: #333333;">);</span>
<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
TarArchiveEntry tarEntry <span style="color: #333333;">=</span> tais<span style="color: #333333;">.</span><span style="color: #0000cc;">getNextTarEntry</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">while</span><span style="color: #333333;">(</span>Objects<span style="color: #333333;">.</span><span style="color: #0000cc;">nonNull</span><span style="color: #333333;">(</span>tarEntry<span style="color: #333333;">))</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">final</span> File target<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span>targetDirectory<span style="color: #333333;">,</span>tarEntry<span style="color: #333333;">.</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">());</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>tarEntry<span style="color: #333333;">.</span><span style="color: #0000cc;">isDirectory</span><span style="color: #333333;">())</span> <span style="color: #333333;">{</span>
target<span style="color: #333333;">.</span><span style="color: #0000cc;">mkdirs</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span><span style="color: #008800; font-weight: bold;">else</span> <span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>tarEntry<span style="color: #333333;">.</span><span style="color: #0000cc;">isFile</span><span style="color: #333333;">()){</span>
Files<span style="color: #333333;">.</span><span style="color: #0000cc;">copy</span><span style="color: #333333;">(</span>tais<span style="color: #333333;">,</span> target<span style="color: #333333;">.</span><span style="color: #0000cc;">toPath</span><span style="color: #333333;">(),</span>StandardCopyOption<span style="color: #333333;">.</span><span style="color: #0000cc;">REPLACE_EXISTING</span> <span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
tarEntry <span style="color: #333333;">=</span> tais<span style="color: #333333;">.</span><span style="color: #0000cc;">getNextTarEntry</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-1486783623833818772017-07-27T19:34:00.001+03:002017-08-02T23:05:04.732+03:00Java'da Nesnelerin Belleğe Yerleşimi<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_w5DXmOxwHTQtnFMB-V1QF6zS-LaRyybjMkfg0qoOhJ83GkQzF0VO4J1yXDtpzaGx_zbTNjGfOz0sQrFLSo6_B1jkTWb_BhT2HhkgXrzyceoUB9A5xDFnhvoEjoO8r6KLiwyOaFPyRYCh/s1600/jol.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="293" data-original-width="1214" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_w5DXmOxwHTQtnFMB-V1QF6zS-LaRyybjMkfg0qoOhJ83GkQzF0VO4J1yXDtpzaGx_zbTNjGfOz0sQrFLSo6_B1jkTWb_BhT2HhkgXrzyceoUB9A5xDFnhvoEjoO8r6KLiwyOaFPyRYCh/s400/jol.jpg" width="400" /></a></div>
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br />
</b></span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>Java </b>nesneleri her zaman <b>Heap</b>'de yaratılır. Nesne yaratmak için <b>new</b> operatöründen yararlanıyoruz. Ancak nesneye artık ihtiyacımız kalmadığında, <b>C++</b>'da olduğu gibi <b>delete </b>operatörü ile geri vermemiz gerekmez. Nesnenin referans değişkenleri ile bağlantısını koparmamız yeterli olur. <b>Heap</b>'i çöp toplayıcı yönetir ve çalıştığında tüm ayakta kalan, canlı, hala erişilebilen nesneleri yeniden bellekte yeniden düzenler. Bilinenin aksine çöp toplayıcı ölü nesneler için herhangi bir işlem yürütmez. Çöp toplayıcı her ne yapıyor ise canlı nesneler için yapar. Dolayısı ile bellekte az yer kaplayan ve kısa ömürlü nesneler yaratmanın </span><span style="font-family: "georgia" , "times new roman" , serif;"><b>Java</b>'da</span><span style="font-family: "georgia" , "times new roman" , serif;"> </span><span style="font-family: "georgia" , "times new roman" , serif;">bir maliyeti yoktur. Benzer şekilde <b>C++</b> ile karşılaştırıldığında, <b>Java</b>'da <b>new</b> ile bellek alanı ayırmak da daha hızlıdır. </span><br />
<br />
<b style="font-family: Georgia, "Times New Roman", serif;">Heap </b><span style="font-family: "georgia" , "times new roman" , serif;">tek düze ve yekpare bir alan değildir. Farklı kuşaktan nesnelerin yaşadığı özelleşmiş alanlardan oluşur. Örneğin, </span><b style="font-family: Georgia, "Times New Roman", serif;">new</b><span style="font-family: "georgia" , "times new roman" , serif;"> ile yarattığımız nesne önce </span><b style="font-family: Georgia, "Times New Roman", serif;">Eden</b><span style="font-family: "georgia" , "times new roman" , serif;"> olarak isimlendirilen alana yerleşir. </span><b style="font-family: Georgia, "Times New Roman", serif;">Eden</b><span style="font-family: "georgia" , "times new roman" , serif;"> dolduğunda küçük çöp toplayıcı (=</span><b style="font-family: Georgia, "Times New Roman", serif;">Minor GC</b><span style="font-family: "georgia" , "times new roman" , serif;">) çalışır.</span></div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtk6OkZWWhheiLf37ztO0ghtI6Na1UuyzqR6R4ns4AmFL9Pm5Jl593FYKFviTEsBI9znDHboakqNlXN9osKIWxkqEyaCJpGEztUNd3GDCjzKwenacb06kim3ka2ZC6IPs-LDl4DaNEwx5r/s1600/generational-heap.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtk6OkZWWhheiLf37ztO0ghtI6Na1UuyzqR6R4ns4AmFL9Pm5Jl593FYKFviTEsBI9znDHboakqNlXN9osKIWxkqEyaCJpGEztUNd3GDCjzKwenacb06kim3ka2ZC6IPs-LDl4DaNEwx5r/s1600/generational-heap.PNG" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b>Nesiller boyu Heap</b></span></td></tr>
</tbody></table>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Küçük çöp toplayıcı her çalıştığında, hayatta kalan nesneleri, <b>S0</b> yada <b>S1</b> kodlu yaşam alanlarından birine taşınır. Her küçük çöp toplama sonunda <b>Eden</b> alanı tertemiz, <b>S0</b> yada <b>S1</b>'den biri tertemiz, diğeri ise tüm canlı nesneleri barındırır. Bir nesne <b>Eden</b>'da doğar, sonrasında <b>S0</b> ve <b>S1</b> arasında pinpon topu gibi taşınıp durur. Bu taşımalarda nesnenin başından kaç küçük çöptoplayıcı geçtiği bir sayaçta saklanır. Belirli bir süre <b>S0</b> ve <b>S1</b> arasında taşınan nesne, bu sayaç belirli bir eşiği geçtiğinde, nesne emekli edilir ve <b>Tenure</b> alanına taşınır. <b>Tenure</b> alanı dolduğunda tam bir çöp toplama (=<b>Full GC</b>) gerçekleşir. </span></div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Java</b>'da nesnenin bir başlık kısmı bulunur. Bu başlık kısmında çeşitli bilgiler yer alır: sınıf bilgisinin olduğu <b>Class</b> sınıfı nesnesinin adresi, çeşitli bayraklar ve kilit adresi. Nesnenin bellekte kaç sekizli yer kapladığı özellikle çöp toplayıcının ne kadar sıklıkla çalıştığı ile ilgilidir. Nesnenin tartıda kaç sekizli çektiği, belleğe nasıl yerleştiğini öğrenebiliriz. Bu özellikle <b>dağıtık cep sunucusu</b> (=<b>Distributed Cache Server</b>) kullanıldığında, kümenin kaç sunucudan oluşacağı ve kapasite hesaplamasında önem kazanır. Nesnenin belleğe yerleşimi ve kaç sekizli yer kapladığını öğrenmek için <b><a href="http://openjdk.java.net/" target="_blank">OpenJDK</a></b> içindeki bir projeden yararlanıyoruz: <a href="http://openjdk.java.net/projects/code-tools/jol" target="_blank"><b>JOL</b></a> (<b>Java Object Layout</b>). </span><span style="font-family: "georgia" , "times new roman" , serif;"><b>JOL </b>kullanmak için bir <b>Maven </b>projesi yaratmanız ve <b>pom.xml</b> dosyasına aşağıdaki bağımlılığı eklemeniz gerekir:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #007700;"><dependency></span>
<span style="color: #007700;"><groupId></span>org.openjdk.jol<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>jol-core<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"><version></span>0.8<span style="color: #007700;"></version></span>
<span style="color: #007700;"></dependency></span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Şimdi <b>Java</b>'daki temel tiplerin tamamını kullanarak tanımladığımız bir sınıfın (<b>A</b> sınıfı) üyelelerinin bellekteki dizilimine bir bakalım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">jol</span><span style="color: #333333;">.</span><span style="color: #0000cc;">exercises</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.info.ClassLayout</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.vm.VM</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Exercise1</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>VM<span style="color: #333333;">.</span><span style="color: #0000cc;">current</span><span style="color: #333333;">().</span><span style="color: #0000cc;">details</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>ClassLayout<span style="color: #333333;">.</span><span style="color: #0000cc;">parseClass</span><span style="color: #333333;">(</span>A<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">).</span><span style="color: #0000cc;">toPrintable</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">A</span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">byte</span> b<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">short</span> s<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">int</span> i<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">long</span> l<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">char</span> c<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">boolean</span> x<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">float</span> f<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">double</span> d<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Uygulamayı önce <i>32 bitlik</i> bir <b>Java Sanal Makinasında</b> (<b>JSM</b>) çalıştıralım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">#</span> Running 32-bit HotSpot VM.
<span style="color: #c65d09; font-weight: bold;">#</span> Objects are 8 bytes aligned.
<span style="color: #c65d09; font-weight: bold;">#</span> Field sizes by <span style="color: #007020;">type</span>: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #c65d09; font-weight: bold;">#</span> Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #888888;">com.example.jol.exercises.A object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 8 (object header) N/A</span>
<span style="color: #888888;"> 8 8 long A.l N/A</span>
<span style="color: #888888;"> 16 8 double A.d N/A</span>
<span style="color: #888888;"> 24 4 int A.i N/A</span>
<span style="color: #888888;"> 28 4 float A.f N/A</span>
<span style="color: #888888;"> 32 2 short A.s N/A</span>
<span style="color: #888888;"> 34 2 char A.c N/A</span>
<span style="color: #888888;"> 36 1 byte A.b N/A</span>
<span style="color: #888888;"> 37 1 boolean A.x N/A</span>
<span style="color: #888888;"> 38 2 (loss due to the next object alignment)</span>
<span style="color: #888888;">Instance size: 40 bytes</span>
<span style="color: #888888;">Space losses: 0 bytes internal + 2 bytes external = 2 bytes total</span>
</pre>
</div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><i>32 bitlik</i> <b>JSM</b>'de <b>nesnenin başlığını</b> <b>64 bit</b> olarak ölçtük. <b>Java</b>'daki temel tiplerin bellekte kapladıkları alan <b>JSM</b> <i>32-bitlik</i> ya da <i>64-bitlik</i> olsun değişmez! <b>A</b> sınıfı nesnesi bellekte ham olarak <b>38 sekizlik</b> yer kaplıyor. Nesneler belleğe, kopyalama ve taşıma işlemlerinin yüksek başarımla gerçekleşmesi için <i><b>64-bitin katları</b></i> adreslere yerleşirilir. Nesnelerin belleğe kaç sekizlik olarak hizalanacağını kontrol eden bir <b>JSM </b>parametresi bulunuyor: <b>ObjectAlignmentInBytes</b>. Bunun değeri <i>64-bitlik işlemcilerde</i> <b>8</b>'dir, <i>32-bitlik işlemcilerde</i> ise <b>4</b>'dür. Nesnelerin belleğe hizalanması nedeni ile nesnenin sonunda kullanılmayan <i>2 sekizlik</i> bir alan boş kaldı. <b>JSM</b> ayrıca öznitelikleri belleğe bizim kodda tanımladığımız sıradan farklı sırada yerleştirdi. <b>JSM </b>nesneyi belleğe olabilecek <b>en tıkız</b> (=compact) şekilde yerleştirdi! Bu <b>JSM</b>'nin en iyilemelerinden biridir ve varsayılan olarak açık geliyor: <b>-XX:+CompactFields</b>. Özniteliklerin belleğe yerleşiminin nasıl yapılacağını da kontrol edebiliriz. Bunun için <b>JSM </b>içinde bir parametre bulunuyor: <b>FieldsAllocationStyle</b>. Varsayılan değeri <b>1</b>'dir ve bu değer için <b>JSM </b>önce </span><span style="font-family: "georgia" , "times new roman" , serif;">temel tiplerden tanımlı <span style="font-family: "georgia" , "times new roman" , serif;">öznitelikleri</span><span style="font-family: "georgia" , "times new roman" , serif;"> </span>belleğe yerleştirir, daha sonra ise </span><span style="font-family: "georgia" , "times new roman" , serif;">referans tipinden </span><span style="font-family: "georgia" , "times new roman" , serif;">öznitelikleri</span><span style="font-family: "georgia" , "times new roman" , serif;"> </span><span style="font-family: "georgia" , "times new roman" , serif;">belleğe yerleştirir. </span><b style="font-family: georgia, "times new roman", serif;">FieldsAllocationStyle=0</b><span style="font-family: "georgia" , "times new roman" , serif;"> ise önce referans tipinden </span><span style="font-family: "georgia" , "times new roman" , serif;">öznitelikleri</span><span style="font-family: "georgia" , "times new roman" , serif;"> belleğe yerleştirir, </span><span style="font-family: "georgia" , "times new roman" , serif;">daha sonra temel tiplerden tanımlı </span><span style="font-family: "georgia" , "times new roman" , serif;">öznitelikleri </span><span style="font-family: "georgia" , "times new roman" , serif;">belleğe yerleştirir. </span><b style="font-family: georgia, "times new roman", serif;">FieldsAllocationStyle=2</b><span style="font-family: "georgia" , "times new roman" , serif;"> ise öncelikli olarak hem temel sınıftan hem de sınıf içinde tanımlı olan referans tipinden </span><span style="font-family: "georgia" , "times new roman" , serif;">öznitelikleri</span><span style="font-family: "georgia" , "times new roman" , serif;"> </span><span style="font-family: "georgia" , "times new roman" , serif;">gruplayarak birlikte belleğe yerleştirir, daha sonra temel tiplerden tanımlı öznitelikleri belleğe yerleştirir.</span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Şimdi aynı uygulamayı <i>64-bitlik </i>bir <b>JSM</b>'de çalıştıralım:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">#</span> Running 64-bit HotSpot VM.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed oop with 0-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed klass with 3-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Objects are 8 bytes aligned.
<span style="color: #c65d09; font-weight: bold;">#</span> Field sizes by <span style="color: #007020;">type</span>: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #c65d09; font-weight: bold;">#</span> Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #888888;">com.example.jol.exercises.A object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 12 (object header) N/A</span>
<span style="color: #888888;"> 12 4 int A.i N/A</span>
<span style="color: #888888;"> 16 8 long A.l N/A</span>
<span style="color: #888888;"> 24 8 double A.d N/A</span>
<span style="color: #888888;"> 32 4 float A.f N/A</span>
<span style="color: #888888;"> 36 2 short A.s N/A</span>
<span style="color: #888888;"> 38 2 char A.c N/A</span>
<span style="color: #888888;"> 40 1 byte A.b N/A</span>
<span style="color: #888888;"> 41 1 boolean A.x N/A</span>
<span style="color: #888888;"> 42 6 (loss due to the next object alignment)</span>
<span style="color: #888888;">Instance size: 48 bytes</span>
<span style="color: #888888;">Space losses: 0 bytes internal + 6 bytes external = 6 bytes total</span>
</pre>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">İlk gözlemimiz <i>64-bitlik</i> <b>JSM</b>'de nesne başlığının <b>12 sekizliğe</b> yükseltilmiş olduğudur. <b>JSM</b> bir çok noktada en iyileme yapıyor. <b>64 bitlik</b> bir makinada referans değişkenlerinin boylarıda <b>64 bite</b> uzar. Ancak biz belleğin daha küçük bir kesimini kullandığımız için referans değişkenlerinin <b>64 bitlik</b> uzunluğa sahip olmasına gerek yoktur. <b>JSM</b>, Heap boyu </span><span style="font-family: "georgia" , "times new roman" , serif;">32GB</span><span style="font-family: "georgia" , "times new roman" , serif;"> ulaşana kadar <b>64-bitlik</b> işlemcide <b>32 bitlik</b> adresler kullanarak <b>Cep Bellek</b> başarımını <b>%15</b>'e varan oranlarda iyileştiriyor. Bu en iyileme tekniğine <b>Compressed Ordinary Object PointerS</b> (<b>OOPS</b>) adı veriliyor ve bu özellikle varsayılan olarak açık geliyor. Şimdi bu özelliği kapttığımızda nesne başlığının ne kadar değiştiğine bir bakalım (<b>-XX:-UseCompressedOops</b>):</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">#</span> Running 64-bit HotSpot VM.
<span style="color: #c65d09; font-weight: bold;">#</span> Objects are 8 bytes aligned.
<span style="color: #c65d09; font-weight: bold;">#</span> Field sizes by <span style="color: #007020;">type</span>: 8, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #c65d09; font-weight: bold;">#</span> Array element sizes: 8, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #888888;">com.example.jol.exercises.A object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 16 (object header) N/A</span>
<span style="color: #888888;"> 16 8 long A.l N/A</span>
<span style="color: #888888;"> 24 8 double A.d N/A</span>
<span style="color: #888888;"> 32 4 int A.i N/A</span>
<span style="color: #888888;"> 36 4 float A.f N/A</span>
<span style="color: #888888;"> 40 2 short A.s N/A</span>
<span style="color: #888888;"> 42 2 char A.c N/A</span>
<span style="color: #888888;"> 44 1 byte A.b N/A</span>
<span style="color: #888888;"> 45 1 boolean A.x N/A</span>
<span style="color: #888888;"> 46 2 (loss due to the next object alignment)</span>
<span style="color: #888888;">Instance size: 48 bytes</span>
<span style="color: #888888;">Space losses: 0 bytes internal + 2 bytes external = 2 bytes total</span>
</pre>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Nesne başlığı şimdi <b>16 sekizliğe</b> yükseldi. <b>4 sekizlik</b> bir artış var. <b>1 milyon</b> <b>A</b> sınıfı nesnesi için <b>4 MB</b>'lık bir kazanımımız var! Şimdilerde bellek ucuz ve kolay erişilebilir bir parça. Bu nedenle <b>4M</b>'lık bir kazancın sizi pek heyecanlandırmadığını tahmin ediyorum. Farklı bir durum daha dikkatimizden kaçmadı: üyelerin belleğe yerleşimi değişti. Şimdi <b>long </b>ve <b>double </b>tipleri öne yerleştirdi. <b><i>16 sekizli</i></b>, sekizin katı olduğu için önce en uzun tipleri yerleştirmeyle başladı. Bir önceki yerleşimde nesne başlığı <b><i>12 sekizli</i></b> olduğu için ilk olarak sekizin katı adrese tamamlayacak tipi seçti: <b>int </b>(4 sekizli).</span></div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Şimdi daha karmaşık bir sınıf üzerinden incelememizi sürdürelim:</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Person.java</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.Serializable</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Person</span> <span style="color: #008800; font-weight: bold;">implements</span> Serializable <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #333399; font-weight: bold;">long</span> id<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #333399; font-weight: bold;">int</span> identityNo<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String firstName<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String lastName<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #333399; font-weight: bold;">int</span> age<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Person</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">long</span> <span style="color: #0066bb; font-weight: bold;">getId</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> id<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setId</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> id<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">id</span> <span style="color: #333333;">=</span> id<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">getIdentityNo</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> identityNo<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setIdentityNo</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> identityNo<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">identityNo</span> <span style="color: #333333;">=</span> identityNo<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">getFirstName</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> firstName<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setFirstName</span><span style="color: #333333;">(</span>String firstName<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">firstName</span> <span style="color: #333333;">=</span> firstName<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">getLastName</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> lastName<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setLastName</span><span style="color: #333333;">(</span>String lastName<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">lastName</span> <span style="color: #333333;">=</span> lastName<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">getAge</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> age<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setAge</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> age<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">age</span> <span style="color: #333333;">=</span> age<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">toString</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="background-color: #fff0f0;">"Person{"</span> <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"id="</span> <span style="color: #333333;">+</span> id <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">", identityCardNo="</span> <span style="color: #333333;">+</span> identityNo <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">", firstName="</span> <span style="color: #333333;">+</span> firstName <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">", lastName="</span> <span style="color: #333333;">+</span> lastName <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">", age="</span> <span style="color: #333333;">+</span> age <span style="color: #333333;">+</span> <span style="color: #0044dd;">'}'</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Exercise2.java</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">jol</span><span style="color: #333333;">.</span><span style="color: #0000cc;">exercises</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.domain.Person</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.util.DataBuilder</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.lang.reflect.Field</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.info.ClassLayout</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.vm.VM</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Exercise2</span> <span style="color: #333333;">{</span></pre>
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> NoSuchFieldException<span style="color: #333333;">,</span> IllegalArgumentException<span style="color: #333333;">,</span> IllegalAccessException <span style="color: #333333;">{</span>
Field value<span style="color: #333333;">=</span> String<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">.</span><span style="color: #0000cc;">getDeclaredField</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"value"</span><span style="color: #333333;">);</span>
value<span style="color: #333333;">.</span><span style="color: #0000cc;">setAccessible</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">true</span><span style="color: #333333;">);</span>
Person person<span style="color: #333333;">=</span> DataBuilder<span style="color: #333333;">.</span><span style="color: #0000cc;">createRandomPerson</span><span style="color: #333333;">();</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>VM<span style="color: #333333;">.</span><span style="color: #0000cc;">current</span><span style="color: #333333;">().</span><span style="color: #0000cc;">details</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>ClassLayout<span style="color: #333333;">.</span><span style="color: #0000cc;">parseInstance</span><span style="color: #333333;">(</span>person<span style="color: #333333;">).</span><span style="color: #0000cc;">toPrintable</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>ClassLayout<span style="color: #333333;">.</span><span style="color: #0000cc;">parseInstance</span><span style="color: #333333;">(</span>person<span style="color: #333333;">.</span><span style="color: #0000cc;">getFirstName</span><span style="color: #333333;">()).</span><span style="color: #0000cc;">toPrintable</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>ClassLayout<span style="color: #333333;">.</span><span style="color: #0000cc;">parseInstance</span><span style="color: #333333;">(</span>person<span style="color: #333333;">.</span><span style="color: #0000cc;">getLastName</span><span style="color: #333333;">()).</span><span style="color: #0000cc;">toPrintable</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>ClassLayout<span style="color: #333333;">.</span><span style="color: #0000cc;">parseInstance</span><span style="color: #333333;">(</span>value<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span>person<span style="color: #333333;">.</span><span style="color: #0000cc;">getFirstName</span><span style="color: #333333;">())).</span><span style="color: #0000cc;">toPrintable</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>ClassLayout<span style="color: #333333;">.</span><span style="color: #0000cc;">parseInstance</span><span style="color: #333333;">(</span>value<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span>person<span style="color: #333333;">.</span><span style="color: #0000cc;">getLastName</span><span style="color: #333333;">())).</span><span style="color: #0000cc;">toPrintable</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki uygulama çalıştırıldığında rasgele üretilen bir <b>Person </b>sınıfı nesnesinin bellekteki yerleşimini ekrana dökecektir:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">#</span> Running 64-bit HotSpot VM.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed oop with 0-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed klass with 3-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Objects are 8 bytes aligned.
<span style="color: #c65d09; font-weight: bold;">#</span> Field sizes by <span style="color: #007020;">type</span>: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #c65d09; font-weight: bold;">#</span> Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #888888;">com.example.domain.Person object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)</span>
<span style="color: #888888;"> 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)</span>
<span style="color: #888888;"> 8 4 (object header) 81 c0 00 20 (10000001 11000000 00000000 00100000) (536920193)</span>
<span style="color: #888888;"> 12 4 int Person.identityNo 1515124042</span>
<span style="color: #888888;"> 16 8 long Person.id 1</span>
<span style="color: #888888;"> 24 4 int Person.age 54</span>
<span style="color: #888888;"> 28 4 java.lang.String Person.firstName (object)</span>
<span style="color: #888888;"> 32 4 java.lang.String Person.lastName (object)</span>
<span style="color: #888888;"> 36 4 (loss due to the next object alignment)</span>
<span style="color: #888888;">Instance size: 40 bytes</span>
<span style="color: #888888;">Space losses: 0 bytes internal + 4 bytes external = 4 bytes total</span>
<span style="color: #888888;">java.lang.String object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)</span>
<span style="color: #888888;"> 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)</span>
<span style="color: #888888;"> 8 4 (object header) da 02 00 20 (11011010 00000010 00000000 00100000) (536871642)</span>
<span style="color: #888888;"> 12 4 char[] String.value [S, E, V, I, N, C]</span>
<span style="color: #888888;"> 16 4 int String.hash 0</span>
<span style="color: #888888;"> 20 4 (loss due to the next object alignment)</span>
<span style="color: #888888;">Instance size: 24 bytes</span>
<span style="color: #888888;">Space losses: 0 bytes internal + 4 bytes external = 4 bytes total</span>
<span style="color: #888888;">java.lang.String object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)</span>
<span style="color: #888888;"> 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)</span>
<span style="color: #888888;"> 8 4 (object header) da 02 00 20 (11011010 00000010 00000000 00100000) (536871642)</span>
<span style="color: #888888;"> 12 4 char[] String.value [K, U, T, A, Y]</span>
<span style="color: #888888;"> 16 4 int String.hash 0</span>
<span style="color: #888888;"> 20 4 (loss due to the next object alignment)</span>
<span style="color: #888888;">Instance size: 24 bytes</span>
<span style="color: #888888;">Space losses: 0 bytes internal + 4 bytes external = 4 bytes total</span>
<span style="color: #888888;">[C object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)</span>
<span style="color: #888888;"> 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)</span>
<span style="color: #888888;"> 8 4 (object header) 41 00 00 20 (01000001 00000000 00000000 00100000) (536870977)</span>
<span style="color: #888888;"> 12 4 (object header) 06 00 00 00 (00000110 00000000 00000000 00000000) (6)</span>
<span style="color: #888888;"> 16 12 char [C.<elements> N/A</span>
<span style="color: #888888;"> 28 4 (loss due to the next object alignment)</span>
<span style="color: #888888;">Instance size: 32 bytes</span>
<span style="color: #888888;">Space losses: 0 bytes internal + 4 bytes external = 4 bytes total</span>
<span style="color: #888888;">[C object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)</span>
<span style="color: #888888;"> 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)</span>
<span style="color: #888888;"> 8 4 (object header) 41 00 00 20 (01000001 00000000 00000000 00100000) (536870977)</span>
<span style="color: #888888;"> 12 4 (object header) 05 00 00 00 (00000101 00000000 00000000 00000000) (5)</span>
<span style="color: #888888;"> 16 10 char [C.<elements> N/A</span>
<span style="color: #888888;"> 26 6 (loss due to the next object alignment)</span>
<span style="color: #888888;">Instance size: 32 bytes</span>
<span style="color: #888888;">Space losses: 0 bytes internal + 6 bytes external = 6 bytes total</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki çıktıdan, <b>Person </b>sınıfı nesnenin tüm üyeleri ile birlikte bellekte <b>40 </b>+ <b>24 </b>+ <b>24</b> + <b>32 </b>+ <b>32 </b>= <b>152 sekizli </b>yer kapladığını anlıyoruz. </span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Dizilerin belleğe yerleşimini incelemekte fayda var:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">jol</span><span style="color: #333333;">.</span><span style="color: #0000cc;">exercises</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.info.ClassLayout</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.vm.VM</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Exercise3</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">[]</span> empty <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> <span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">[</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">];</span>
<span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">[]</span> one <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> <span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">[]{</span><span style="color: #0000dd; font-weight: bold;">42</span><span style="color: #333333;">};</span>
<span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">[]</span> numbers <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> <span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">[]{</span><span style="color: #0000dd; font-weight: bold;">4</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">8</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">15</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">16</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">23</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">42</span><span style="color: #333333;">};</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>VM<span style="color: #333333;">.</span><span style="color: #0000cc;">current</span><span style="color: #333333;">().</span><span style="color: #0000cc;">details</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>ClassLayout<span style="color: #333333;">.</span><span style="color: #0000cc;">parseInstance</span><span style="color: #333333;">(</span>empty<span style="color: #333333;">).</span><span style="color: #0000cc;">toPrintable</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>ClassLayout<span style="color: #333333;">.</span><span style="color: #0000cc;">parseInstance</span><span style="color: #333333;">(</span>one<span style="color: #333333;">).</span><span style="color: #0000cc;">toPrintable</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>ClassLayout<span style="color: #333333;">.</span><span style="color: #0000cc;">parseInstance</span><span style="color: #333333;">(</span>numbers<span style="color: #333333;">).</span><span style="color: #0000cc;">toPrintable</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıda verilen dizilerin belleğini incelemek amacıyla tasarlanmış örnek uygulama kodunu çalıştırdığımızda aşağıdaki çıktıyı elde ettik:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">#</span> Running 64-bit HotSpot VM.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed oop with 0-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed klass with 3-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Objects are 8 bytes aligned.
<span style="color: #c65d09; font-weight: bold;">#</span> Field sizes by <span style="color: #007020;">type</span>: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #c65d09; font-weight: bold;">#</span> Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #888888;">[I object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)</span>
<span style="color: #888888;"> 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)</span>
<span style="color: #888888;"> 8 4 (object header) 6d 01 00 20 (01101101 00000001 00000000 00100000) (536871277)</span>
<span style="color: #888888;"> 12 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)</span>
<span style="color: #888888;"> 16 0 int [I.<elements> N/A</span>
<span style="color: #888888;">Instance size: 16 bytes</span>
<span style="color: #888888;">Space losses: 0 bytes internal + 0 bytes external = 0 bytes total</span>
<span style="color: #888888;">[I object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)</span>
<span style="color: #888888;"> 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)</span>
<span style="color: #888888;"> 8 4 (object header) 6d 01 00 20 (01101101 00000001 00000000 00100000) (536871277)</span>
<span style="color: #888888;"> 12 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)</span>
<span style="color: #888888;"> 16 4 int [I.<elements> N/A</span>
<span style="color: #888888;"> 20 4 (loss due to the next object alignment)</span>
<span style="color: #888888;">Instance size: 24 bytes</span>
<span style="color: #888888;">Space losses: 0 bytes internal + 4 bytes external = 4 bytes total</span>
<span style="color: #888888;">[I object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)</span>
<span style="color: #888888;"> 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)</span>
<span style="color: #888888;"> 8 4 (object header) 6d 01 00 20 (01101101 00000001 00000000 00100000) (536871277)</span>
<span style="color: #888888;"> 12 4 (object header) 06 00 00 00 (00000110 00000000 00000000 00000000) (6)</span>
<span style="color: #888888;"> 16 24 int [I.<elements> N/A</span>
<span style="color: #888888;">Instance size: 40 bytes</span>
<span style="color: #888888;">Space losses: 0 bytes internal + 0 bytes external = 0 bytes total</span>
</pre>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">İçi boş olan, sıfır elemanlı bir dizi bellekte <b>16 sekizli</b> yer kaplıyor: <b>12 sekizli</b> nesnenin başlığı ve 4 sekizli ise dizinin eleman sayısını saklamak için. <b><i>Sıfır elemanlı</i>, <i>içi boş</i> bir dizi için epey maliyetli bir gösterim!</b> <i><b>Tek elemanlı bir dizi</b></i> ise <b>24 sekizlik</b> alan kullanılıyor: <b>12 sekizli</b> nesnenin başlığı, <b>4 sekizli</b> dizinin eleman sayısı, <b>4 sekizli</b> dizinin biricik elemanı için ve <b>4 sekizli</b> ise <i>hizalama</i> amacıyla kullanılıyor. Tek bir tamsayı saklamak için hala çok maliyetli! <b>6</b> elemanlı bir dizi için ise <b>40 sekizli</b> alana ihtiyaç var: </span><b style="font-family: georgia, "times new roman", serif;">12 sekizli</b><span style="font-family: "georgia" , "times new roman" , serif;"> nesnenin başlığı, </span><b style="font-family: georgia, "times new roman", serif;">4 sekizli</b><span style="font-family: "georgia" , "times new roman" , serif;"> dizinin eleman sayısı, <b>24</b></span><b style="font-family: georgia, "times new roman", serif;"> sekizli</b><span style="font-family: "georgia" , "times new roman" , serif;"> dizinin <b>6</b> adet elemanı için kullanılıyor.</span></div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Şimdi daha karmaşık bir alan sınıfından çok sayıda nesne yaratalım ve toplam bellek kullanımını raporlamaya çalışalım. Önce alan sınıflarına bir bakalım:</span><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>ListElement.java</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.Serializable</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.ArrayList</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ListElement</span> <span style="color: #008800; font-weight: bold;">implements</span> Serializable <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> Person person<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> JobInfo jobInfo<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> List<span style="color: #333333;"><</span>Phone<span style="color: #333333;">></span> phones<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> addresses<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> List<span style="color: #333333;"><</span>ProgrammingLanguage<span style="color: #333333;">></span> programmingLanguages<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> emails<span style="color: #333333;">;</span>
<span style="color: #333333;">{</span>
phones<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ArrayList<span style="color: #333333;"><>();</span>
addresses<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ArrayList<span style="color: #333333;"><>();</span>
programmingLanguages<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ArrayList<span style="color: #333333;"><>();</span>
emails<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ArrayList<span style="color: #333333;"><>();</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> Person <span style="color: #0066bb; font-weight: bold;">getPerson</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> person<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setPerson</span><span style="color: #333333;">(</span>Person person<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">person</span> <span style="color: #333333;">=</span> person<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> JobInfo <span style="color: #0066bb; font-weight: bold;">getJobInfo</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> jobInfo<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setJobInfo</span><span style="color: #333333;">(</span>JobInfo jobInfo<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">jobInfo</span> <span style="color: #333333;">=</span> jobInfo<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> List<span style="color: #333333;"><</span>Phone<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">getPhones</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> phones<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> Phone <span style="color: #0066bb; font-weight: bold;">getPhone</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> index<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> phones<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span>index<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">addPhone</span><span style="color: #333333;">(</span>Phone phone<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">phones</span><span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>phone<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">addPhone</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> index<span style="color: #333333;">,</span>Phone phone<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">phones</span><span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>index<span style="color: #333333;">,</span>phone<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">getAdress</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> index<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> addresses<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span>index<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">getAddresses</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> addresses<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">addAdress</span><span style="color: #333333;">(</span>String address<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">addresses</span><span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>address<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">addAdress</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> index<span style="color: #333333;">,</span>String address<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">addresses</span><span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>index<span style="color: #333333;">,</span>address<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> List<span style="color: #333333;"><</span>ProgrammingLanguage<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">getProgrammingLanguages</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> programmingLanguages<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> ProgrammingLanguage <span style="color: #0066bb; font-weight: bold;">getProgrammingLanguage</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> index<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> programmingLanguages<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span>index<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">addProgrammingLanguage</span><span style="color: #333333;">(</span>ProgrammingLanguage programmingLanguage<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">programmingLanguages</span><span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>programmingLanguage<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">addProgrammingLanguage</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> index<span style="color: #333333;">,</span>ProgrammingLanguage programmingLanguage<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">programmingLanguages</span><span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>index<span style="color: #333333;">,</span>programmingLanguage<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">getEmails</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> emails<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">getEmail</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> index<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> emails<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span>index<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">addEmail</span><span style="color: #333333;">(</span>String email<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">emails</span><span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>email<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">addEmail</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> index<span style="color: #333333;">,</span>String email<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">emails</span><span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>index<span style="color: #333333;">,</span>email<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<b><u>JobInfo.java</u>:</b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.Serializable</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.ArrayList</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">JobInfo</span> <span style="color: #008800; font-weight: bold;">implements</span> Serializable <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> String companyName<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> String companyAddress<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> jobTelNumbers<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> jobFaxNumbers<span style="color: #333333;">;</span>
<span style="color: #333333;">{</span>
jobTelNumbers <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ArrayList<span style="color: #333333;"><>();</span>
jobFaxNumbers <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ArrayList<span style="color: #333333;"><>();</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">JobInfo</span><span style="color: #333333;">(</span>String companyName<span style="color: #333333;">,</span> String companyAddress<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">companyName</span> <span style="color: #333333;">=</span> companyName<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">companyAddress</span> <span style="color: #333333;">=</span> companyAddress<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">getCompanyName</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> companyName<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">getCompanyAddress</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> companyAddress<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">getJobTelNumbers</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> jobTelNumbers<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">getJobFaxNumbers</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> jobFaxNumbers<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setJobFaxNumber</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> index<span style="color: #333333;">,</span> String faxNumber<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
jobFaxNumbers<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>index<span style="color: #333333;">,</span> faxNumber<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setJobFaxNumber</span><span style="color: #333333;">(</span>String faxNumber<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
jobFaxNumbers<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>faxNumber<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setJobTelNumber</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> index<span style="color: #333333;">,</span> String jobTelNumber<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
jobTelNumbers<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>index<span style="color: #333333;">,</span> jobTelNumber<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setJobTelNumber</span><span style="color: #333333;">(</span>String jobTelNumber<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
jobTelNumbers<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>jobTelNumber<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<span style="font-family: "georgia" , "times new roman" , serif;"><u><br />
</u></span> <b><span style="font-family: "georgia" , "times new roman" , serif;"><u>Phone.java</u>:</span></b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.Serializable</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Phone</span> <span style="color: #008800; font-weight: bold;">implements</span> Serializable <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> String homePhoneNumber<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String gsmPhoneNumber<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Phone</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Phone</span><span style="color: #333333;">(</span>String homePhoneNumber<span style="color: #333333;">,</span> String gsmPhoneNumber<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">homePhoneNumber</span> <span style="color: #333333;">=</span> homePhoneNumber<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">gsmPhoneNumber</span> <span style="color: #333333;">=</span> gsmPhoneNumber<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">getHomePhoneNumber</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> homePhoneNumber<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setHomePhoneNumber</span><span style="color: #333333;">(</span>String homePhoneNumber<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">homePhoneNumber</span> <span style="color: #333333;">=</span> homePhoneNumber<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">getGsmPhoneNumber</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> gsmPhoneNumber<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setGsmPhoneNumber</span><span style="color: #333333;">(</span>String gsmPhoneNumber<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">gsmPhoneNumber</span> <span style="color: #333333;">=</span> gsmPhoneNumber<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<u><br />
</u> <b><span style="font-family: "georgia" , "times new roman" , serif;"><u>ProgrammingLanguage.java</u>:</span></b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.Serializable</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ProgrammingLanguage</span> <span style="color: #008800; font-weight: bold;">implements</span> Serializable <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> String name<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #333399; font-weight: bold;">int</span> level<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #333399; font-weight: bold;">double</span> examNote<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">ProgrammingLanguage</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">ProgrammingLanguage</span><span style="color: #333333;">(</span>String name<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">int</span> level<span style="color: #333333;">,</span> <span style="color: #333399; font-weight: bold;">double</span> examNote<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">name</span> <span style="color: #333333;">=</span> name<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">level</span> <span style="color: #333333;">=</span> level<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">examNote</span> <span style="color: #333333;">=</span> examNote<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">getName</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> name<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setName</span><span style="color: #333333;">(</span>String name<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">name</span> <span style="color: #333333;">=</span> name<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">getLevel</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> level<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setLevel</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> level<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">level</span> <span style="color: #333333;">=</span> level<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">double</span> <span style="color: #0066bb; font-weight: bold;">getExamNote</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> examNote<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setExamNote</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">double</span> examNote<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">examNote</span> <span style="color: #333333;">=</span> examNote<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Şimdi <b>ListElement</b> sınıfından <b>10.000</b> tane rasgele nesne yaratalım ve bellekte ne kadar yer kapladığına bir bakalım:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">jol</span><span style="color: #333333;">.</span><span style="color: #0000cc;">exercises</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.domain.ListElement</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.util.DataBuilder</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.function.IntFunction</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.Collectors</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.IntStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.info.GraphLayout</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Exercise3</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
IntFunction<span style="color: #333333;"><?</span> <span style="color: #008800; font-weight: bold;">extends</span> ListElement<span style="color: #333333;">></span> int2ListElement <span style="color: #333333;">=</span> i <span style="color: #333333;">-></span> DataBuilder<span style="color: #333333;">.</span><span style="color: #0000cc;">createRandomListElement</span><span style="color: #333333;">();</span>
List<span style="color: #333333;"><</span>ListElement<span style="color: #333333;">></span> list <span style="color: #333333;">=</span> IntStream<span style="color: #333333;">.</span><span style="color: #0000cc;">range</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">10</span>_000<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">mapToObj</span><span style="color: #333333;">(</span>int2ListElement<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">toList</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>GraphLayout<span style="color: #333333;">.</span><span style="color: #0000cc;">parseInstance</span><span style="color: #333333;">(</span>list<span style="color: #333333;">).</span><span style="color: #0000cc;">toFootprint</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Uygulamayı çalıştırdığımızda ekran çıktısı aşağıdaki gibi gerçekleşiyor:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">java.util.ArrayList@5fd0d5aed footprint:</span>
<span style="color: #888888;"> COUNT AVG SUM DESCRIPTION</span>
<span style="color: #888888;"> 141491 61 8755528 [C</span>
<span style="color: #888888;"> 60001 56 3416232 [Ljava.lang.Object;</span>
<span style="color: #888888;"> 10000 32 320000 com.example.domain.JobInfo</span>
<span style="color: #888888;"> 10000 40 400000 com.example.domain.ListElement</span>
<span style="color: #888888;"> 10000 40 400000 com.example.domain.Person</span>
<span style="color: #888888;"> 20000 24 480000 com.example.domain.Phone</span>
<span style="color: #888888;"> 30000 32 960000 com.example.domain.ProgrammingLanguage</span>
<span style="color: #888888;"> 141491 24 3395784 java.lang.String</span>
<span style="color: #888888;"> 60001 24 1440024 java.util.ArrayList</span>
<span style="color: #888888;"> 482984 19567568 (total)</span>
</pre>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki çıktıya göre <b>141491</b> adet <b>char </b>tipinde dizi yaratılmış, bu dizilerin ortalama uzunluğu <b>61 </b>ve toplam boyu ise <b>8755528 </b>olarak gerçekleşmiş. Beklediğimiz gibi <b>10.000</b> adet <b>ListElement </b>sınıfından nesne yaratılmış, her biri <b>40 </b>sekizlik boyutunda olduğundan toplam olarak bellekte <b>400.000</b> sekizli yer kaplamış. Ancak <b>ListElement </b>sınıfının <b>JobInfo</b>, <b>Person</b>, <b>Phone</b>, <b>ProgrammingLanguage</b>, <b>String </b>tipleri ile bire-bir ve bire-çoklu türünden içerme ilişkileri bulunuyor. Dolayısı ile listede içerme ilişkisi de dahil edildiğinde toplam <b>482.984 </b>adet nesne saklanıyor ve bu nesneler toplamda bellekte <b>19.567.568</b> sekizli yer kaplıyor.</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Şu ana kadar incelememizi hep kaynak kodu elimizde olan uygulamalar için gerçekleştirdik. Şimdi ise diğer çözümlemelerimizden farklı olarak <i><b>Heap yığını</b></i> (=<b><i>Heap dump</i></b>) alınmış bir uygulama için f</span><span style="font-family: "georgia" , "times new roman" , serif;">arklı </span><b style="font-family: georgia, "times new roman", serif;">JSM </b><span style="font-family: "georgia" , "times new roman" , serif;">modellerinde bellek yerleşim başarımının nasıl değiştiğini inceleyeceğiz:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">jol</span><span style="color: #333333;">.</span><span style="color: #0000cc;">exercises</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.File</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.IOException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">static</span> java<span style="color: #333333;">.</span><span style="color: #0000cc;">lang</span><span style="color: #333333;">.</span><span style="color: #0000cc;">System</span><span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.datamodel.DataModel</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.datamodel.X86_32_DataModel</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.datamodel.X86_64_COOPS_DataModel</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.datamodel.X86_64_DataModel</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.heap.HeapDumpException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.heap.HeapDumpReader</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.info.ClassData</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.info.ClassLayout</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.layouters.HotSpotLayouter</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.layouters.Layouter</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.layouters.RawLayouter</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.util.Multiset</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Exercise5</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> IOException<span style="color: #333333;">,</span> HeapDumpException <span style="color: #333333;">{</span>
String path <span style="color: #333333;">=</span> args<span style="color: #333333;">[</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">];</span>
out<span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Heap Dump: "</span> <span style="color: #333333;">+</span> path<span style="color: #333333;">);</span>
out<span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Estimated heap consumed, bytes:"</span><span style="color: #333333;">);</span>
HeapDumpReader reader <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> HeapDumpReader<span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span>path<span style="color: #333333;">));</span>
Multiset<span style="color: #333333;"><</span>ClassData<span style="color: #333333;">></span> data <span style="color: #333333;">=</span> reader<span style="color: #333333;">.</span><span style="color: #0000cc;">parse</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span>DataModel model <span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">new</span> DataModel<span style="color: #333333;">[]{</span><span style="color: #008800; font-weight: bold;">new</span> X86_32_DataModel<span style="color: #333333;">(),</span> <span style="color: #008800; font-weight: bold;">new</span> X86_64_DataModel<span style="color: #333333;">(),</span> <span style="color: #008800; font-weight: bold;">new</span> X86_64_COOPS_DataModel<span style="color: #333333;">(),</span> <span style="color: #008800; font-weight: bold;">new</span> X86_64_COOPS_DataModel<span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">16</span><span style="color: #333333;">)})</span> <span style="color: #333333;">{</span>
Layouter l <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> RawLayouter<span style="color: #333333;">(</span>model<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">long</span> rawData <span style="color: #333333;">=</span> process<span style="color: #333333;">(</span>data<span style="color: #333333;">,</span> l<span style="color: #333333;">);</span>
out<span style="color: #333333;">.</span><span style="color: #0000cc;">printf</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"%11s %,15d: %s%n"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">""</span><span style="color: #333333;">,</span> rawData<span style="color: #333333;">,</span> l<span style="color: #333333;">);</span>
l <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> HotSpotLayouter<span style="color: #333333;">(</span>model<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">long</span> hsBase <span style="color: #333333;">=</span> process<span style="color: #333333;">(</span>data<span style="color: #333333;">,</span> l<span style="color: #333333;">);</span>
out<span style="color: #333333;">.</span><span style="color: #0000cc;">printf</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"%11s %,15d: %s%n"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">""</span><span style="color: #333333;">,</span> hsBase<span style="color: #333333;">,</span> l<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> <span style="color: #333399; font-weight: bold;">boolean</span><span style="color: #333333;">[]</span> BOOLS <span style="color: #333333;">=</span> <span style="color: #333333;">{</span><span style="color: #008800; font-weight: bold;">false</span><span style="color: #333333;">,</span> <span style="color: #008800; font-weight: bold;">true</span><span style="color: #333333;">};</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">boolean</span> hierarchyGaps <span style="color: #333333;">:</span> BOOLS<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">boolean</span> superClassGaps <span style="color: #333333;">:</span> BOOLS<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">boolean</span> autoAlign <span style="color: #333333;">:</span> BOOLS<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">boolean</span> compactFields <span style="color: #333333;">:</span> BOOLS<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> fieldAllocationStyle <span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">new</span> <span style="color: #333399; font-weight: bold;">int</span><span style="color: #333333;">[]{</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">})</span> <span style="color: #333333;">{</span>
l <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> HotSpotLayouter<span style="color: #333333;">(</span>model<span style="color: #333333;">,</span> hierarchyGaps<span style="color: #333333;">,</span> superClassGaps<span style="color: #333333;">,</span> autoAlign<span style="color: #333333;">,</span> compactFields<span style="color: #333333;">,</span> fieldAllocationStyle<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">long</span> s <span style="color: #333333;">=</span> process<span style="color: #333333;">(</span>data<span style="color: #333333;">,</span> l<span style="color: #333333;">);</span>
out<span style="color: #333333;">.</span><span style="color: #0000cc;">printf</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"%10.3f%% %,15d: %s%n"</span><span style="color: #333333;">,</span> <span style="color: #333333;">(</span>s <span style="color: #333333;">-</span> hsBase<span style="color: #333333;">)</span> <span style="color: #333333;">*</span> <span style="color: #6600ee; font-weight: bold;">100.0</span> <span style="color: #333333;">/</span> hsBase<span style="color: #333333;">,</span> s<span style="color: #333333;">,</span> l<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
out<span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">long</span> <span style="color: #0066bb; font-weight: bold;">process</span><span style="color: #333333;">(</span>Multiset<span style="color: #333333;"><</span>ClassData<span style="color: #333333;">></span> data<span style="color: #333333;">,</span> Layouter layouter<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">long</span> totalFootprint <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span>ClassData cd <span style="color: #333333;">:</span> data<span style="color: #333333;">.</span><span style="color: #0000cc;">keys</span><span style="color: #333333;">())</span> <span style="color: #333333;">{</span>
ClassLayout layout <span style="color: #333333;">=</span> layouter<span style="color: #333333;">.</span><span style="color: #0000cc;">layout</span><span style="color: #333333;">(</span>cd<span style="color: #333333;">);</span>
totalFootprint <span style="color: #333333;">+=</span> layout<span style="color: #333333;">.</span><span style="color: #0000cc;">instanceSize</span><span style="color: #333333;">()</span> <span style="color: #333333;">*</span> data<span style="color: #333333;">.</span><span style="color: #0000cc;">count</span><span style="color: #333333;">(</span>cd<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">return</span> totalFootprint<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki uygulamayı <b>Exercise3</b> ile verilen uygulamanın <i>Heap yığını</i> (Heap dump) ile çalıştırıldığında aşağıdaki ekran çıktısı oluşuyor:</span></div>
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">Heap Dump: c:/tmp/exercise3.hprof</span>
<span style="color: #888888;">Estimated heap consumed, bytes:</span>
<span style="color: #888888;"> 160,943,452: Raw data (X32 model, 8-byte aligned)</span>
<span style="color: #888888;"> 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 1.427% 170,571,072: VM Layout Simulation (X32 model, 8-byte aligned, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 1.182% 170,158,964: VM Layout Simulation (X32 model, 8-byte aligned, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, autoalign, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 1.427% 170,571,072: VM Layout Simulation (X32 model, 8-byte aligned, super gaps, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, super gaps, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, super gaps, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, super gaps, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, super gaps, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, super gaps, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 1.182% 170,158,964: VM Layout Simulation (X32 model, 8-byte aligned, super gaps, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, super gaps, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, super gaps, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, super gaps, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, super gaps, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, super gaps, autoalign, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 1.427% 170,571,072: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 1.182% 170,158,964: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, autoalign, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 1.427% 170,571,072: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, super gaps, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, super gaps, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, super gaps, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, super gaps, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, super gaps, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 168,171,040: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, super gaps, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 1.182% 170,158,964: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, super gaps, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, super gaps, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, super gaps, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, super gaps, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, super gaps, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -0.245% 167,758,932: VM Layout Simulation (X32 model, 8-byte aligned, hierarchy gaps, super gaps, autoalign, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 239,746,052: Raw data (X64 model, 8-byte aligned)</span>
<span style="color: #888888;"> 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, autoalign, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, super gaps, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, super gaps, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, super gaps, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, super gaps, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, super gaps, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, super gaps, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, super gaps, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, super gaps, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, super gaps, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, super gaps, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, super gaps, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, super gaps, autoalign, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, autoalign, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, super gaps, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, super gaps, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, super gaps, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, super gaps, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, super gaps, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 256,200,936: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, super gaps, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, super gaps, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, super gaps, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, super gaps, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, super gaps, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, super gaps, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -0.002% 256,196,168: VM Layout Simulation (X64 model, 8-byte aligned, hierarchy gaps, super gaps, autoalign, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 180,227,628: Raw data (X64 model (compressed oops), 8-byte aligned)</span>
<span style="color: #888888;"> 195,574,560: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 195,574,736: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 195,575,088: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 195,575,088: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 195,574,560: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 195,574,560: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 195,574,560: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> -4.722% 186,339,900: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -4.722% 186,340,252: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -4.722% 186,340,252: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -4.722% 186,339,724: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -4.722% 186,339,724: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -4.722% 186,339,724: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, autoalign, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 195,574,736: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, super gaps, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 195,575,088: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, super gaps, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 195,575,088: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, super gaps, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 195,574,560: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, super gaps, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 195,574,560: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, super gaps, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 195,574,560: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, super gaps, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> -4.722% 186,339,900: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, super gaps, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -4.722% 186,340,252: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, super gaps, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -4.722% 186,340,252: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, super gaps, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -4.722% 186,339,724: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, super gaps, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -4.722% 186,339,724: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, super gaps, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -4.722% 186,339,724: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, super gaps, autoalign, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 195,574,736: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 195,575,088: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 195,575,088: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 195,574,560: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 195,574,560: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 195,574,560: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> -4.722% 186,339,900: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -4.722% 186,340,252: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -4.722% 186,340,252: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -4.722% 186,339,724: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -4.722% 186,339,724: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -4.722% 186,339,724: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, autoalign, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 195,574,736: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, super gaps, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 195,575,088: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, super gaps, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 195,575,088: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, super gaps, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 195,574,560: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, super gaps, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 195,574,560: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, super gaps, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 195,574,560: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, super gaps, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> -4.722% 186,339,900: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, super gaps, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -4.722% 186,340,252: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, super gaps, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -4.722% 186,340,252: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, super gaps, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -4.722% 186,339,724: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, super gaps, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -4.722% 186,339,724: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, super gaps, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -4.722% 186,339,724: VM Layout Simulation (X64 model (compressed oops), 8-byte aligned, hierarchy gaps, super gaps, autoalign, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 180,227,628: Raw data (X64 model (compressed oops), 16-byte aligned)</span>
<span style="color: #888888;"> 226,060,016: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 226,060,048: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 226,060,064: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 226,060,064: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 226,060,016: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 226,060,016: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 226,060,016: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> -12.607% 197,560,756: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -12.607% 197,561,108: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -12.607% 197,561,108: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -12.607% 197,560,580: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -12.607% 197,560,580: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -12.607% 197,560,580: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, autoalign, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 226,060,048: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, super gaps, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 226,060,064: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, super gaps, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 226,060,064: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, super gaps, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 226,060,016: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, super gaps, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 226,060,016: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, super gaps, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 226,060,016: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, super gaps, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> -12.607% 197,560,756: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, super gaps, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -12.607% 197,561,108: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, super gaps, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -12.607% 197,561,108: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, super gaps, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -12.607% 197,560,580: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, super gaps, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -12.607% 197,560,580: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, super gaps, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -12.607% 197,560,580: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, super gaps, autoalign, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 226,060,048: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 226,060,064: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 226,060,064: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 226,060,016: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 226,060,016: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 226,060,016: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> -12.607% 197,560,756: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -12.607% 197,561,108: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -12.607% 197,561,108: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -12.607% 197,560,580: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -12.607% 197,560,580: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -12.607% 197,560,580: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, autoalign, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 226,060,048: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, super gaps, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 226,060,064: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, super gaps, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 226,060,064: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, super gaps, field allocation style: 2)</span>
<span style="color: #888888;"> 0.000% 226,060,016: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, super gaps, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> 0.000% 226,060,016: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, super gaps, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> 0.000% 226,060,016: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, super gaps, compact fields, field allocation style: 2)</span>
<span style="color: #888888;"> -12.607% 197,560,756: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, super gaps, autoalign, field allocation style: 0)</span>
<span style="color: #888888;"> -12.607% 197,561,108: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, super gaps, autoalign, field allocation style: 1)</span>
<span style="color: #888888;"> -12.607% 197,561,108: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, super gaps, autoalign, field allocation style: 2)</span>
<span style="color: #888888;"> -12.607% 197,560,580: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, super gaps, autoalign, compact fields, field allocation style: 0)</span>
<span style="color: #888888;"> -12.607% 197,560,580: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, super gaps, autoalign, compact fields, field allocation style: 1)</span>
<span style="color: #888888;"> -12.607% 197,560,580: VM Layout Simulation (X64 model (compressed oops), 16-byte aligned, hierarchy gaps, super gaps, autoalign, compact fields, field allocation style: 2)</span>
</pre>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Bu çıktıdan uygulamanın bellekte kapladığı alanın, diğer bir deyişle ayak izinin <b>JSM </b>parametreleri ile değişimini izleyebilirsiniz. Elinizdeki uygulama için uygulamanın ayak izini iyileştirecek <b>JSM </b>parametre kümesine bu çıktıdan ulaşabilirsiniz. Yukarıdaki çıktıyı daha rahat okuyabilmeniz için çıktıdaki verileri aşağıda tablo formatında paylaşıyorum:</span></div>
<style type="text/css"><!--td {border: 1px solid #ccc;}br {mso-data-placement:same-cell;}--></style><br />
<table border="1" cellpadding="0" cellspacing="0" dir="ltr" style="border-collapse: collapse; border: none; font-family: arial,sans,sans-serif; font-size: 10pt; table-layout: fixed;" xmlns="http://www.w3.org/1999/xhtml"><colgroup><col width="100"></col><col width="116"></col><col width="121"></col><col width="100"></col><col width="100"></col><col width="100"></col><col width="100"></col><col width="124"></col><col width="100"></col><col width="100"></col></colgroup><tbody>
<tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"Model"}" style="border-bottom-color: rgb(0, 0, 0); border-bottom-style: double; border-top-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; font-weight: bold; padding: 2px 3px; text-align: center; vertical-align: bottom;">Model</td><td data-sheets-value="{"1":2,"2":"Alignment Size"}" style="border-bottom-color: rgb(0, 0, 0); border-bottom-style: double; border-top-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; font-weight: bold; padding: 2px 3px; text-align: center; vertical-align: bottom;">Alignment Size</td><td data-sheets-value="{"1":2,"2":"Compressed Oops"}" style="border-bottom-color: rgb(0, 0, 0); border-bottom-style: double; border-top-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; font-weight: bold; padding: 2px 3px; text-align: center; vertical-align: bottom;">Compressed Oops</td><td data-sheets-value="{"1":2,"2":"Autoalign"}" style="border-bottom-color: rgb(0, 0, 0); border-bottom-style: double; border-top-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; font-weight: bold; padding: 2px 3px; text-align: center; vertical-align: bottom;">Autoalign</td><td data-sheets-value="{"1":2,"2":"Super gaps"}" style="border-bottom-color: rgb(0, 0, 0); border-bottom-style: double; border-top-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; font-weight: bold; padding: 2px 3px; text-align: center; vertical-align: bottom;">Super gaps</td><td data-sheets-value="{"1":2,"2":"Hierarchy gaps"}" style="border-bottom-color: rgb(0, 0, 0); border-bottom-style: double; border-top-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; font-weight: bold; padding: 2px 3px; text-align: center; vertical-align: bottom;">Hierarchy gaps</td><td data-sheets-value="{"1":2,"2":"Compact fields"}" style="border-bottom-color: rgb(0, 0, 0); border-bottom-style: double; border-top-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; font-weight: bold; padding: 2px 3px; text-align: center; vertical-align: bottom;">Compact fields</td><td data-sheets-value="{"1":2,"2":"Field allocation style"}" style="border-bottom-color: rgb(0, 0, 0); border-bottom-style: double; border-top-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; font-weight: bold; padding: 2px 3px; text-align: center; vertical-align: bottom;">Field allocation style</td><td data-sheets-value="{"1":2,"2":"Size"}" style="border-bottom-color: rgb(0, 0, 0); border-bottom-style: double; border-top-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; font-weight: bold; padding: 2px 3px; text-align: center; vertical-align: bottom;">Size</td><td data-sheets-value="{"1":2,"2":"Efficiency"}" style="border-bottom-color: rgb(0, 0, 0); border-bottom-style: double; border-top-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; font-weight: bold; padding: 2px 3px; text-align: center; vertical-align: bottom;">Efficiency</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":2,"2":"raw"}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">raw</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":160943452}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">160,943,452</td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":170571072}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">170,571,072</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0.0143}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1.43%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":170158964}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">170,158,964</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0.0118}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1.18%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":170571072}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">170,571,072</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0.0143}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1.43%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":170158964}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">170,158,964</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0.0118}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1.18%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":170571072}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">170,571,072</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0.0143}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1.43%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":170158964}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">170,158,964</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0.0118}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1.18%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":170571072}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">170,571,072</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0.0143}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1.43%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":168171040}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">168,171,040</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":170158964}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">170,158,964</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0.0118}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1.18%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":32}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">32</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":167758932}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">167,758,932</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0025}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-0.25%</td></tr>
<tr style="height: 21px;"><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":239746052}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">239,746,052</td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256200936}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,200,936</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":256196168}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">256,196,168</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td></tr>
<tr style="height: 21px;"><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":2,"2":"raw"}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">raw</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":180227628}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">180,227,628</td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574560}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,560</td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574736}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,736</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195575088}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,575,088</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195575088}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,575,088</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574560}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,560</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574560}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,560</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574560}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,560</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339900}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,900</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186340252}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,340,252</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186340252}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,340,252</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339724}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,724</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339724}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,724</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339724}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,724</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574736}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,736</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195575088}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,575,088</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195575088}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,575,088</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574560}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,560</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574560}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,560</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574560}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,560</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339900}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,900</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186340252}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,340,252</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186340252}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,340,252</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339724}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,724</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339724}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,724</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339724}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,724</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574736}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,736</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195575088}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,575,088</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195575088}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,575,088</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574560}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,560</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574560}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,560</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574560}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,560</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339900}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,900</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186340252}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,340,252</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186340252}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,340,252</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339724}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,724</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339724}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,724</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339724}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,724</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574736}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,736</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195575088}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,575,088</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195575088}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,575,088</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574560}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,560</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574560}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,560</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":195574560}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">195,574,560</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339900}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,900</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186340252}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,340,252</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186340252}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,340,252</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339724}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,724</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339724}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,724</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":8}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">8</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":186339724}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">186,339,724</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.0472}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-4.72%</td></tr>
<tr style="height: 21px;"><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":2,"2":"raw"}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">raw</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":180227628}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">180,227,628</td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060016}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,016</td><td style="padding: 2px 3px 2px 3px; vertical-align: bottom;"></td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060048}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,048</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060064}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,064</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060064}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,064</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060016}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,016</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060016}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,016</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060016}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,016</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560756}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,756</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197561108}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,561,108</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197561108}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,561,108</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560580}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,580</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560580}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,580</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560580}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,580</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060048}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,048</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060064}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,064</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060064}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,064</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060016}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,016</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060016}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,016</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060016}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,016</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560756}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,756</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197561108}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,561,108</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197561108}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,561,108</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560580}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,580</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560580}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,580</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560580}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,580</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060048}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,048</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060064}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,064</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060064}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,064</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060016}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,016</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060016}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,016</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060016}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,016</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560756}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,756</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197561108}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,561,108</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197561108}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,561,108</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560580}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,580</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560580}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,580</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560580}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,580</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060048}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,048</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060064}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,064</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060064}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,064</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060016}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,016</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060016}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,016</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":226060016}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">226,060,016</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0.00%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560756}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,756</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197561108}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,561,108</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">FALSE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197561108}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,561,108</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":0}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">0</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560580}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,580</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">1</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560580}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,580</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560580}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,580</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":64}" style="border-bottom-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">64</td><td data-sheets-value="{"1":3,"3":16}" style="border-bottom-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">16</td><td data-sheets-value="{"1":4,"4":1}" style="border-bottom-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="border-bottom-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="border-bottom-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="border-bottom-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":4,"4":1}" style="border-bottom-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">TRUE</td><td data-sheets-value="{"1":3,"3":2}" style="border-bottom-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">2</td><td data-sheets-numberformat="{"1":2,"2":"#,##0","3":1}" data-sheets-value="{"1":3,"3":197560580}" style="border-bottom-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">197,560,580</td><td data-sheets-numberformat="{"1":3,"2":"0.00%","3":1}" data-sheets-value="{"1":3,"3":-0.1261}" style="border-bottom-color: rgb(0, 0, 0); font-family: Calibri; font-size: 11pt; padding: 2px 3px; text-align: center; vertical-align: bottom;">-12.61%</td></tr>
</tbody></table>
<b style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><br /></span></b>
<b style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">FieldsAllocationStyle</span></b><br />
<b style="font-family: georgia, "times new roman", serif; text-align: justify;"><br />
</b> <span style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;">Bu bölümde <b>JSM </b>tarafından uygulanan farklı yerleşim taktiklerini çalışacağız. Önce incelememizde kullanacağımız örnek kodu inceleyelim:</span></span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">jol</span><span style="color: #333333;">.</span><span style="color: #0000cc;">exercises</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.info.ClassLayout</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.vm.VM</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Exercise5</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>VM<span style="color: #333333;">.</span><span style="color: #0000cc;">current</span><span style="color: #333333;">().</span><span style="color: #0000cc;">details</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>ClassLayout<span style="color: #333333;">.</span><span style="color: #0000cc;">parseClass</span><span style="color: #333333;">(</span>A<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">).</span><span style="color: #0000cc;">toPrintable</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">A</span> <span style="color: #008800; font-weight: bold;">extends</span> D<span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">byte</span> b<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">short</span> s<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">int</span> i<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">long</span> l<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">char</span> c<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">boolean</span> x<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">float</span> f<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">double</span> d<span style="color: #333333;">;</span>
B ref1<span style="color: #333333;">;</span>
C ref2<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">B</span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">short</span> s<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">int</span> i<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">C</span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">double</span> d<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">boolean</span> b<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">D</span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">double</span> d<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">boolean</span> b<span style="color: #333333;">;</span>
E ref3<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">E</span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">double</span> d<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">boolean</span> b<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span></pre>
</div>
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>FieldAllocationStyle=0</b></span></li>
</ul>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Bu yerleşim taktiğinde, önce referans tipinden öznitelikler belleğe yerleştirilir, daha sonra temel tiplerden tanımlı öznitelikler belleğe yerleştirilir. Yukarıda verilen uygulama <b>-XX:FieldAllocationStyle=0</b> seçeneği ile çalıştırılırsa üyelerin belleğe yerleşimi aşağıdaki şekilde gerçekleşiyor:</span></blockquote>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">#</span> Running 64-bit HotSpot VM.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed oop with 0-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed klass with 3-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Objects are 8 bytes aligned.
<span style="color: #c65d09; font-weight: bold;">#</span> Field sizes by <span style="color: #007020;">type</span>: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #c65d09; font-weight: bold;">#</span> Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #888888;">com.example.jol.exercises.A object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 12 (object header) N/A</span>
<span style="color: #888888;"> 12 4 com.example.jol.exercises.E D.ref3 N/A</span>
<span style="color: #888888;"> 16 8 double D.d N/A</span>
<span style="color: #888888;"> 24 1 boolean D.b N/A</span>
<span style="color: #888888;"> 25 3 (alignment/padding gap) </span>
<span style="color: #888888;"> 28 4 com.example.jol.exercises.B A.ref1 N/A</span>
<span style="color: #888888;"> 32 4 com.example.jol.exercises.C A.ref2 N/A</span>
<span style="color: #888888;"> 36 4 int A.i N/A</span>
<span style="color: #888888;"> 40 8 long A.l N/A</span>
<span style="color: #888888;"> 48 8 double A.d N/A</span>
<span style="color: #888888;"> 56 4 float A.f N/A</span>
<span style="color: #888888;"> 60 2 short A.s N/A</span>
<span style="color: #888888;"> 62 2 char A.c N/A</span>
<span style="color: #888888;"> 64 1 byte A.b N/A</span>
<span style="color: #888888;"> 65 1 boolean A.x N/A</span>
<span style="color: #888888;"> 66 6 (loss due to the next object alignment)</span>
<span style="color: #888888;">Instance size: 72 bytes</span>
<span style="color: #888888;">Space losses: 3 bytes internal + 6 bytes external = 9 bytes total</span></pre>
</div>
<blockquote class="tr_bq" style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki çıktıdan da görüleceği gibi <b>JSM </b>önce temel sınıf olan <b>D</b> sınıfından gelen üyeleri belleğe yerleştirdi. Bunu yaparken ise önce referans tipinden değişken olan <b>ref3</b> değişkenini belleğe yerleştirdi. Ardından temel tiplerden üyeler belleğe yerleştirildi. Devamında ise <b>A</b> sınıfından tanımlanan üyeler belleğe yerleştirildi. Yerleşimde yine öncelikli olarak referans tipinden öznitelikler olan <b>ref1</b> ve <b>ref2</b> değişkenleri yerleştirildi. Bu yerleşim taktiğinde bellek kullanımı <b>72 sekizli</b> olarak gerçekleşti.</span></blockquote>
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>FieldAllocationStyle=1</b></span></li>
</ul>
<blockquote class="tr_bq" style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Bu yerleşim taktiğinde, önce temel tiplerden öznitelikler belleğe yerleştirilir. Daha sonra referans tipinden öznitelikler belleğe yerleştirilir. Yukarıda verilen uygulama </span><b style="font-family: georgia, "times new roman", serif;">-XX:FieldAllocationStyle=1</b><span style="font-family: "georgia" , "times new roman" , serif;"> seçeneği ile çalıştırılırsa üyelerin belleğe yerleşimi aşağıdaki şekilde gerçekleşiyor:</span></blockquote>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">#</span> Running 64-bit HotSpot VM.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed oop with 0-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed klass with 3-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Objects are 8 bytes aligned.
<span style="color: #c65d09; font-weight: bold;">#</span> Field sizes by <span style="color: #007020;">type</span>: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #c65d09; font-weight: bold;">#</span> Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #888888;">com.example.jol.exercises.A object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 12 (object header) N/A</span>
<span style="color: #888888;"> 12 1 boolean D.b N/A</span>
<span style="color: #888888;"> 13 3 (alignment/padding gap) </span>
<span style="color: #888888;"> 16 8 double D.d N/A</span>
<span style="color: #888888;"> 24 4 com.example.jol.exercises.E D.ref3 N/A</span>
<span style="color: #888888;"> 28 4 int A.i N/A</span>
<span style="color: #888888;"> 32 8 long A.l N/A</span>
<span style="color: #888888;"> 40 8 double A.d N/A</span>
<span style="color: #888888;"> 48 4 float A.f N/A</span>
<span style="color: #888888;"> 52 2 short A.s N/A</span>
<span style="color: #888888;"> 54 2 char A.c N/A</span>
<span style="color: #888888;"> 56 1 byte A.b N/A</span>
<span style="color: #888888;"> 57 1 boolean A.x N/A</span>
<span style="color: #888888;"> 58 2 (alignment/padding gap) </span>
<span style="color: #888888;"> 60 4 com.example.jol.exercises.B A.ref1 N/A</span>
<span style="color: #888888;"> 64 4 com.example.jol.exercises.C A.ref2 N/A</span>
<span style="color: #888888;"> 68 4 (loss due to the next object alignment)</span>
<span style="color: #888888;">Instance size: 72 bytes</span>
<span style="color: #888888;">Space losses: 5 bytes internal + 4 bytes external = 9 bytes total</span></pre>
</div>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;">Yukarıdaki çıktıdan da görüleceği gibi </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;">JSM </b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;">temel sınıf olan </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;">D</b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> sınıfından gelen üyeler için yer ayrıldı. Bunu yaparken önce temel tiplerden üyeler ve daha sonra referans türünden üyeler (<b>ref3</b>) yerleştirildi. Ardından <b>A</b> sınıfından gelen üyeler belleğe yerleştirildi. Bu yerleşimde de yine önce temel tiplerden üyeler bellektekini yerini aldıktan sonra referans tipinden üyeler <b>ref1</b> ve <b>ref2 </b>değişkenleri belleğe ardışıl olarak yerleştirildi. </span><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;">Bu yerleşim taktiğinde bellek kullanımı </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;">72 sekizli</b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> olarak gerçekleşti.</span></blockquote>
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>FieldAllocationStyle=2</b></span></li>
</ul>
<blockquote class="tr_bq" style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Bu yerleşim taktiğinde öncelikli olarak hem temel sınıftan hem de sınıf içinde tanımlı olan referans tipinden öznitelikleri gruplayarak birlikte belleğe yerleştirir, daha sonra temel tiplerden tanımlı öznitelikleri belleğe yerleştirir.Yukarıda verilen uygulama <b>-XX:FieldAllocationStyle=2</b> seçeneği ile çalıştırılırsa üyelerin belleğe yerleşimi aşağıdaki şekilde gerçekleşiyor:</span></blockquote>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">#</span> Running 64-bit HotSpot VM.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed oop with 0-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed klass with 3-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Objects are 8 bytes aligned.
<span style="color: #c65d09; font-weight: bold;">#</span> Field sizes by <span style="color: #007020;">type</span>: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #c65d09; font-weight: bold;">#</span> Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #888888;">com.example.jol.exercises.A object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 12 (object header) N/A</span>
<span style="color: #888888;"> 12 1 boolean D.b N/A</span>
<span style="color: #888888;"> 13 3 (alignment/padding gap) </span>
<span style="color: #888888;"> 16 8 double D.d N/A</span>
<span style="color: #888888;"> 24 4 com.example.jol.exercises.E D.ref3 N/A</span>
<span style="color: #888888;"> 28 4 com.example.jol.exercises.B A.ref1 N/A</span>
<span style="color: #888888;"> 32 4 com.example.jol.exercises.C A.ref2 N/A</span>
<span style="color: #888888;"> 36 4 int A.i N/A</span>
<span style="color: #888888;"> 40 8 long A.l N/A</span>
<span style="color: #888888;"> 48 8 double A.d N/A</span>
<span style="color: #888888;"> 56 4 float A.f N/A</span>
<span style="color: #888888;"> 60 2 short A.s N/A</span>
<span style="color: #888888;"> 62 2 char A.c N/A</span>
<span style="color: #888888;"> 64 1 byte A.b N/A</span>
<span style="color: #888888;"> 65 1 boolean A.x N/A</span>
<span style="color: #888888;"> 66 6 (loss due to the next object alignment)</span>
<span style="color: #888888;">Instance size: 72 bytes</span>
<span style="color: #888888;">Space losses: 3 bytes internal + 6 bytes external = 9 bytes total</span></pre>
</div>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;">Yukarıdaki çıktıdan da görüleceği gibi </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;">JSM </b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;">temel sınıf olan </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;">D</b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> sınıfından ve ondan türetilen <b>A</b> sınıfından gelen referans tipinden üyeleri gruplayarak belleğe yerleştirdi. <b>ref3</b>, <b>ref1</b> ve <b>ref2 </b>değişkenleri belleğe ardışıl olarak yerleştirildi. </span><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;">Bu yerleşim taktiğinde bellek kullanımı </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;">72 sekizli</b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> olarak gerçekleşti.</span></blockquote>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Örneğimizde verilen sınıflar ve aralarındaki ilişkiler için her üç yerleşim taktiği aynı boyuta sahip yerleşimler üretti. Değişen sadece <b><i>iç</i></b> (=<b><i>internal</i></b>) ve <i style="font-weight: bold;">dış </i>(=<i><b>external</b></i>) <i style="font-weight: bold;">bölünmelerden</i> (=<b><i>fragmentation</i></b>) kaynaklı kayıplar oldu. <b>İç bölünme</b> kalıtım sınıfları arasındaki hizalamadan dolayı oluşurken, <b>dış bölünme</b> ise nesneler arasındaki hizalamadan dolayı gerçekleşir. Buna göre, nesnenin bellekte kapladığı alanı değiştirmeden, birinci taktik (<b>FieldsAllocationStyle=0</b>) ve üçüncü taktik </span><span style="font-family: "georgia" , "times new roman" , serif;">(</span><b style="font-family: Georgia, "Times New Roman", serif;">FieldsAllocationStyle=2</b><span style="font-family: "georgia" , "times new roman" , serif;">) </span><span style="font-family: "georgia" , "times new roman" , serif;">için </span><b style="font-family: Georgia, "Times New Roman", serif;">D</b><span style="font-family: "georgia" , "times new roman" , serif;"> sınıfına </span><b style="font-family: Georgia, "Times New Roman", serif;">3 sekizlik</b><span style="font-family: "georgia" , "times new roman" , serif;"> ve </span><b style="font-family: Georgia, "Times New Roman", serif;">A sınıfına</b><span style="font-family: "georgia" , "times new roman" , serif;"> </span><b style="font-family: Georgia, "Times New Roman", serif;">6 sekizlik</b><span style="font-family: "georgia" , "times new roman" , serif;"> üye ekleyebilirken, ikinci taktik </span><span style="font-family: "georgia" , "times new roman" , serif;">(</span><b style="font-family: Georgia, "Times New Roman", serif;">FieldsAllocationStyle=1</b><span style="font-family: "georgia" , "times new roman" , serif;">) </span><span style="font-family: "georgia" , "times new roman" , serif;">için ise </span><b style="font-family: Georgia, "Times New Roman", serif;">D</b><span style="font-family: "georgia" , "times new roman" , serif;"> sınıfına </span><b style="font-family: Georgia, "Times New Roman", serif;">5 sekizlik</b><span style="font-family: "georgia" , "times new roman" , serif;"> ve </span><b style="font-family: Georgia, "Times New Roman", serif;">A</b><span style="font-family: "georgia" , "times new roman" , serif;"> sınıfına</span><b style="font-family: Georgia, "Times New Roman", serif;"> 5 sekizlik</b><span style="font-family: "georgia" , "times new roman" , serif;"> üye ekleyebiliriz. Sonuç olarak <b>FieldsAllocationStyle</b> parametresi, sınıf seviyesinde seçilebilecek bir parametre olmaması, bütüncül bir parametre olması nedeni ile <b>JSM <i>başarımını akort etmek için kullanılamaz</i></b>.</span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Genel olarak nesnenin bellekte kaç sekizli bir alan kaplayacağını daha çok <b>JSM</b>'nin kaç bitlik olduğu, nesnelerin belleğe kaç sekizlik olarak hizalandığı ve <b>Compressed OOPS</b> özelliğinin açık olup olmaması belirlemektedir. Bunu </span><span style="font-family: "georgia" , "times new roman" , serif;"><i><b>Heap yığını</b></i> alınmış bir uygulama için f</span><span style="font-family: "georgia" , "times new roman" , serif;">arklı </span><b style="font-family: georgia, "times new roman", serif;">JSM </b><span style="font-family: "georgia" , "times new roman" , serif;">modellerinde bellek yerleşim başarım incelemesinde görmek mümkündür. Burada başarımı en çok <b>Compressed OOPS</b> en iyilemesi belirliyor. Bu en iyileme varsayılan olarak açık geliyor ve <b>64-bitlik bir JSM</b>'de en tıkız bellek yerleşimi <b>186,339,724 sekizli</b> ile <b>Compressed OOPS</b> özelliği açıkken elde ediliyor. Bu özellik kapalı olduğunda ise en tıkız bellek yerleşimi <b>256,196,168</b> sekizli olarak gerçekleşiyor. <b>Compressed OOPS</b> özelliği açıldığında bu değer <b>186,339,724 </b>sekizliye düşüyor. İyileşme <b>69,856,444</b> sekizli kadar ediyor. İyileşmenin yüzde karşılığı <b>-27.27</b>! </span><span style="font-family: "georgia" , "times new roman" , serif;">Bu incelemelerden çıkarılması gereken en önemli ders, bir nesnenin bellekte kaç sekizli yer kapladığının hesabının, nesnenin üyelerinin boylarını toplayarak yapılamayacağıdır! Nesnenin bellekte kaç sekizli yer kaplayacağı ve bellekteki yerleşimi bir çok parametreye bağlı olarak değişmektedir: </span><br />
<ul>
<li><b style="font-family: georgia, "times new roman", serif;">JSM</b><span style="font-family: "georgia" , "times new roman" , serif;">'nin markası: </span><b style="font-family: georgia, "times new roman", serif;">Hotspot</b><span style="font-family: "georgia" , "times new roman" , serif;">, </span><b style="font-family: georgia, "times new roman", serif;">JRockit</b><span style="font-family: "georgia" , "times new roman" , serif;">, </span><b style="font-family: georgia, "times new roman", serif;">J9</b><span style="font-family: "georgia" , "times new roman" , serif;">, </span><b style="font-family: georgia, "times new roman", serif;">Zing</b><span style="font-family: "georgia" , "times new roman" , serif;">, </span><b style="font-family: georgia, "times new roman", serif;">Zulu </b><span style="font-family: "georgia" , "times new roman" , serif;">gibi. Nesnenin başlık kısmı bir <b>JSM</b>'den diğerine değişebilir.</span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>JSM</b>'nin kaç bit olduğu: <i><b>32-bit</b></i> ya da <b><i>64-bit</i></b> gibi. <b><i>32-bitlik</i></b> <b>JSM</b>'de başlık kısmının ve referansın boyu küçüktür. 64-bitlik JSM'de başlık kısmının boyu artsa da ve referans değişkenlerinin boyu iki katına çıksa da yazıda yukarıda açıklanan <b>Compressed OOPS</b> özelliği sayesinde <b><i>belirli Heap boyutlarına kadar</i></b> referans değişkenleri daha kısa sekizliler olarak gösterilir ve bellek yerleşiminde yerden kazanılır.</span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Nesnelerin kaç sekizli olarak hizalandığı: <b>ObjectAlignmentInBytes</b> parametresi bunu belirler. İşlemci mimarisine bağlı olarak değişir. 64-bitlik Intel işlemciler için <b>8 </b>sekizlidir.</span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Nesnelerin üyelerinin belleğe yerleştirilme taktiği: <b style="font-family: Georgia, "Times New Roman", serif;">FieldsAllocationStyle</b><span style="font-family: "georgia" , "times new roman" , serif;"> ve</span><b style="font-family: Georgia, "Times New Roman", serif;"> CompactFields </b>parametreleri ile kontrol edilmektedir. Bu parametreler nesnenin bellekteki boyundan daha çok yerleşimini kontrol etmektedir.</span></li>
</ul>
<br />
<div>
<b style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">@Contended</span></b></div>
<b style="font-family: georgia, "times new roman", serif; text-align: justify;"><br />
</b><span style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"><b>Java geliştiricisi</b> çoğu zaman uygulamanın üzerinde çalıştığı işlemcinin detayı ve nesnenin belleğe nasıl dizildiği ile ilgilenmez. Ancak eğer <b><i>paralel programlama</i></b> yapıyorsanız ve <b><i>İplikler</i></b> (=<i><b>Threads</b></i>) ile çalışıyorsanız, nesnenin belleğe nasıl dizildiği önemli olabilir. Paralel programlamada paylaşılan verilere erişimi mutlaka düzenlemeniz gerekir. Eğer veriler cep bellekte ise daha fazla dikkat etmeniz gerekir. İşlemci içindeki cep bellekler hiyerarşik olarak düzenlenmiştir. İşlemciye en yakın Cep Bellek L1 cebidir. Genellikle her çekirdeğin kendi cep belleği bulunur ve cep bellekteki verilerin tutarlılığı için cep bellek bir cep tutarlılık protokolü (=cache coherence protocol) uygular. Intel <b>MESIF </b>protokolünü uygularken, AMD <b>MOESI </b>protokolünü uygular. <b>Java</b>'da uygulama geliştirirken nesnelerin paylaşılan alanlarını <b>volatile </b>tanımlarız. Burada amaç bir iplik tarafından <b>volatile </b>tanımlı alan üzerinde yapılan değişikliklerin, diğer iplikler tarafından görünür olmasını sağlamaktır. </span></span><span style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;">Ancak bu noktada <i><b>yanıltıcı paylaşım</b></i> (=<b><i>false sharing</i></b>) olarak adlandırılan bir problem ortaya çıkar. Önce problemi anlamaya çalışalım. <b>SharedClass </b>tipinden bir nesnenin <i><b>x</b></i> ve <i><b>y</b></i> üyeleri iki farklı çekirdekte çalışan iki iplik (<i><b>t1</b></i> ve <b><i>t2</i></b>) tarafından okunmak ve değiştirilmek amacıyla erişilmektedir. </span></span><br />
<br />
<div style="background: rgb(255, 255, 255); border: solid gray; overflow: auto; padding: 0.2em 0.6em; text-align: start; width: auto;">
<pre style="line-height: 16.25px;"><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">SharedClass</span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">int</span> x<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">int</span> y<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<span style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"></span></span><br />
<div style="font-family: "Times New Roman";">
</div>
<span style="font-family: "times new roman";"><span style="font-family: "georgia" , "times new roman" , serif;">İpliklerden biri (<b><i>t1</i></b>) <b><i>x</i></b>'i değiştirmeye çalışırken diğer iplik (<b><i>t2</i></b>) ise <i><b>y</b></i>'yi değiştirmeye çalışsın. Cep belleğine erişim birimi, <b><i>cep satırı</i></b> (=<i><b>cache line</b></i>) olarak adlandırılır. <i><b>x</b></i> ve <b><i>y</i></b> üyeleri cebin aynı satırında yer alır. Dolayısı ile <b><i>t1</i></b> ipliği <b><i>x</i></b>'i değiştirdiğinde, cep tutarlık protokolü </span></span><span style="font-family: "georgia" , "times new roman" , serif;">o cep satırını</span><span style="font-family: "georgia" , "times new roman" , serif;"> kirli olarak etiketler ve diğer cep ise cep satırını <b><i>geçirsiz kılar</i></b>. Bir sonraki okuma için <b><i>t2</i></b> ipliği ana belleğe gitmek zorundadır. Bu durumda <b><i>t2</i></b> ipliği okuma için beklemek zorundadır. Aynı durum <b><i>t2</i></b> ipliğinin <b><i>y</i></b>'yi değiştirmesi durumunda <b><i>t1</i></b> ipliği için geçerlidir. Her iki iplik de gerçekte ortak bir bellek gözüne erişmiyor olsalar da, biri birilerini bekletmek durumunda kalmaktadırlar. Bu durum uygulamanın başarımını düşürecektir, uygulama birim zamanda daha az iş çıkaracaktır.</span></div>
<span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;">Bu problemi çözmenin bir yolu, </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;"><i>x</i></b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> ve </span><i style="font-family: georgia, "times new roman", serif; text-align: justify;"><b>y</b></i><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> üyelerinin farklı cep satırlarında yer almalarını sağlamak olabilir. Cep satırı </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;">64 sekizli</b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> olan bir işlemci için </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;"><i>x</i></b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> ve </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;"><i>y</i></b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> arasına hiç kullanılmayacak ancak </span><i style="font-family: georgia, "times new roman", serif; text-align: justify;"><b>x</b></i><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> ve </span><i style="font-family: georgia, "times new roman", serif; text-align: justify;"><b>y</b></i><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> üyelerinin farklı cep satırlarında olmalarını sağlayacak dolgu değişkenleri tanımlanabilir:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">SharedClass</span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">int</span> x<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">long</span> p1<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">long</span> p2<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">long</span> p3<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">long</span> p4<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">long</span> p5<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">long</span> p6<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">long</span> p7<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">long</span> p8<span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">int</span> y<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki kod çalıştırıldığında bellekteki yerleşim aşağıdaki gibi gerçekleşmektedir:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">#</span> Running 64-bit HotSpot VM.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed oop with 0-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed klass with 3-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Objects are 8 bytes aligned.
<span style="color: #c65d09; font-weight: bold;">#</span> Field sizes by <span style="color: #007020;">type</span>: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #c65d09; font-weight: bold;">#</span> Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #888888;">com.example.jol.exercises.SharedClass object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 12 (object header) N/A</span>
<span style="color: #888888;"> 12 4 int SharedClass.x N/A</span>
<span style="color: #888888;"> 16 8 long SharedClass.p1 N/A</span>
<span style="color: #888888;"> 24 8 long SharedClass.p2 N/A</span>
<span style="color: #888888;"> 32 8 long SharedClass.p3 N/A</span>
<span style="color: #888888;"> 40 8 long SharedClass.p4 N/A</span>
<span style="color: #888888;"> 48 8 long SharedClass.p5 N/A</span>
<span style="color: #888888;"> 56 8 long SharedClass.p6 N/A</span>
<span style="color: #888888;"> 64 8 long SharedClass.p7 N/A</span>
<span style="color: #888888;"> 72 8 long SharedClass.p8 N/A</span>
<span style="color: #888888;"> 80 4 int SharedClass.y N/A</span>
<span style="color: #888888;"> 84 4 (loss due to the next object alignment)</span>
<span style="color: #888888;">Instance size: 88 bytes</span>
<span style="color: #888888;">Space losses: 0 bytes internal + 4 bytes external = 4 bytes total</span>
</pre>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Şimdi <b><i>x</i></b> ve <b><i>y</i></b> değişkenleri farklı cep satırlarına yerleşmiş gözüküyor. Ancak bu çözümün farklı <b>JSM</b>'ler için çalışacağının bir garantisi bulunmuyor. Daha önce çalıştığımız gibi farklı <b>JSM</b>'ler sınıfın bu üyelerini belleğe farklı sıralarda dizebilir. Üstelik <b>JSM</b>'nin sınıfa eklediğimiz ve uygulama içinde hiç kullanılmayan bu dolgu değişkenlerini fark etmesi uzun sürmeyecektir ve <b>JSM</b> bu hiç kullanılmayacak dolgu değişkenlerini belleğe yerleştirmeyebilir! </span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Java 8</b>'de bu problemi çözmek üzere <b>@Contended</b> notu geldi. Bu notu <b>yanıltıcı paylaşım</b> problemine neden olan alanlara düşüyoruz:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">jol</span><span style="color: #333333;">.</span><span style="color: #0000cc;">exercises</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.info.ClassLayout</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.openjdk.jol.vm.VM</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">sun.misc.Contended</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Exercise6</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>VM<span style="color: #333333;">.</span><span style="color: #0000cc;">current</span><span style="color: #333333;">().</span><span style="color: #0000cc;">details</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>ClassLayout<span style="color: #333333;">.</span><span style="color: #0000cc;">parseClass</span><span style="color: #333333;">(</span>SharedClass<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">).</span><span style="color: #0000cc;">toPrintable</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">SharedClass</span> <span style="color: #333333;">{</span>
<span style="color: #555555; font-weight: bold;">@Contended</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"group1"</span><span style="color: #333333;">)</span>
<span style="color: #333399; font-weight: bold;">int</span> x<span style="color: #333333;">;</span>
<span style="color: #555555; font-weight: bold;">@Contended</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"group2"</span><span style="color: #333333;">)</span>
<span style="color: #333399; font-weight: bold;">int</span> y<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki kod <b>-XX:-RestrictContended</b> parametresi ile çalıştırılırsa <b>SharedClass </b>sınıfı üyelerinin belleğe yerleşimi aşağıdaki gibi gerçekleşiyor:</span></div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #c65d09; font-weight: bold;">#</span> Running 64-bit HotSpot VM.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed oop with 0-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Using compressed klass with 3-bit shift.
<span style="color: #c65d09; font-weight: bold;">#</span> Objects are 8 bytes aligned.
<span style="color: #c65d09; font-weight: bold;">#</span> Field sizes by <span style="color: #007020;">type</span>: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #c65d09; font-weight: bold;">#</span> Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 <span style="color: #333333;">[</span>bytes<span style="color: #333333;">]</span>
<span style="color: #888888;">com.example.jol.exercises.SharedClass object internals:</span>
<span style="color: #888888;"> OFFSET SIZE TYPE DESCRIPTION VALUE</span>
<span style="color: #888888;"> 0 12 (object header) N/A</span>
<span style="color: #888888;"> 12 128 (alignment/padding gap) </span>
<span style="color: #888888;"> 140 4 int SharedClass.x N/A</span>
<span style="color: #888888;"> 144 128 (alignment/padding gap) </span>
<span style="color: #888888;"> 272 4 int SharedClass.y N/A</span>
<span style="color: #888888;"> 276 4 (loss due to the next object alignment)</span>
<span style="color: #888888;">Instance size: 280 bytes</span>
<span style="color: #888888;">Space losses: 256 bytes internal + 4 bytes external = 260 bytes total</span>
</pre>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif;">Şimdi <b>Hotspot</b>, <b><i>x</i></b> ve <b><i>y</i></b> arasına <b><i>cep satırının iki katı</i></b> büyüklüğünde bir dolgu yerleştirdi. Nesnenin bellekte kapladığı alan <b><i>260 sekizliğe</i></b> yükseldi! Bu ödenen yüksek bedele karşılık <i><b>yanıltıcı paylaşım</b></i> problemini çözdük!</span></div>
Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com2tag:blogger.com,1999:blog-2756890279096274314.post-53575639879526224512017-07-24T22:21:00.000+03:002017-07-26T07:21:17.545+03:00Java'da Arayüz Kullanımı<div style="text-align: justify;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlengppg43ljIUxfBPBHsShhs4iJAYWsaViCUE-Sol8TwFTP5HUWX12arPKddtb-CsqqItUqmfYgZkBZk6FX44DAXxS4tL9GUUFLIw5vDt8-a2DJm8KlMch-Upn5AKw9-NO2SnK6-cVdXJ/s1600/java-interfaces.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="458" data-original-width="450" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlengppg43ljIUxfBPBHsShhs4iJAYWsaViCUE-Sol8TwFTP5HUWX12arPKddtb-CsqqItUqmfYgZkBZk6FX44DAXxS4tL9GUUFLIw5vDt8-a2DJm8KlMch-Upn5AKw9-NO2SnK6-cVdXJ/s200/java-interfaces.png" width="195" /></a></div><span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>Java</b>,<b> </b><i><b>Nesneye Dayalı</b></i> bir programlama dilidir. <b><i>Nesneye Dayalı Programlama</i></b> yaklaşımının tüm gerekliliklerini yerine getirir. <b>Java </b>programlama dilinde sınıf tanımlayabilirsiniz. Tanımladığınız bu sınıflarda öz nitelik ve fonksiyon ekleyerek, sınıfın durağan ve devingen davranışını modelleyebilirsiniz. Sınıflar çözümümüzün temel yapı taşlarıdır. Ama sınıflar tek başlarına yeterli değildir. Çalışma zamanında bu sınıflardan yaratacağınız nesneler ve bu nesnelere belirli bir düzene göre göndereceğiniz mesajlar ile çözüme ulaşırsınız. Her sınıfın belirli bir türde hizmet vermesi, belirli bir konuda uzmanlaşması ve böylelikle çözüme katkı vermesi arzu edilir. Bir nesneye bir mesaj göndererek, onun bir metodunu çağırarak aslında sınıfın verdiği bu hizmetten yararlanıyoruz. Gerçekte, uygulama programımız yürütme zamanında, çözüm için ihtiyacı olan türlerde nesneler yaratır ve bu nesnelere işleri ihale eder ve bir </span><span style="font-family: "georgia" , "times new roman" , serif;">orkestra şefi gibi </span><span style="font-family: "georgia" , "times new roman" , serif;">nesneleri aralarında uyumlu çalışacak şekilde yönetir. </span><span style="font-family: "georgia" , "times new roman" , serif;">Bu uyumun bozulmaması için nesnelerin iç çalışma şekillerini dışarıdan gizlemesini tercih ederiz. Bunun için ise nesnelerin durumuna doğrudan erişimi engelleriz. Buna </span><i style="font-family: georgia, "times new roman", serif;"><b>veri gizleme</b></i><span style="font-family: "georgia" , "times new roman" , serif;"> ilkesi diyoruz. <b>Java</b>'da sınıfa üye tanıtırken kullandığımız </span><b style="font-family: georgia, "times new roman", serif;">private</b><span style="font-family: "georgia" , "times new roman" , serif;"> ve </span><b style="font-family: georgia, "times new roman", serif;">protected</b><span style="font-family: "georgia" , "times new roman" , serif;"> erişim denetim sözcükleri tam olarak bu işe yarıyor. Bu durumda nesnenin durumunun bozulması ancak </span><b style="font-family: georgia, "times new roman", serif;">public</b><span style="font-family: "georgia" , "times new roman" , serif;"> tanımlı fonksiyonları aracılığı ile olabilir. Neyse ki birim testi yazıyoruz. Birim ve tümleştirme testleri hızlıca bu tür hatalı durumları yakalamamızı sağlar. Birim testi yazmıyorsanız, kullandığınız geliştirme aracının hata ayıklama aracı ile karşı karşıya kalırsınız. Eğer hata ayıklama aracını kullanmakta hünerli iseniz muhtemelen birim testi yazmıyorsunuz demektir. İşiniz bu durumda çok zor! Büyüyen bir kodda hata ayıklama oturumları saatlerinizi alabilir ve üstelik size katacağı hiç bir artı değer yoktur. Birim testi yazınız! Üstelik <b>veri gizleme</b> ilkesini uygulamak, birim testi yazmayı kolaylaştırır, sınıfın test edilebilirliğini artırır. Sınıfları kabaca iki gruba ayırabiliriz: <b><i>alan sınıfları</i></b> ve <b><i>çözüm sınıfları</i></b>. Alan sınıfları çözümü ile ilgilendiğimiz problemin var olduğu dünyayı modellemek için oluşturulurlar. Çözüm sınıfları ise problemin tanımlandığı uzayda var olmayan, sırf çözümü oluşturmak için kafamızda yarattığımız soyut sınıflardır. Buradaki soyut kelimesini <b>Java</b>'da </span><b style="font-family: georgia, "times new roman", serif;">abstract</b><span style="font-family: "georgia" , "times new roman" , serif;"> anahtar kelimesi ve nesneye dayalı programlamadaki soyut sınıflar ile karıştırmamak gerekir. </span></div><br />
<div style="text-align: justify;"><div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;">Nesneye dayalı programlamada diğer bir araç <b>kalıtımdır</b>. Sınıflar arasında çeşitli türden ilişkiler kurmak mümkündür. Kalıtım ve içerme ilişkisi en sık kullandığımız türden ilişkilerdir. <b>Kod tekrarını engellemek</b> ve daha çok alan sınıfları arasında kullanmak üzere kalıtımdan faydalanıyoruz. Kalıtım ile temel sınıfın tüm özellikleri türetilen sınıfa aktarılmaktadır. Türetilmiş sınıfta, o sınıfa özel yeni özellikler ekleyebiliyoruz ve ayrıca temel sınıfın değiştirmek istediğimiz davranışını yeniden tanımlıyabiliyoruz (=overriding). </span><span style="font-family: "georgia" , "times new roman" , serif;"><b>İçerme</b> ilişkisinde ise bir sınıf üye olarak başka bir sınıftan referans içerir. İçeren sınıf, bu referansı alt bir işi nesneye <b>ihale etmek</b> amacıyla kullanır. <i><b>İçerme ilişkisini daha çok çözüm sınıflarında kullanmayı tercih ediyoruz</b></i>.</span><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;"> </span></span></div><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></span> <span style="font-family: "georgia" , "times new roman" , serif;">Aşağıda verilen kodda yer alan bir alan sınıfı (<b>User</b>) üzerinden bu ilişkilerin örneklerini görmeye çalışalım:</span></div><br />
<b><span style="font-family: "georgia" , "times new roman" , serif;"><u>Gender.java</u>:</span></b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">entity</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">enum</span> Gender <span style="color: #333333;">{</span>
MALE<span style="color: #333333;">,</span> FEMALE<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
</pre></div><span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <b><span style="font-family: "georgia" , "times new roman" , serif;"><u>Phone.java</u>:</span></b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">entity</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">javax.persistence.Embeddable</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> * Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #555555; font-weight: bold;">@Embeddable</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Phone</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> String number<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Phone</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Phone</span><span style="color: #333333;">(</span>String number<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">number</span> <span style="color: #333333;">=</span> number<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">getNumber</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> number<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setNumber</span><span style="color: #333333;">(</span>String number<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">number</span> <span style="color: #333333;">=</span> number<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">toString</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="background-color: #fff0f0;">"Phone{"</span> <span style="color: #333333;">+</span>
<span style="background-color: #fff0f0;">"number='"</span> <span style="color: #333333;">+</span> number <span style="color: #333333;">+</span> <span style="color: #0044dd;">'\''</span> <span style="color: #333333;">+</span>
<span style="color: #0044dd;">'}'</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre></div><b><span style="font-family: "arial" , "helvetica" , sans-serif;"><br />
</span></b> <b><span style="font-family: "georgia" , "times new roman" , serif;"><u>AbstractEntity.java</u>:</span></b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">entity</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.fasterxml.jackson.annotation.JsonIgnore</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.springframework.data.annotation.CreatedDate</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.springframework.data.annotation.LastModifiedDate</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.springframework.data.jpa.domain.support.AuditingEntityListener</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">javax.persistence.*</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.time.LocalDateTime</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #555555; font-weight: bold;">@MappedSuperclass</span>
<span style="color: #555555; font-weight: bold;">@EntityListeners</span><span style="color: #333333;">(</span>AuditingEntityListener<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">)</span>
<span style="color: #008800; font-weight: bold;">public</span> abstract <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">AbstractEntity</span> <span style="color: #333333;">{</span>
<span style="color: #555555; font-weight: bold;">@Id</span>
<span style="color: #555555; font-weight: bold;">@GeneratedValue</span><span style="color: #333333;">(</span>strategy <span style="color: #333333;">=</span> GenerationType<span style="color: #333333;">.</span><span style="color: #0000cc;">IDENTITY</span><span style="color: #333333;">)</span>
<span style="color: #008800; font-weight: bold;">private</span> Long id<span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> * For auditing purposes</span>
<span style="color: #888888;"> */</span>
<span style="color: #555555; font-weight: bold;">@CreatedDate</span>
<span style="color: #555555; font-weight: bold;">@JsonIgnore</span>
<span style="color: #008800; font-weight: bold;">private</span> LocalDateTime createdDate<span style="color: #333333;">;</span>
<span style="color: #555555; font-weight: bold;">@JsonIgnore</span>
<span style="color: #555555; font-weight: bold;">@LastModifiedDate</span>
<span style="color: #008800; font-weight: bold;">private</span> LocalDateTime lastModifiedDate<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">AbstractEntity</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #333333;">}</span>
<span style="color: #888888;">// getters and setters</span>
<span style="color: #888888;">// equals and hashCode</span>
<span style="color: #333333;">}</span>
</pre></div><b><span style="font-family: "arial" , "helvetica" , sans-serif;"><br />
</span></b> <b><span style="font-family: "georgia" , "times new roman" , serif;"><u>User.java</u>:</span></b><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">entity</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.validation.Email</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.validation.TcKimlikNo</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.springframework.security.core.GrantedAuthority</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.springframework.security.core.userdetails.UserDetails</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">javax.persistence.*</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.Collection</span><span style="color: #333333;">;</span>
<span style="color: #555555; font-weight: bold;">@Entity</span>
<span style="color: #555555; font-weight: bold;">@Table</span><span style="color: #333333;">(</span>name <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"users"</span><span style="color: #333333;">)</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">User</span> <span style="color: #008800; font-weight: bold;">extends</span> AbstractEntity <span style="color: #008800; font-weight: bold;">implements</span> UserDetails <span style="color: #333333;">{</span>
<span style="color: #555555; font-weight: bold;">@TcKimlikNo</span>
<span style="color: #008800; font-weight: bold;">private</span> String identityNo<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String firstName<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String lastName<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String company<span style="color: #333333;">;</span>
<span style="color: #555555; font-weight: bold;">@Column</span><span style="color: #333333;">(</span>columnDefinition <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"varchar(1024)"</span><span style="color: #333333;">)</span>
<span style="color: #008800; font-weight: bold;">private</span> String description<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String title<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String password<span style="color: #333333;">;</span>
<span style="color: #555555; font-weight: bold;">@Email</span>
<span style="color: #008800; font-weight: bold;">private</span> String email<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> String address<span style="color: #333333;">;</span>
<span style="color: #555555; font-weight: bold;">@Embedded</span>
<span style="color: #555555; font-weight: bold;">@AttributeOverrides</span><span style="color: #333333;">({</span>
<span style="color: #555555; font-weight: bold;">@AttributeOverride</span><span style="color: #333333;">(</span>name <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"number"</span><span style="color: #333333;">,</span> column <span style="color: #333333;">=</span> <span style="color: #555555; font-weight: bold;">@Column</span><span style="color: #333333;">(</span>name <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"gsm_phone"</span><span style="color: #333333;">))</span>
<span style="color: #333333;">})</span>
<span style="color: #008800; font-weight: bold;">private</span> Phone gsmPhone<span style="color: #333333;">;</span>
<span style="color: #555555; font-weight: bold;">@Embedded</span>
<span style="color: #555555; font-weight: bold;">@AttributeOverrides</span><span style="color: #333333;">({</span>
<span style="color: #555555; font-weight: bold;">@AttributeOverride</span><span style="color: #333333;">(</span>name <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"number"</span><span style="color: #333333;">,</span> column <span style="color: #333333;">=</span> <span style="color: #555555; font-weight: bold;">@Column</span><span style="color: #333333;">(</span>name <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">"office_phone"</span><span style="color: #333333;">))</span>
<span style="color: #333333;">})</span>
<span style="color: #008800; font-weight: bold;">private</span> Phone officePhone<span style="color: #333333;">;</span>
<span style="color: #555555; font-weight: bold;">@Enumerated</span><span style="color: #333333;">(</span>EnumType<span style="color: #333333;">.</span><span style="color: #0000cc;">ORDINAL</span><span style="color: #333333;">)</span>
<span style="color: #008800; font-weight: bold;">private</span> Gender gender<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> Boolean deleted<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> Boolean suspended<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">User</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #333333;">}</span>
<span style="color: #888888;">// getters and setters</span>
<span style="color: #888888;">// hashCode and equals</span>
<span style="color: #888888;">// toString</span>
<span style="color: #333333;">}</span>
</pre></div><br />
<div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;">Alan sınıfı olan </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">User</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> sınıfını kalıcı olmasını istediğimiz bir sınıf olarak tanımladık. Tüm kalıcılık sınıflarında, her zaman var olmasını istediğimiz, nesnenin kimliğini tanımlayan </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">Long</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> tipinde bir alan yer alıyor. <i>Denetim</i> (=<i>auditing</i>) amacıyla kalıcı olmasını istediğimiz her nesnenin ne zaman yaratıldığı ve en son ne zaman güncellendiği bilgilerini de oluşturmak ve kalıcı hale getirmek istiyoruz. Bu alanları tüm kalıcılık sınıflarında </span><b style="font-family: Georgia, "Times New Roman", serif;"><i>tekrarlamamak</i></b><span style="font-family: "georgia" , "times new roman" , serif;"> amacıyla soyut bir temel sınıf (</span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">AbstractEntity</span></b><span style="font-family: "georgia" , "times new roman" , serif;">) oluşturduk ve tüm kalıcılık sınıflarını bu sınıftan türettik. Ayrıca </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">User</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> sınıfı </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">Gender</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> ve </span><span style="font-family: "arial" , "helvetica" , sans-serif;"><b>Phone</b></span><span style="font-family: "georgia" , "times new roman" , serif;"> tiplerinden (kavramlarından) birer üye içeriyor. </span></span></div><br />
<div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"><b>Çok şekillik</b>, Nesneye Dayalı Programlamanın en önemli mekanizmasıdır. Çok şekillilik için aşağıdaki üç özelliğin sağlanması gerekir:</span></div><ol><li style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;">Aralarında kalıtım ilişkisi olan sınıflar,</span></li>
<span style="font-family: "georgia" , "times new roman" , serif;">
<li style="text-align: justify;">Bu sınıflarda yer alan çok şekilli metodlar,</li>
<li style="text-align: justify;">Bu sınıflar arasında en temel sınıfından tanımlanmış bir referans.</li>
</span></ol><div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;">Bu referansı kullanarak yapılan tüm çağrılar, yürütme zamanında bağlanır ve dinamik bağlama olarak adlandırılır. Çok şekillilik için gerekli olan birinci koşul çoğu zaman doğal olarak oluşur ancak bazen nadir de olsa oluşmaz. Örneğin <b>Bird</b>, <b>Airplane</b>, <b>UFO </b>(Unidentified Funny Objects) ve <b>Superman </b>sınıfları arasında kalıtım ilişkisi yoktur. Örneğin <b>Bird</b>, <b>Airplane </b>değildir, <b>Superman</b>, <b>UFO</b> değildir. Ancak bu dört sınıfta da ortak bir davranış vardır: <b>fly()</b>. <b>fly()</b> metodu <b>çok şekilli</b> bir metoddur. Ancak çok şekilli bir metodun varlığı, sınıflar arasında kalıtım ilişkisi kurulamadığı için çok şekillilik için yeterli olmaz. Sadece çok şekilliliği kurabilmek için gerçek dünyada olmayan bir sınıf <b>uydurulur</b>. Bu sınıf <b>FlyingObject </b>olsun. Şimdi problem uzayımızdaki tüm sınıflar (<b>Bird</b>, <b>Airplane</b>, <b>UFO </b>ve <b>Superman</b>) <b><i>uydurulan</i></b> bu </span><b style="font-family: georgia, "times new roman", serif;">FlyingObject </b><span style="font-family: "georgia" , "times new roman" , serif;">sınıfından türetilir. Bu sınıfın gerçek dünyada olmayan, sırf çok şekillilik için kafamızdan "</span><i style="font-family: georgia, "times new roman", serif;">uydurduğumuz</i><span style="font-family: "georgia" , "times new roman" , serif;">" bir sınıf olduğunu betimlemek üzere sınıfı </span><b style="font-family: georgia, "times new roman", serif;">soyut sınıf</b><span style="font-family: "georgia" , "times new roman" , serif;"> olarak adlandırıyoruz. </span><b style="font-family: georgia, "times new roman", serif;">Java</b><span style="font-family: "georgia" , "times new roman" , serif;">'da </span><i style="font-family: georgia, "times new roman", serif;">soyut sınıf</i><span style="font-family: "georgia" , "times new roman" , serif;"> tanımlaması </span><b style="font-family: georgia, "times new roman", serif;">abstract </b><span style="font-family: "georgia" , "times new roman" , serif;">anahtar kelimesi kullanılarak yapılır. </span><i style="font-family: georgia, "times new roman", serif;">Soyut bir sınıfın</i><span style="font-family: "georgia" , "times new roman" , serif;"> içinde en az bir tane </span><i style="font-family: georgia, "times new roman", serif;">soyut metod</i><span style="font-family: "georgia" , "times new roman" , serif;"> olması beklenir. </span><i style="font-family: georgia, "times new roman", serif;">Soyut metod</i><span style="font-family: "georgia" , "times new roman" , serif;"> </span><b style="font-family: georgia, "times new roman", serif;">abstract</b><span style="font-family: "georgia" , "times new roman" , serif;"> anahtar kelimesi ile tanımlanır.</span></div><div><br />
<div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"><b>Java</b> <i>tekli kalıtımı</i> destekliyor. Somut bir sınıf sadece tek bir sınıftan türetilebilir. Somut sınıftan, <b>new </b>operatörünü kullanarak örneğini yaratabileceğimiz sınıfları anlıyoruz. Buna göre <b>User </b>sınıfı somut bir sınıftır. Ancak gerçek dünyada bazen çoklu kalıtım durumları ile karşılaşıyoruz. <i><b>Java </b>çoklu kalıtımı başka bir mekanizma ele alıyor:</i> <b>interface</b>. Bir sınıf sadece tek bir sınıftan türetilebilirken (<b>extends</b>) birden fazla arayüzü gerçekleyebilir (<b>implements</b>). Soyut sınıftan nesne yaratamıyor olsak da soyut bir sınıfın verisi ve kurucu metodu bulunabilir. Soyut bir sınıf başka bir soyut sınıftan türetilebilir. Bu durumda soyut sınıfın soyut metodlarına işlev yüklemesi gerekmez. Soyut bir sınıf bir arayüzü gerçekleyecek ise onun metodlarına işlev yüklemek zorunda değildir. Bu durumda arayüzün metodları soyut sınıfın soyut metodlarına dönüşür. Soyut sınıfın somut metodları olabilir. Somut metod gövdesini kıvırcık parantez kullanarak verdiğimiz, gerçek dünyada örneği ile karşılaşabildiğimiz ve bunun bir sonucu olarak da modelleyebildiğimiz metodlardır. <b>Java </b>arayüzleri özel bir tür soyut sınıftır. Arayüzlerin verisi, kurucusu, somut metodu olamaz:</span></div><div dir="ltr" style="background-color: white; color: #666666; font-size: 13.2px; line-height: 1.2375; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="color: #008200; font-family: "georgia" , "times new roman" , serif; font-size: 16px; font-style: italic; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"> </span><br />
<div style="text-align: center;"><span style="color: #840000; font-family: "georgia" , "times new roman" , serif; font-size: 16px; font-style: italic; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Arayüz </span><span style="font-family: "georgia" , "times new roman" , serif; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;">= </span><span style="color: #008200; font-family: "georgia" , "times new roman" , serif; font-size: 16px; font-style: italic; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Soyut Sınıf</span><span style="font-family: "georgia" , "times new roman" , serif; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;"> - </span><span style="color: #e36c0a; font-family: "georgia" , "times new roman" , serif; font-size: 16px; font-style: italic; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Kurucu</span><span style="font-family: "georgia" , "times new roman" , serif; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;"> - </span><span style="color: #5f497a; font-family: "georgia" , "times new roman" , serif; font-size: 16px; font-style: italic; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Veri</span><span style="font-family: "georgia" , "times new roman" , serif; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;"> - </span><span style="color: #0070c0; font-family: "georgia" , "times new roman" , serif; font-size: 16px; font-style: italic; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Somut Metod</span></div><span style="color: #0070c0; font-family: "georgia" , "times new roman" , serif; font-size: 16px; font-style: italic; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"> </span></div><div style="background-color: white; line-height: 1.2375; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"><span id="docs-internal-guid-6ef629da-ee6c-e23e-ad61-60d6277e84d2"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="vertical-align: baseline; white-space: pre-wrap;"><b>Java 8</b>'e kadar arayüzün tüm metodları soyut olmak zorundaydı. B</span></span></span><span style="vertical-align: baseline; white-space: pre-wrap;">u soyut metodlar </span><b style="white-space: pre-wrap;">Java 9</b><span style="white-space: pre-wrap;">'a kadar da</span><span style="vertical-align: baseline; white-space: pre-wrap;"> </span><span style="font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">public</span><span style="vertical-align: baseline; white-space: pre-wrap;"> tanımlı olmak zorundaydı. Arayüz metodları hem </span><span style="font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">public</span><span style="vertical-align: baseline; white-space: pre-wrap;"> hem de </span><span style="font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">abstract</span><span style="vertical-align: baseline; white-space: pre-wrap;"> tanımlı olmak zorunda oldukları için tanımlanırken bunun açık olarak belirtilmesi gerekmez. Örtük olarak </span><span style="font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">public</span><span style="vertical-align: baseline; white-space: pre-wrap;"> ve </span><span style="font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">abstract</span><span style="vertical-align: baseline; white-space: pre-wrap;"> olduğu kabul edilir. <b>Java 8</b> ile birlikte arayüzlere somut </span><span style="vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><b>default</b></span></span><span style="vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: "georgia" , "times new roman" , serif;"> tanımlı somut metodlar yazabiliyoruz. Aynı soyut sınıflarda olduğu gibi. Arayüzlerin kurucu fonksiyonları olamaz, soyut sınıfların kurucu fonksiyonları olabilir. Hem soyut sınıftan hem de arayüzden nesne yaratamazsınız. Arayüzlerin sadece örtük olarak </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">public</span></b><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;"> </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">static</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> </span><span style="font-family: "arial" , "helvetica" , sans-serif;"><b>final</b></span><span style="font-family: "georgia" , "times new roman" , serif;"> olarak tanımlı olmak zorunda olan sabitleri olabilir:</span></span></span></span></div><div style="font-size: 13.2px;"><span style="font-size: 16px; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;"> </span></span></span></div></div><div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">java8</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">A</span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">int</span> x <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">42</span><span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">fun</span><span style="color: #333333;">()</span> <span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
</pre></div><br />
<div style="text-align: justify;"><span style="font-family: "arial" , "helvetica" , sans-serif;"><b>A</b></span><span style="font-family: "georgia" , "times new roman" , serif;"> sınıfında </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">fun()</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> metodu örtük olarak hem </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">public</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> hem de </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">abstract</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> tanımlıdır. Benzer şekilde </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">x</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> değişkeni de örtük olarak </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">public static final</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> olarak tanımlıdır. Bunu istersek açık olarak da yazabiliriz:</span></div><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">java8</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">abstract</span> <span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">A</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> <span style="color: #333399; font-weight: bold;">int</span> x <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">42</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">abstract</span> <span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">fun</span><span style="color: #333333;">()</span> <span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
</pre></div><span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Şimdi </span><span style="font-family: "arial" , "helvetica" , sans-serif;"><b>B</b></span><span style="font-family: "georgia" , "times new roman" , serif;"> isimli bir arayüz tanımlayalım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">java8</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">B</span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">int</span> x<span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">108</span><span style="color: #333333;">;</span>
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">gun</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
</pre></div><b><span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></b> <b><span style="font-family: "arial" , "helvetica" , sans-serif;">B</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> arayüzünde özel bir durum yok. </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">A</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> arayüzü ile herhangi bir bağlantısı bulunmuyor. Belki hem </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">A</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> hem de </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">B</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> arayüzlerinde aynı isimli bir sabit bulunuyor. Aralarında herhangi bir ilişki bulunmadığı ve bağımsız arayüzler olduğu için bu durum bizi şimdilik pek rahatsız etmedi. Şimdi </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">A</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> ve </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">B</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> arayüzlerinden kalıtımla yeni bir arayüz tanımlayalım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">java8</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">C</span> <span style="color: #008800; font-weight: bold;">extends</span> A<span style="color: #333333;">,</span>B<span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">run</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
</pre></div><span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki kod derleyici tarafından sorunsuz bir şekilde derlenir. Hala bir sorun gözükmüyor. Şimdi </span><span style="font-family: "arial" , "helvetica" , sans-serif;"><b>C</b></span><span style="font-family: "georgia" , "times new roman" , serif;"> arayüzünü gerçekleyen somut bir sınıf </span><b style="font-family: Arial, Helvetica, sans-serif;">CC </b><span style="font-family: "georgia" , "times new roman" , serif;">oluşturalım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">java8</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">CC</span> <span style="color: #008800; font-weight: bold;">implements</span> C <span style="color: #333333;">{</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">run</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>x<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">gun</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>A<span style="color: #333333;">.</span><span style="color: #0000cc;">x</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">fun</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>B<span style="color: #333333;">.</span><span style="color: #0000cc;">x</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre></div><span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki kodda </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">run()</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> metodunda </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">x</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> etiketli değişkene erişilmeye çalışılıyor. Ama şimdi bir problemimiz var: Geliştirici </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">A</span></b><span style="font-family: "georgia" , "times new roman" , serif;">'daki </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">x</span></b><span style="font-family: "georgia" , "times new roman" , serif;">'e mi erişmek istiyor yoksa </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">B</span></b><span style="font-family: "georgia" , "times new roman" , serif;">'deki </span><b><span style="font-family: "arial" , "helvetica" , sans-serif;">x</span></b><span style="font-family: "georgia" , "times new roman" , serif;">'e mi erişmeye çalışıyor? Derleyici ve kodu okuyan sizler de bunu bilemezsiniz! Derleyici bu nedenle bir belirsizlik hatası üretecektir:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #997700; font-weight: bold;">Error:</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">6</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">28</span><span style="color: #333333;">)</span> <span style="color: #997700; font-weight: bold;">java:</span> reference to x is ambiguous
both variable x in com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">java8</span><span style="color: #333333;">.</span><span style="color: #0000cc;">A</span> and variable x in com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">java8</span><span style="color: #333333;">.</span><span style="color: #0000cc;">B</span> match
</pre></div><br />
<div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;">Bu durumda geliştiricinin yapması gereken hamle, hangi sınıftaki </span><span style="font-family: "georgia" , "times new roman" , serif;"><b>x</b></span><span style="font-family: "georgia" , "times new roman" , serif;">'e eriştiğini </span><b style="font-family: Georgia, "Times New Roman", serif;"><span style="font-family: "arial" , "helvetica" , sans-serif;">A.x</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> ya da </span><b style="font-family: Georgia, "Times New Roman", serif;"><span style="font-family: "arial" , "helvetica" , sans-serif;">B.x</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> ifadesi ile derleyiciye bildirmesidir. </span></span></div><span style="font-family: "georgia" , "times new roman" , serif;"> </span><br />
<div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;">Bir soyut sınıf başka bir soyut sınıfı türetebilir. Bu durumda türetildiği soyut sınıfın soyut metodlarını gerçeklemez zorunda değildir. Ancak istenirse türetilen sınıftaki soyut metodun bir gerçeklemesi verilebilir. Bir soyut sınıf bir ya da daha fazla sayıda arayüzü gerçekleyebilir. Bu durumda soyut sınıfın arayüzlerdeki metodların bir gerçeklemesini vermek zorunda değildir. </span><span style="font-family: "georgia" , "times new roman" , serif;">Ancak istenirse arayüzlerdeki bazı soyut metodların gerçeklemesi verilebilir. Bir arayüz soyut sınıftan türetilemez. Arayüzler arasında kalıtım vardır.<b> Üstelik bu kalıtım çokludur. Bir arayüz birden fazla arayüzden türetilebilinir:</b></span></span></div><!-- Multiple Inheritance beyween interfaces --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">TransferService</span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">transfer</span><span style="color: #333333;">(</span>Account from<span style="color: #333333;">,</span>Account to<span style="color: #333333;">,</span><span style="color: #333399; font-weight: bold;">double</span> amount<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">CustomerService</span> <span style="color: #333333;">{</span>
Customer <span style="color: #0066bb; font-weight: bold;">createCustomer</span><span style="color: #333333;">(</span>String identityNo<span style="color: #333333;">,</span>String fullName<span style="color: #333333;">);</span>
Customer <span style="color: #0066bb; font-weight: bold;">getCustomer</span><span style="color: #333333;">(</span>String identityNo<span style="color: #333333;">);</span>
Set<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">getAllIdentities</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">ReportService</span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">report</span><span style="color: #333333;">(</span>Locale locale<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">BankService</span> <span style="color: #008800; font-weight: bold;">extends</span> TransferService<span style="color: #333333;">,</span> CustomerService<span style="color: #333333;">,</span> ReportService <span style="color: #333333;">{</span>
String <span style="color: #0066bb; font-weight: bold;">getName</span><span style="color: #333333;">();</span>
<span style="color: #333399; font-weight: bold;">long</span> <span style="color: #0066bb; font-weight: bold;">getId</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
</pre></div><br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyQV5-jFePsIA308bv7-PPmv5t8T7YlHaKuqmW2Sho9M6p9-XGTadSr4O9aHbq61gSn7I2xB6VQaGfaQN_emj68bP7rkf-OYul2CISwA5mluLhYyEtdl517fMGcqdp-p2pL-r7_j0tJRin/s1600/interface-multiplei-inheritance-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="532" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyQV5-jFePsIA308bv7-PPmv5t8T7YlHaKuqmW2Sho9M6p9-XGTadSr4O9aHbq61gSn7I2xB6VQaGfaQN_emj68bP7rkf-OYul2CISwA5mluLhYyEtdl517fMGcqdp-p2pL-r7_j0tJRin/s640/interface-multiplei-inheritance-2.png" width="640" /></a></div><br />
<div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;">Burada <i><b>BankService</b></i> üç ayrı arayüzden türetilmektedir: <i><b>TransferService</b></i>, <i><b>ReportService</b></i> ve <i><b>CustomerService</b></i>. Soyut sınıf arayüzü gerçekleyebilir. Bu durumda <i><b>BankBase</b></i> örneğinde olduğu gibi arayüzün tüm metodlarını gerçeklemek zorunda değildir. <b><i>SimpleBank</i></b> ve <b><i>BankBase</i></b> örneğinde olduğu gibi soyut bir sınıf başka bir soyut sınıftan türetilebilinir. Arayüz metodları <b>final</b> tanımlanamaz.</span></div><br />
<div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;">Arayüzleri birer sözleşme olarak düşünebiliriz. Tasarım ilkesi olarak, çözüm sınıfları verdikleri hizmeti her zaman bir arayüz üzerinden, bir sözleşme üzerinden dışarıya açmalıdırlar. Hizmet alan sınıflar, hizmet aldıkları sınıfı değil, hizmetin arayüzünü tanımalıdırlar, sözleşmenin detaylarını bilmelidirler. Böylelikle hizmet alan ve hizmet veren sınıf arasında gevşek bir bağ kurmuş oluyoruz. Bu kurulan gevşek bağ sayesinde yazılımdaki değişiklikleri yönetmek mümkün olabilir. Bu anlamda kalıtım iki sınıf arasında sıkı bir bağ kurulmasına neden olur. Bu nedenle çözüm sınıflarında kalıtımı tercih etmiyoruz.</span></div><div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;">Tasarımda diğer bir ilke değişecek özellikler ile değişmeyecek özellikleri bir birinden ayırmaktır. Arayüz içinde sözleşmenin değişmeyen maddeleri bulunuyor. Bu sözleşmenin maddelerini yerine getiren farklı çözümler olabilir. Gelecekte bu sözleşmeyi yerine getiren başka çözüm sınıfları ortaya çıkabilir. Yazılım yeni özelliklere açık olmalıdır. Ancak bu yenilikleri mevcut kodda değişiklik yapmadan gerçeklemeliyiz. Bu tasarım ilkesi <b>açıklık-kapalılık ilkesi</b> olarak adlandırılır: <i>yazılım yeniliklere açık</i>, <i>kod ise değişikliğe kapalı</i> olmalıdır. </span></div><div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"><b><i>Yukarıdaki ilkelerin gerçeklemesinde ağırlıklı olarak arayüzden yararlanıyoruz!</i></b></span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><i><br />
</i></b></span></div><span style="font-family: "georgia" , "times new roman" , serif; font-size: x-large;"><b>instanceof operatörü</b></span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br />
</b></span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>instanceof</b> operatörü, referans türünden bir değişkeninin gösterdiği nesnenin tipi ile ilgili sorgulama yapmak için kullanılır. Bu noktada soyut sınıf ile arayüz arasında derleyicinin davranışı açısından önemli bir fark bulunur:</span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74</pre></td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">abstract</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">BusinessService</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">abstract</span> <span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">logic</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> data<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">SimpleBusinessService</span> <span style="color: #008800; font-weight: bold;">extends</span> BusinessService <span style="color: #333333;">{</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">logic</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> data<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> data<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ValueAddedService</span> <span style="color: #008800; font-weight: bold;">extends</span> BusinessService <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> BusinessService delegate<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">ValueAddedService</span><span style="color: #333333;">(</span>BusinessService delegate<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">delegate</span> <span style="color: #333333;">=</span> delegate<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">logic</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> data<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> delegate<span style="color: #333333;">.</span><span style="color: #0000cc;">logic</span><span style="color: #333333;">(</span>data<span style="color: #333333;">)+</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ExtendedBusinessService</span> <span style="color: #008800; font-weight: bold;">extends</span> SimpleBusinessService <span style="color: #333333;">{</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">logic</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> data<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">super</span><span style="color: #333333;">.</span><span style="color: #0000cc;">logic</span><span style="color: #333333;">(</span>data<span style="color: #333333;">)+</span><span style="color: #0000dd; font-weight: bold;">42</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">OtherBusinessService</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">logic</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> data<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0000dd; font-weight: bold;">42</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">ui</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.Serializable</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.business.BusinessService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.business.ExtendedBusinessService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.business.OtherBusinessService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.business.SimpleBusinessService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.business.ValueAddedService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">BusinessApp</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
BusinessService aService<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ExtendedBusinessService<span style="color: #333333;">();</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>aService <span style="color: #008800; font-weight: bold;">instanceof</span> SimpleBusinessService<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>aService <span style="color: #008800; font-weight: bold;">instanceof</span> ExtendedBusinessService<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>aService <span style="color: #008800; font-weight: bold;">instanceof</span> ValueAddedService<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>aService <span style="color: #008800; font-weight: bold;">instanceof</span> OtherBusinessService<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre></td></tr>
</tbody></table></div><br />
<div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki kod parçasında </span><b style="font-family: georgia, "times new roman", serif;">BusinessService</b><span style="font-family: "georgia" , "times new roman" , serif;"> sınıfı </span><b><span style="color: #cc0000; font-family: "georgia" , "times new roman" , serif;">soyut bir sınıf</span></b><span style="font-family: "georgia" , "times new roman" , serif;"> ve </span><b style="font-family: georgia, "times new roman", serif;">SimpleBusinessService</b><span style="font-family: "georgia" , "times new roman" , serif;">, </span><b style="font-family: georgia, "times new roman", serif;">ValueAddedService</b><span style="font-family: "georgia" , "times new roman" , serif;"> ve </span><b style="font-family: georgia, "times new roman", serif;">ExtendedBusinessService</b><span style="font-family: "georgia" , "times new roman" , serif;"> sınıfları ise bu sınıftan türetilmiş somut sınıflar olarak tasarlanmışlardır. </span><b style="font-family: georgia, "times new roman", serif;">OtherBusinessService</b><span style="font-family: "georgia" , "times new roman" , serif;"> ise bu sınıflardan tamamen bağımsız bir sınıf olarak kodlanmıştır. Bu durumda <b>BusinessApp</b> uygulamasında <b>70. satır</b> için derleyici hata verecektir: </span></span></div><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;">Exception in thread <span style="background-color: #fff0f0;">"main"</span> java.lang.Error: Unresolved compilation problem:
Incompatible conditional operand types BusinessService and OtherBusinessService
at com.example.ui.BusinessApp.main<span style="color: #333333;">(</span>BusinessApp.java:18<span style="color: #333333;">)</span>
</pre></div><br />
<div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"></span><span style="font-family: "georgia" , "times new roman" , serif;">Derleyici eğer referans tipinden değişkenin tipi soyut ya da somut bir sınıf ise <b>instanceof</b> operatörünün sağ tarafındaki tip için statik bir analiz yapar ve <b>BusinessService</b> tipinden bir referansın hiç bir zaman <b>OtherBusinessService</b> tipinden bir nesneyi gösteremeyeceğini saptar. Ardından yukarıda verilen türde bir derleme hata iletisi üretir. Oysa <b>BusinessService</b> bir <i><b>arayüz</b></i> olarak tasarlanırsa derleyici bu statik analizi <b><i>gerçekleştirmeyecektir</i></b>:</span></div><!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">abstract</span> <span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">BusinessService</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">abstract</span> <span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">logic</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> data<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ExtendedBusinessService</span> <span style="color: #008800; font-weight: bold;">extends</span> SimpleBusinessService <span style="color: #333333;">{</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">logic</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> data<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">super</span><span style="color: #333333;">.</span><span style="color: #0000cc;">logic</span><span style="color: #333333;">(</span>data<span style="color: #333333;">)+</span><span style="color: #0000dd; font-weight: bold;">42</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">SimpleBusinessService</span> <span style="color: #008800; font-weight: bold;">implements</span> BusinessService <span style="color: #333333;">{</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">logic</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> data<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> data<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ValueAddedService</span> <span style="color: #008800; font-weight: bold;">implements</span> BusinessService <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> BusinessService delegate<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">ValueAddedService</span><span style="color: #333333;">(</span>BusinessService delegate<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">delegate</span> <span style="color: #333333;">=</span> delegate<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">logic</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> data<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> delegate<span style="color: #333333;">.</span><span style="color: #0000cc;">logic</span><span style="color: #333333;">(</span>data<span style="color: #333333;">)+</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">business</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">OtherBusinessService</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">logic</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> data<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #0000dd; font-weight: bold;">42</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">ui</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.Serializable</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.business.BusinessService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.business.ExtendedBusinessService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.business.OtherBusinessService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.business.SimpleBusinessService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.business.ValueAddedService</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">BusinessApp</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
BusinessService aService<span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ExtendedBusinessService<span style="color: #333333;">();</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>aService <span style="color: #008800; font-weight: bold;">instanceof</span> SimpleBusinessService<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>aService <span style="color: #008800; font-weight: bold;">instanceof</span> ExtendedBusinessService<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>aService <span style="color: #008800; font-weight: bold;">instanceof</span> ValueAddedService<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>aService <span style="color: #008800; font-weight: bold;">instanceof</span> OtherBusinessService<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre></div><br />
<span style="font-family: "georgia" , "times new roman" , serif;">Artık derleyici <b>System.out.println(<i><span style="color: #38761d;">aService</span> instanceof <span style="color: #cc0000;">OtherBusinessService</span></i>)</b> satırı için hata vermiyor! <b><i>instanceof</i></b> operatörünün sağ ya da sol tarafındaki tip bir arayüz ise hiç bir zaman derleyici hata üretmez. Örneğin, <b><i><span style="color: #990000;">x</span> <span style="color: #38761d;">instanceof </span><span style="color: #0b5394;">Comparable</span></i></b> ifadesi <b><span style="color: #990000;"><i>x</i></span></b> değişkeninin tipi ne olursa olsun her zaman derlenir.<br />
</span><br />
<span style="font-family: "georgia" , "times new roman" , serif; font-size: x-large;"><b>Java 8 ile Arayüzde Gelen Yenilikler</b></span><br />
<br />
<b style="font-family: georgia, "times new roman", serif; text-align: justify;">Java 8</b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> ile birlikte arayüz ile ilgili genel olarak </span><i style="font-family: georgia, "times new roman", serif; text-align: justify;"><b>fonksiyonel programlamaya</b></i><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> yönelik üç önemli değişiklik geldi:</span><br />
<br />
<div style="font-family: georgia, "times new roman", serif;"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;"><b>1. Fonksiyonel Arayüz</b></span></span></span></div> <br />
<div style="font-family: georgia, "times new roman", serif;"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;">İçinde herhangi bir metod içermeyen arayüzlere özel bir isim veriyoruz: <b><i>İşaretleyici Arayüz</i></b> (=<i><b>Marker Interface</b></i>). Bu gruba giren işaretleyici arayüzlere örnek olarak <b><i>Serializable</i></b>, <i>Cloneable </i>ve <i><b>Remote </b></i>arayüzlerini verebiliriz. Bu arayüzler <b>Java </b>programlama dilinin henüz <b>Java SE 5</b> ile gelen <b><i>Damgaların </i></b></span></span>(=<b><i>Annotations</i></b>) olmadığı ilk yılllarında kullanıldıklarını görüyoruz. Amaç sınıfı özel bir amaçla işaretlemek. Artık bir çerçeve ya da <b>API </b>geliştirirken <b>Java SE 5</b> ile gelen damgaları kullanıyoruz.</div><div style="font-family: georgia, "times new roman", serif;"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></span></span></div><div style="font-family: georgia, "times new roman", serif;"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;"><b>Java SE 8</b> ile birlikte gelen fonksiyonel programlama ile birlikte arayüzlere yönelik yeni bir gruplama geldiğini görüyoruz: <b><i>Fonksiyonel Arayüz</i></b> (=<i>Functional Interface</i>). Bir arayüzün Fonksiyonel arayüz olabilmesi için içinde sadece tek bir <b><i>public abstract</i></b> metod içermesi gerekir. static ve default tanımlı metodları bu sayının dışında tutuyoruz. Bu özelliği sağlayan bir arayüzü yine <b>Java SE 8</b> ile birlikte gelen <b>@FunctionInterface</b> notunu düşürek arayüzün bu özelliğini belirgin hale getirebiliriz.</span></span></span></div><div style="font-family: georgia, "times new roman", serif;"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></span></span></div><div style="font-family: georgia, "times new roman", serif;"><span style="font-family: "georgia" , "times new roman" , serif;">Java programlama dilinde Fonksiyonel arayüz niteliğinde Java'nın ilk yıllarından beri kullanıdığımız çok sayıda arayüz bulunuyor: <b><i>Runnable</i></b>, <i><b>Callable</b></i>, <i><b>Comparator</b></i>, <b><i>Comparable</i></b>, <b><i>ActionListener</i></b>. Fonksiyonel arayüzlerin çoğu elbette <b>Java SE 8</b> ile birlikte geldi:</span></div><div><blockquote class="tr_bq"><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "courier new" , "courier" , monospace;">BiConsumer<T,U><br />
BiFunction<T,U,R><br />
BinaryOperator<T><br />
BiPredicate<T,U><br />
BooleanSupplier<br />
Consumer<T><br />
DoubleBinaryOperator<br />
DoubleConsumer<br />
DoubleFunction<R><br />
DoublePredicate<br />
DoubleSupplier<br />
DoubleToIntFunction<br />
DoubleToLongFunction<br />
DoubleUnaryOperator<br />
Function<T,R><br />
IntBinaryOperator<br />
IntConsumer<br />
IntFunction<R><br />
IntPredicate<br />
IntSupplier<br />
IntToDoubleFunction<br />
IntToLongFunction<br />
IntUnaryOperator<br />
LongBinaryOperator<br />
LongConsumer<br />
LongFunction<R><br />
LongPredicate<br />
LongSupplier<br />
LongToDoubleFunction<br />
LongToIntFunction<br />
LongUnaryOperator<br />
ObjDoubleConsumer<T><br />
ObjIntConsumer<T><br />
ObjLongConsumer<T><br />
Predicate<T><br />
Supplier<T><br />
ToDoubleBiFunction<T,U><br />
ToDoubleFunction<T><br />
ToIntBiFunction<T,U><br />
ToIntFunction<T><br />
ToLongBiFunction<T,U><br />
ToLongFunction<T><br />
UnaryOperator<T></span></span></blockquote></div><div style="font-family: georgia, "times new roman", serif;"></div><span style="font-family: "georgia" , "times new roman" , serif;"><b style="font-family: georgia, "times new roman", serif;">2.</b><span style="font-family: "georgia" , "times new roman" , serif;"> Arayüzde artık gövdesi olan </span></span><b style="font-family: georgia, "times new roman", serif;">default</b><span style="font-family: "georgia" , "times new roman" , serif;"> tanımlı gerçek metod tanımlayabiliyoruz</span><br />
<br />
<div><b style="font-family: georgia, "times new roman", serif; text-align: justify;">Java 8</b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> ile birlikte çok çekirdekli programlama için </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;">Stream API</b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> ve </span><i style="font-family: georgia, "times new roman", serif; text-align: justify;"><b>MapReduce çerçevesinin</b></i><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> geldiğini görüyoruz. </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;">Stream API</b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> ile </span><i style="font-family: georgia, "times new roman", serif; text-align: justify;"><b>torbalar</b></i><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> (=</span><i style="font-family: georgia, "times new roman", serif; text-align: justify;"><b>collections</b></i><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;">) üzerinde paralel çalışabilen işlemler tanımlayabiliyoruz. </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;">Stream API</b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;">'nin torbalar üzerinde çalışabilmesi için </span><i style="font-family: georgia, "times new roman", serif; text-align: justify;"><b>Collection API</b></i><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;">'nin arayüzlerinde değişiklik yapmak gerekiyordu. Bu değişiklikleri geriye doğru uyumluluğu bozmadan gerçekleştirebilmek için artık arayüz içinde </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;"><i>default</i></b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> tanımlı metodlar tanımlayabiliyoruz. Şimdi </span><i style="font-family: georgia, "times new roman", serif; text-align: justify;"><b>java.util.Collection</b></i><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> arayüzünü inceleyelim:</span></div><div><div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span></div><div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">Collection</span><span style="color: #333333;"><</span>E<span style="color: #333333;">></span> <span style="color: #008800; font-weight: bold;">extends</span> Iterable<span style="color: #333333;"><</span>E<span style="color: #333333;">></span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">size</span><span style="color: #333333;">();</span>
<span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">isEmpty</span><span style="color: #333333;">();</span>
<span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">contains</span><span style="color: #333333;">(</span>Object o<span style="color: #333333;">);</span>
Iterator<span style="color: #333333;"><</span>E<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">iterator</span><span style="color: #333333;">();</span>
Object<span style="color: #333333;">[]</span> <span style="color: #0066bb; font-weight: bold;">toArray</span><span style="color: #333333;">();</span>
<span style="color: #333333;"><</span>T<span style="color: #333333;">></span> T<span style="color: #333333;">[]</span> toArray<span style="color: #333333;">(</span>T<span style="color: #333333;">[]</span> a<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">add</span><span style="color: #333333;">(</span>E e<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">remove</span><span style="color: #333333;">(</span>Object o<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">containsAll</span><span style="color: #333333;">(</span>Collection<span style="color: #333333;"><?></span> c<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">addAll</span><span style="color: #333333;">(</span>Collection<span style="color: #333333;"><?</span> <span style="color: #008800; font-weight: bold;">extends</span> E<span style="color: #333333;">></span> c<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">removeAll</span><span style="color: #333333;">(</span>Collection<span style="color: #333333;"><?></span> c<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">default</span> <span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">removeIf</span><span style="color: #333333;">(</span>Predicate<span style="color: #333333;"><?</span> <span style="color: #008800; font-weight: bold;">super</span> E<span style="color: #333333;">></span> filter<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
Objects<span style="color: #333333;">.</span><span style="color: #0000cc;">requireNonNull</span><span style="color: #333333;">(</span>filter<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">boolean</span> removed <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">false</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">final</span> Iterator<span style="color: #333333;"><</span>E<span style="color: #333333;">></span> each <span style="color: #333333;">=</span> iterator<span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">while</span> <span style="color: #333333;">(</span>each<span style="color: #333333;">.</span><span style="color: #0000cc;">hasNext</span><span style="color: #333333;">())</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>filter<span style="color: #333333;">.</span><span style="color: #0000cc;">test</span><span style="color: #333333;">(</span>each<span style="color: #333333;">.</span><span style="color: #0000cc;">next</span><span style="color: #333333;">()))</span> <span style="color: #333333;">{</span>
each<span style="color: #333333;">.</span><span style="color: #0000cc;">remove</span><span style="color: #333333;">();</span>
removed <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">true</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">return</span> removed<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">retainAll</span><span style="color: #333333;">(</span>Collection<span style="color: #333333;"><?></span> c<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">clear</span><span style="color: #333333;">();</span>
<span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">equals</span><span style="color: #333333;">(</span>Object o<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">hashCode</span><span style="color: #333333;">();</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">default</span> Spliterator<span style="color: #333333;"><</span>E<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">spliterator</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> Spliterators<span style="color: #333333;">.</span><span style="color: #0000cc;">spliterator</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">default</span> Stream<span style="color: #333333;"><</span>E<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">stream</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> StreamSupport<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">(</span>spliterator<span style="color: #333333;">(),</span> <span style="color: #008800; font-weight: bold;">false</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">default</span> Stream<span style="color: #333333;"><</span>E<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">parallelStream</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> StreamSupport<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">(</span>spliterator<span style="color: #333333;">(),</span> <span style="color: #008800; font-weight: bold;">true</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre></div><br />
<div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"><b>Java 8</b>'de <b>Collection</b> arayüzünde <b>default </b>tanımlı dört yeni metod geldiğini görüyoruz: <b>removeIf()</b>, <b>spliterator()</b>, <b>stream()</b> ve <b>parallelStream()</b>. Bu metodlar <b>default </b>ile tanımlı kıvırcık parentezlerle çevrelenmiş bir gövdeye sahipler. Derleyici, <b>Collection</b> arayüzünü gerçekleyen bir sınıf için eğer sınıf <b>default </b>tanımlı metodlar için bir gerçekleme vermez ise arayüzde verilen gerçeklemeyi kullanıyor. Bu özellik API tasarlayanlar için tasarımda büyük bir esneklik sunuyor ve API'nin bir taraftan geriye doğru uyumluluğunu korurken diğer taraftan yeni istekleri karşılamak üzere arayüze yeni metodlar eklenebilmesine olanak sağlıyor.</span></div><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>3.</b> Arayüzde artık <b>static</b> tanımlı metod tanımlayabiliyoruz</span><br />
<br />
<div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"><b>Java 8</b>'de arayüzde <b>static </b>tanımlı metod tanımlıyabiliyoruz. Java programlama diline getirilen bu değişikliğin amaçlarından biri fonksiyonel programlamayı desteklemektir. Arayüz içindeki <b>static </b>fonksiyonları, metodlara parametre aktarımı amacıyla kullanabiliyoruz. Arayüz içinde tanımlanmış <b>static </b>metodların diğer bir kulllanımı kolaylık fonksiyonları tanımlamaktır. Aşağıdaki örnekte, bir tam sayının tekliğini ve çiftliğini test eden ve <b>boolean </b>değer dönen iki <b>static </b>metodun (<b>odd </b>ve <b>even</b>) tanımlı olduğu <b>A</b> arayüzü ve bu metodların fonksiyonel programlamadaki örnek kullanımı verilmiştir.</span></div><!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.IntStream</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">StudyInterfaces</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
IntStream<span style="color: #333333;">.</span><span style="color: #0000cc;">range</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">10</span><span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">A:</span><span style="color: #333333;">:</span>odd<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
IntStream<span style="color: #333333;">.</span><span style="color: #0000cc;">range</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">10</span><span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">A:</span><span style="color: #333333;">:</span>even<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">A</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">odd</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> x<span style="color: #333333;">){</span>
<span style="color: #008800; font-weight: bold;">return</span> x<span style="color: #333333;">%</span><span style="color: #0000dd; font-weight: bold;">2</span> <span style="color: #333333;">!=</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">even</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> x<span style="color: #333333;">){</span>
<span style="color: #008800; font-weight: bold;">return</span> x<span style="color: #333333;">%</span><span style="color: #0000dd; font-weight: bold;">2</span> <span style="color: #333333;">==</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre></div><br />
<div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;">Arayüzde tanımlanan <b>static</b> metodlar için iki kısıt bulunuyor:</span><br />
<ul><li><span style="font-family: "georgia" , "times new roman" , serif;"><b>static </b>metodlar için çok şekillilik çalışmaz! </span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Ayrıca <b>static </b>metodlar sınıfın <b>this </b>üyesine erişemezler ve arayüzün <b>static </b>olmayan metodlarını çağıramazlar!</span></li>
</ul></div><span style="font-family: "georgia" , "times new roman" , serif;">Arayüze <b>static </b>metod eklerken, tasarımınızda <b>static </b>metoda ye verirken bu iki kısıtı göz önünde bulundurmalısınız.</span><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif; font-size: x-large;"><b>Java 9 ile Arayüzde Gelen Yenilikler </b></span><br />
<br />
<div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;"><b>Java 8</b> ile birlikte arayüzde <b>static </b>ve <b>default </b>tanımlı metodlar yazabiliyoruz. <b>Java 9</b>'a kadar bu metodların <b>public </b>olmak zorunluluğu bulunmaktaydı. <b>Java 9</b>'da gelen yenilik ile birlikte <b>static </b>tanımlı metodları <b>private </b>olarak da tanımlanabiliyoruz:</span></div><div style="text-align: justify;"><br />
</div><div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">I</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">fun</span><span style="color: #333333;">(){}</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">gun</span><span style="color: #333333;">(){}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">default</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">run</span><span style="color: #333333;">(){}</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">default</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">sun</span><span style="color: #333333;">(){}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">tun</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">zun</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">bun</span><span style="color: #333333;">(){}</span>
<span style="color: #333333;">}</span>
</pre></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif;">Buna göre yukarıdaki kod parçasında <b>static</b> tanımlı <b>fun()</b> fonksiyonu public tanımlıdır ve geçerlidir. <b>static</b> tanımlı diğer fonksiyon ise <b>gun()</b> fonksiyonu private tanımlanmıştır. <b>Java 9</b> bu tanıma onay veriyor! <b>default</b> tanımlı metodlar ise hala <b>public</b> olmak zorundalar! Buna göre <b>default</b> tanımlı <b>sun()</b> fonksiyonu <b>private</b> tanımlandığı için derleyici hata verecektir! <b>abstract</b> metodlar hala sadece <b>public</b> olarak tanımlanabilir. Buna göre derleyici <b>zun()</b> fonksiyonunun tanımına kızacaktır! Peki arayüzün son metodu olan <b>bun()</b> için durum nedir? <b>private</b> tanımlandığına göre <b>static</b> olmak zorundadır. <b>static</b> anahtar kelimesini derleyici bu sefer kendisi ekler!</span></div></div></div>Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-56680915759129059112017-07-23T23:32:00.001+03:002017-07-24T06:01:11.176+03:00Java'da Nesne Yaratmak Üzerine Bir Örnek<span style="font-family: "georgia" , "times new roman" , serif;">Bu yazıda <b>Java</b>'da nesne yaratılırken mutfakta, arka tarafta neler olduğunu inceleyeceğiz. Bu amaçla hazırlanmış örnek Java koduna göz atalım önce:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Question</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
B b <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> B<span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">A</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> D d <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> D<span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">A</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"A's constructor"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">B</span> <span style="color: #008800; font-weight: bold;">extends</span> A <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> E e <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> E<span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">B</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"B's constructor"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">C</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">C</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"C's constructor"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">D</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">D</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"D's constructor"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">E</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> C c <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> C<span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">E</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"E's constructor"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıda verilen kod incelendiğinde sınıflar arasında iki tür ilişki olduğu kolaylıkla görülebilir:</span><br />
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>Kalıtım İlişkisi</b></span></li>
</ul>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;"><b>B</b> ile <b>A</b> sınıfları arasında kalıtım ilişkisi bulunuyor. <b>B</b> sınıfı kalıtım yolu ile <b>A</b>'nın tüm özelliklerine sahip olur.</span></blockquote>
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>İçerme İlişkisi</b></span></li>
</ul>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;"><b>A</b> sınıfı ile <b>D</b> sınıfı arasında bir içerme ilişkisi bulunuyor. Buna göre <b>A</b> sınıfı üye olarak <b>D</b> sınıfından bir üyeyi nesne olarak içerir. <b>A</b> ile <b>D</b> sınıfları arasındaki içerme ilişkisinin bir benzerini, <b>B</b> ile <b>D</b> sınıfları ve <b>E</b> ile <b>C</b> sınıfları arasında bulunduğunu görüyoruz.</span></blockquote>
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki örnek kodda yer alan sınıflar arasındaki ilişkileri basitçe <b>Unified Modeling Language</b> (<b>UML</b>) <b><i>sınıf çizgesi</i></b> (=<i><b>class diagram</b></i>) kullanarak özetleyebiliriz:</span><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh85hUZ2hGCHoAnz2-LKfUU-wCXFGqM2yruktW0MLyiJhAWuj806Qt2rgaQU1Jbb5Ev0VULMPCVgnQRnYJWvuv-E8tjZl7niYWZlF0L03Fn30vXrxJH4gy4SPnk4OsQeuxpeOw_CmT8r5ac/s1600/object-creation-in-java-fig-01.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="186" data-original-width="621" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh85hUZ2hGCHoAnz2-LKfUU-wCXFGqM2yruktW0MLyiJhAWuj806Qt2rgaQU1Jbb5Ev0VULMPCVgnQRnYJWvuv-E8tjZl7niYWZlF0L03Fn30vXrxJH4gy4SPnk4OsQeuxpeOw_CmT8r5ac/s1600/object-creation-in-java-fig-01.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><b>Örnek koda ait UML sınıf çizgesi</b></span></td></tr>
</tbody></table>
<span style="font-family: "georgia" , "times new roman" , serif;">Şimdi <b>B b= new B()</b> satırında <b>Java Sanal Makinası</b> tarafından </span><span style="font-family: "georgia" , "times new roman" , serif;">sırasıyla</span><span style="font-family: "georgia" , "times new roman" , serif;"> </span><span style="font-family: "georgia" , "times new roman" , serif;">hangi işlemlerin gerçekleştirildiğini ve bu işlemler sırasında bellekte oluşan yerleşimi saptamaya çalışalım.</span><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioxEUxyuc2zycxXAlJlUiA14WBILfhiYZEsCSCKxdU5NIqoowvLgvDODOdYeaidp0PMKv4ErjLCXjSvZ6wyioIvOgEdjSFX_RXO_jfZnxauTZaep8s633NZfyJU0XiOETz3ZDX1CjxtcnH/s1600/object-creation-in-java-fig-02.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="103" data-original-width="285" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioxEUxyuc2zycxXAlJlUiA14WBILfhiYZEsCSCKxdU5NIqoowvLgvDODOdYeaidp0PMKv4ErjLCXjSvZ6wyioIvOgEdjSFX_RXO_jfZnxauTZaep8s633NZfyJU0XiOETz3ZDX1CjxtcnH/s1600/object-creation-in-java-fig-02.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">İlk olarak <b>yerel referans değişkeni</b> olan <b>b</b> değişkeni için yığında yer ayrılır. Başlangıçta <b>b</b> değişkeni bellekte geçerli bir <b>B</b> sınıfı nesnesinin referansını taşımıyor. <b>new</b> operatörü ile <b>B</b> sınıfı nesnesi bir dizi işlem sonrasında yaratılacak. <b>new</b> operatörü yarattığı nesnenin referansını dönecektir. Atama operatörü ile bu referans <b>b</b> etiketli göze yazılacaktır.</span></td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmC4RjyeuNhc032R2Dn0V2Rq3M-vb5HRRMxtalU5lR-bZzXtCFANM2iirQ77Bd28Nz3zdLj-aBc2tiybKxmhmHjUNA8ZIhIAdLmLXxdDQu0gbq_Vkdkp_UjOvD4hfPVSQKTy5gqv3peoxW/s1600/object-creation-in-java-fig-03.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="235" data-original-width="534" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmC4RjyeuNhc032R2Dn0V2Rq3M-vb5HRRMxtalU5lR-bZzXtCFANM2iirQ77Bd28Nz3zdLj-aBc2tiybKxmhmHjUNA8ZIhIAdLmLXxdDQu0gbq_Vkdkp_UjOvD4hfPVSQKTy5gqv3peoxW/s1600/object-creation-in-java-fig-03.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: justify;"><div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">Java'da tüm nesneler <b>Heap</b>'de yaratılır. Bu nedenle bu nesnelere <b>Heap</b> nesnesi de denir. <b>B</b> tipinden nesneyi <b>Heap</b>'de yaratmaya başlayalım. Bir sınıftan nesne yaratılırken sadece öznitelikleri için bellekten yer ayrılır. <b>B</b> sınıfı yalın bir sınıf değil, <b>A</b> sınıfından türetilmiş durumda. Bu durumda aşağıdaki işlemler sırası ile çalıştırılır:</span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><b>1.</b> <b>A</b> sınıfından gelen veriler için bellekte yer ayrılır.</span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">Önce <b>d</b> referans değişkeni için <b>Heap</b>'de yer ayrılır. </span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><b>2. A</b> sınıfının kurucu fonksiyonu çalışır.</span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><b>A</b> sınıfının kurucu fonksiyonunun çalışmasını sağlayan satır <b>B</b>'nin kurucu fonksiyonunda gözükmeyen <b>super()</b> çağrısıdır! Türetilmiş sınıf kurucu fonksiyon ilk iş olarak temel sınıfın kurucusu fonksiyonunu <b>super</b> anahtar kelimesi ile çağırmak zorundadır. </span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><b>3. B</b> sınıfından gelen veriler için bellekte yer ayrılır.</span></div>
<div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><b>4. B</b> sınıfının kurucu fonksiyonu çalışır.</span></div>
</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcUu72st76apfezsyPh3zLPBSB_t3p0zehcFP_IdpY5M7rsyLbE6N_P2lTZdBekKAI9hXeDjrj6ayHMF1GZ2NTj3a-5U9-Vw2UZSvwPt7zi8QiBJyqgpR2J_EP6h0FQu7217c-QotwpMEa/s1600/object-creation-in-java-fig-04.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="226" data-original-width="591" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcUu72st76apfezsyPh3zLPBSB_t3p0zehcFP_IdpY5M7rsyLbE6N_P2lTZdBekKAI9hXeDjrj6ayHMF1GZ2NTj3a-5U9-Vw2UZSvwPt7zi8QiBJyqgpR2J_EP6h0FQu7217c-QotwpMEa/s1600/object-creation-in-java-fig-04.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: justify;"><span style="font-size: large;"><span style="font-family: "georgia" , "times new roman" , serif;"><b>d</b> referansı <b>D</b> sınıfıdan bir nesneye referans ediyor. <b>d</b> referans değişkeni tanımlanırken hemen </span><b style="font-family: Georgia, "Times New Roman", serif;">D</b><span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;"> sınıfından nesneye referans edecek şekilde tanımlanmış: </span><b><span style="font-family: "courier new" , "courier" , monospace;">private final D d= new D</span></b><span style="font-family: "georgia" , "times new roman" , serif;">. </span></span><b style="font-family: Georgia, "Times New Roman", serif;">D</b><span style="font-family: "georgia" , "times new roman" , serif;"> sınıfından nesne yaratılırken </span><b style="font-family: Georgia, "Times New Roman", serif;">D</b><span style="font-family: "georgia" , "times new roman" , serif;"> sınıfının kurucu fonksiyonu çalışır ve ekrana ilk mesaj çıkar: </span><b><span style="font-family: "courier new" , "courier" , monospace;">D's Constructor</span></b><span style="font-family: "georgia" , "times new roman" , serif;">. Artık </span><b style="font-family: Georgia, "Times New Roman", serif;">d</b><span style="font-family: "georgia" , "times new roman" , serif;"> referansı <b>D</b> sınıfından nesneyi gösteriyor. </span></span><br />
<span style="font-size: large;"><span style="font-family: "georgia" , "times new roman" , serif;"><b>A</b> sınıfından gelen öznitelikler için yer ayrıldıktan ve üyeler ilklendirildikten sonra <i>nihayet </i><b>A</b> sınıfının kurucu fonksiyonu çalışır. Şu ana kadar ekranda iki satırlık bir çıktı oluştu:</span><br />
<b><span style="font-family: "courier new" , "courier" , monospace;">D's Constructor<br />
A's Constructor</span></b></span></td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ4mrLkeXJ8eGKEHL5MqXVhYQjh8N6EiZWCcU2uNUH-PZ1UmwXKJUCN9_pbVsRNKcZ8zHYlpWNuLRfe4G5QBtVx_tJpt2IexGjn-X6trSYJ23b2dvjRAmewv7hAB737vbY2IBYzYaDW7Aw/s1600/object-creation-in-java-fig-05.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="227" data-original-width="587" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ4mrLkeXJ8eGKEHL5MqXVhYQjh8N6EiZWCcU2uNUH-PZ1UmwXKJUCN9_pbVsRNKcZ8zHYlpWNuLRfe4G5QBtVx_tJpt2IexGjn-X6trSYJ23b2dvjRAmewv7hAB737vbY2IBYzYaDW7Aw/s1600/object-creation-in-java-fig-05.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">Şimdi ise <b>B</b> sınıfından gelen öznitelikler için yer ayrılır. <b>B</b> sınıfı içinde <b>E</b> sınıfından bir referans yer alıyor. Önce <b>e</b> referansı için <b>Heap</b>'de yer ayrılır.</span></td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisLYwPHLiknKO5ImfDCeQTYk_9_nleKulxTJwU7VPoXlxs2dvfQ51NW-xav34C5f16pzKOv1CcnSW1cOlevDV1UgBkXa1Txe9iimb-Ifqqd4kx0Ub6IF67owEoADKAbyvn9zt7e-3c8qzH/s1600/object-creation-in-java-fig-11.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="242" data-original-width="676" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisLYwPHLiknKO5ImfDCeQTYk_9_nleKulxTJwU7VPoXlxs2dvfQ51NW-xav34C5f16pzKOv1CcnSW1cOlevDV1UgBkXa1Txe9iimb-Ifqqd4kx0Ub6IF67owEoADKAbyvn9zt7e-3c8qzH/s1600/object-creation-in-java-fig-11.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><span style="font-family: "georgia" , "times new roman" , serif;"><b>e</b> referans değişkeni hemen <b>E</b> sınıfından bir nesneye referans edecek şekilde tanımlanmış: </span><b><span style="font-family: "courier new" , "courier" , monospace;">private final E e= new E()</span></b><span style="font-family: "georgia" , "times new roman" , serif;">. Bu nedenle </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;">E</b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> sınıfından bir nesne yaratılır. </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;">E</b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> sınıfı içinde </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;">C</b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;"> tipinden bir referans yer alıyor: </span><b style="font-family: georgia, "times new roman", serif; text-align: justify;">c</b><span style="font-family: "georgia" , "times new roman" , serif; text-align: justify;">. Önce bu referans değişkeni için yer ayrılır. </span></span></td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigdfEoiRCT4WoGwmCVEWxNBjRzXfQiuuNVYVDbcG7aXh1L7eoaXlBnMbfrt6Yqw1AjHaJDSqw34nXj7HCF-Wjz-BD2XAQtt5cw_152LPMvZO-4x9S6WQx0zy7megTuzIm0JUumxfBOkhKD/s1600/object-creation-in-java-fig-09.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="238" data-original-width="777" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigdfEoiRCT4WoGwmCVEWxNBjRzXfQiuuNVYVDbcG7aXh1L7eoaXlBnMbfrt6Yqw1AjHaJDSqw34nXj7HCF-Wjz-BD2XAQtt5cw_152LPMvZO-4x9S6WQx0zy7megTuzIm0JUumxfBOkhKD/s1600/object-creation-in-java-fig-09.png" /></a></td></tr>
<tr><td class="tr-caption"><div style="text-align: justify;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><b>c</b> referans değişkeni hemen <b>C</b> sınıfı nesnesine referans edecek şekilde tanımlanmış: </span><span style="font-family: "courier new" , "courier" , monospace; font-size: large;"><b>private final C c = new C()</b></span><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">. Bu nedenle, <b>C</b> sınıfından bir nesne yaratılır ve yaratılan nesnenin referansı <b>c</b>'ye kopyalanır. Böylelikle <b>c</b> referansı yeni yaratılan nesneye referans edecek şekilde adresine sahip olur. Bu işlemlerden sonra ekranda üç satırlık bir çıktı görüyoruz:</span></div>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: large;"><b>D's Constructor</b></span></div>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: large;"><b>A's Constructor</b></span></div>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: large;"><b>C's Constructor</b></span></div>
</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrvDDmAAT_ShBeSSexxonXlzaCdhKh_Vh2zqnMgux0ItSuad4Q3jYCq3CQrNuaeRBV4sIFhlVICk0VZ-PUAVfUGUZjnCNHNUIYNg3ZJdI-tbEeGls5XRODsfkkWyY0kelgU5OZOUkxshQ9/s1600/object-creation-in-java-fig-10.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="237" data-original-width="777" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrvDDmAAT_ShBeSSexxonXlzaCdhKh_Vh2zqnMgux0ItSuad4Q3jYCq3CQrNuaeRBV4sIFhlVICk0VZ-PUAVfUGUZjnCNHNUIYNg3ZJdI-tbEeGls5XRODsfkkWyY0kelgU5OZOUkxshQ9/s1600/object-creation-in-java-fig-10.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><b>E</b> sınıfı içindeki referanslar yaratıldıktan ve ilklendirildikten sonra <b>E</b> sınıfı kurucu fonksiyonu çalışır:</span><br />
<div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: large;"><b>D's Constructor</b></span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: large;"><b>A's Constructor</b></span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: large;"><b>C's Constructor</b></span></div>
<div>
<b><span style="font-family: "courier new" , "courier" , monospace; font-size: large;">E's Constructor</span></b><br />
<span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><b>e</b> referansı artık <b>E</b> sınıfından yaratılan nesneye referans ediyor.</span></div>
</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSPA_jQCxEgiPbI4QiJhxffTzbtEB4T_ViDb6ypLaFWNPQmvwMajwMsjk-HKHEBdmqM5Hp0fDkCsgFxFqKrzdttFqYkrRJ67Ws1rCN-ffp39TuPr9iaba5Pfaa0dZkucjvEhdRZpwxTxKr/s1600/object-creation-in-java-fig-08.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="237" data-original-width="777" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSPA_jQCxEgiPbI4QiJhxffTzbtEB4T_ViDb6ypLaFWNPQmvwMajwMsjk-HKHEBdmqM5Hp0fDkCsgFxFqKrzdttFqYkrRJ67Ws1rCN-ffp39TuPr9iaba5Pfaa0dZkucjvEhdRZpwxTxKr/s1600/object-creation-in-java-fig-08.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">Artık <b>B</b> sınıfındaki <b>e</b> referansı da yaratıldı ve ilklendirildi. Şimdi son olarak sıra <b>B</b> sınıfı kurucu fonksiyonuna geldi. En son <b>B</b> sınıfının kurucu fonksiyonu sahne alır:</span><br />
<div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: large;"><b>D's Constructor</b></span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: large;"><b>A's Constructor</b></span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: large;"><b>C's Constructor</b></span></div>
<div>
<b style="font-family: "Courier New", Courier, monospace;"><span style="font-size: large;">E's Constructor</span></b></div>
<div>
<b style="font-family: "Courier New", Courier, monospace;"><span style="font-size: large;">B's Constructor</span></b></div>
</td></tr>
</tbody></table>
<span style="font-family: "georgia" , "times new roman" , serif;">Yaratılan sınıf ne kadar karmaşık olursa olsun, diğer sınıflarla kalıtım ya da içerme ilşkisi gibi ne tür ilişkisi olursa olsun, her zaman en son yaratılan sınıfın kurucu fonksiyonu çalışır! Örneğimizde en son <b>B</b> sınıfının kurucu fonksiyonu çalıştı!</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Yukarıda yazının başında verdiğimiz kodda derleyici birkaç yerde araya girer ve kodu değiştirir. İşte gerçekte derlenen kod aşağıda verilmiştir:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Question</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
B b <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> B<span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">A</span> <span style="color: #008800; font-weight: bold;">extends</span> Object <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> D d <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> D<span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">A</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">super</span><span style="color: #333333;">();</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"A's constructor"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">B</span> <span style="color: #008800; font-weight: bold;">extends</span> A <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> E e <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> E<span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">B</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">super</span><span style="color: #333333;">();</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"B's constructor"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">C</span> <span style="color: #008800; font-weight: bold;">extends</span> Object <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">C</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">super</span><span style="color: #333333;">();</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"C's constructor"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">D</span> <span style="color: #008800; font-weight: bold;">extends</span> Object <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">D</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">super</span><span style="color: #333333;">();</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"D's constructor"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">E</span> <span style="color: #008800; font-weight: bold;">extends</span> Object <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> C c <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> C<span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">E</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">super</span><span style="color: #333333;">();</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"E's constructor"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Buna göre UML sınıf çizgesini güncellememiz gerekir:</span><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge3aSFgZ34LcGXZO_wYYxTlOyyXTiH5EgHCckis10U2Cdj7YfoUN9TyM3_gMCLbaQ9aUDNedEfUM50U3xXG3rIxaQHQUcUchQYfBN0vwHN-wbT8v0052ZXlbCTJVdhgW69LDkfCXZkD5Vc/s1600/object-creation-in-java-fig-12.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="431" data-original-width="616" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge3aSFgZ34LcGXZO_wYYxTlOyyXTiH5EgHCckis10U2Cdj7YfoUN9TyM3_gMCLbaQ9aUDNedEfUM50U3xXG3rIxaQHQUcUchQYfBN0vwHN-wbT8v0052ZXlbCTJVdhgW69LDkfCXZkD5Vc/s1600/object-creation-in-java-fig-12.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><b style="font-family: georgia, "times new roman", serif; font-size: x-large;">Gerçek UML sınıf çizgesi</b></td></tr>
</tbody></table>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Son olarak içerme ilişkisinin uç bir örneğini inceleyeceğiz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">CircularComposition</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
F e <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> F<span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">F</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> F f <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> F<span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">F</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"F's constructor"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Bu örnekte <b>F</b> sınıfı kendi tipinden bir nesne içeriyor. Dil bu tanıma izin veriyor. Ancak <b>F</b> sınıfından bir nesne yaratmaya çalışırsanız, çalışma zamanında <b>StackOverflow</b> hatası ile karşılaşırsınız. <b>F</b> nesnesi yaratılırken <b>F</b> tipinden bir referans değişkeni olan <b>f</b> için bellekte yer ayrılır ve hemen ardından </span><span style="font-family: "courier new" , "courier" , monospace;"><b>private final F f= new F()</b></span><span style="font-family: "georgia" , "times new roman" , serif;"> tanımı nedeni ile new operatörü <b><i>yeniden yep yeni</i></b> bir <b>F</b> nesnesi yaratmak için yola koyulur ve daha sonra tekrar bir <b>F</b> nesnesi ve sonra tekrar bir <b>F</b> nesnesi ve sonra tekrar ...</span>Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-34905837573433889922017-07-20T18:35:00.002+03:002017-07-21T08:21:06.248+03:00Java 9'da Çalışma Zamanından Önce Derleme<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP_QnHUGV_rQiAflob2SOBxIGaoyduEklFcShI6i4TZdRQehMBeplo0EGOXMCThWMiDzFftRl-G0-n4-ZCmIgmJkGUHMCtSfEWD3nRJgCcLuz1VCIwZrvBIcBNrcXZZNXJwdST3Fzywxeo/s1600/jaotc-java9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="312" data-original-width="830" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP_QnHUGV_rQiAflob2SOBxIGaoyduEklFcShI6i4TZdRQehMBeplo0EGOXMCThWMiDzFftRl-G0-n4-ZCmIgmJkGUHMCtSfEWD3nRJgCcLuz1VCIwZrvBIcBNrcXZZNXJwdST3Fzywxeo/s640/jaotc-java9.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br />
</b></span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>Java </b>sınıfları <b>javac</b> derleyicisi ile derlenir ve <b><i>sekizlik kodlar</i></b> (=<i><b>bytecode</b></i>) içeren <b>class</b> uzantılı </span><span style="font-family: "georgia" , "times new roman" , serif;">ikili bir dosya</span><span style="font-family: "georgia" , "times new roman" , serif;"> üretilir:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;">[</span>centos<span style="color: #555555; font-weight: bold;">@guru</span> src<span style="color: #333333;">]</span>$javac <span style="color: #333333;">-</span>d <span style="color: #333333;">../</span>bin com<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/</span>application<span style="color: #333333;">/*.</span><span style="color: #0000cc;">java</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Bir uygulama çok sayıda <b>Java </b>sınıfından oluşur. Bu nedenle uygulamanın dağıtımını yapmak için tek bir dağıtım dosyasına dönüştürmek gerekir. <b>Java Standard Edition</b>'da dağıtım dosyası <b>jar</b>'dır. Bir proje için <b>jar</b> dağıtım dosyasını üretmek için aynı isimli <b>jar</b> uygulamasını kullanıyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;">[</span>centos<span style="color: #555555; font-weight: bold;">@guru</span> bin<span style="color: #333333;">]</span>$ jar <span style="color: #333333;">-</span>ecvf com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">application</span><span style="color: #333333;">.</span><span style="color: #0000cc;">AnimalApp</span> app<span style="color: #333333;">.</span><span style="color: #0000cc;">jar</span> <span style="color: #333333;">.</span>
added manifest
<span style="color: #997700; font-weight: bold;">adding:</span> com<span style="color: #333333;">/(</span>in <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">)</span> <span style="color: #333333;">(</span>out<span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">)(</span>stored <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">%)</span>
<span style="color: #997700; font-weight: bold;">adding:</span> com<span style="color: #333333;">/</span>example<span style="color: #333333;">/(</span>in <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">)</span> <span style="color: #333333;">(</span>out<span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">)(</span>stored <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">%)</span>
<span style="color: #997700; font-weight: bold;">adding:</span> com<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/(</span>in <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">)</span> <span style="color: #333333;">(</span>out<span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">)(</span>stored <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">%)</span>
<span style="color: #997700; font-weight: bold;">adding:</span> com<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/</span>application<span style="color: #333333;">/(</span>in <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">)</span> <span style="color: #333333;">(</span>out<span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">)(</span>stored <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">%)</span>
<span style="color: #997700; font-weight: bold;">adding:</span> com<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/</span>application<span style="color: #333333;">/</span>AnimalAppInJava7<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">(</span>in <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">1322</span><span style="color: #333333;">)</span> <span style="color: #333333;">(</span>out<span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">788</span><span style="color: #333333;">)(</span>deflated <span style="color: #0000dd; font-weight: bold;">40</span><span style="color: #333333;">%)</span>
<span style="color: #997700; font-weight: bold;">adding:</span> com<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/</span>application<span style="color: #333333;">/</span>AnimalApp<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">(</span>in <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">4253</span><span style="color: #333333;">)</span> <span style="color: #333333;">(</span>out<span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">1802</span><span style="color: #333333;">)(</span>deflated <span style="color: #0000dd; font-weight: bold;">57</span><span style="color: #333333;">%)</span>
<span style="color: #997700; font-weight: bold;">adding:</span> com<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/</span>domain<span style="color: #333333;">/(</span>in <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">)</span> <span style="color: #333333;">(</span>out<span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">)(</span>stored <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">%)</span>
<span style="color: #997700; font-weight: bold;">adding:</span> com<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/</span>domain<span style="color: #333333;">/</span>Animal<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">(</span>in <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">554</span><span style="color: #333333;">)</span> <span style="color: #333333;">(</span>out<span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">382</span><span style="color: #333333;">)(</span>deflated <span style="color: #0000dd; font-weight: bold;">31</span><span style="color: #333333;">%)</span>
<span style="color: #997700; font-weight: bold;">adding:</span> com<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/</span>domain<span style="color: #333333;">/</span>Cat<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">(</span>in <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">1464</span><span style="color: #333333;">)</span> <span style="color: #333333;">(</span>out<span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">730</span><span style="color: #333333;">)(</span>deflated <span style="color: #0000dd; font-weight: bold;">50</span><span style="color: #333333;">%)</span>
<span style="color: #997700; font-weight: bold;">adding:</span> com<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/</span>domain<span style="color: #333333;">/</span>Pet<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">(</span>in <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">218</span><span style="color: #333333;">)</span> <span style="color: #333333;">(</span>out<span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">167</span><span style="color: #333333;">)(</span>deflated <span style="color: #0000dd; font-weight: bold;">23</span><span style="color: #333333;">%)</span>
<span style="color: #997700; font-weight: bold;">adding:</span> com<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/</span>domain<span style="color: #333333;">/</span>Fish<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">(</span>in <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">1565</span><span style="color: #333333;">)</span> <span style="color: #333333;">(</span>out<span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">762</span><span style="color: #333333;">)(</span>deflated <span style="color: #0000dd; font-weight: bold;">51</span><span style="color: #333333;">%)</span>
<span style="color: #997700; font-weight: bold;">adding:</span> com<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/</span>domain<span style="color: #333333;">/</span>Spider<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">(</span>in <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">1007</span><span style="color: #333333;">)</span> <span style="color: #333333;">(</span>out<span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">554</span><span style="color: #333333;">)(</span>deflated <span style="color: #0000dd; font-weight: bold;">44</span><span style="color: #333333;">%)</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Java</b> uygulamasını çalıştırmak için ise <b>Java Sanal Makinası</b>na ihtiyaç bulunuyor. <b>java</b> komutu ile <i>Java Sanal Makinasına</i> yazılımsal olarak erişmiş oluyoruz. <b>jar</b> olarak dağıtılmış bir <b>Java</b> uygulamasını basitçe aşağıdaki gibi bir komutla çalıştırabiliriz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;">[</span>centos<span style="color: #555555; font-weight: bold;">@guru</span> bin<span style="color: #333333;">]</span>$ java <span style="color: #333333;">-</span>cp app<span style="color: #333333;">.</span><span style="color: #0000cc;">jar</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">application</span><span style="color: #333333;">.</span><span style="color: #0000cc;">AnimalApp</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Eğer <b>jar</b> oluşturulurken çalıştırılacak sınıfın hangi sınıf olduğu, başka bir deyişle uygulamanın giriş noktası tanımlanmışsa, uygulamayı daha da basit bir şekilde aşağıda verildiği gibi çalıştırabiliriz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;">[</span>centos<span style="color: #555555; font-weight: bold;">@guru</span> bin<span style="color: #333333;">]</span>$ java <span style="color: #333333;">-</span>jar app<span style="color: #333333;">.</span><span style="color: #0000cc;">jar</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>jar</b> dağıtım dosyası üretilirken, <b>jar</b> komutuna uygulamanın giriş noktasının (çalıştırılacak sınıfın) hangisi olduğunu <b>-e</b> seçeneği ile veriyoruz.</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br />
</b></span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>JIT</b> derleyici sekizlik kodları <b>JSM</b>’nin üzerinde çalıştığı platformun anlayacağı komutlara dönüştürür. Üstelik bunu yaparken devingen en iyileme de yapar. Bunun için uygulamanın basit bir kesitini (=profiling) çıkarır. Bu kesit bilgisine göre onlarca en iyileme tekniğinden hangilerini uygulayacağına karar verir. <b>JIT</b>'lenen kodlar elbette hızlı çalışır. Ancak bu işlemin bir zaman maliyeti vardır ve bu ödenen bedel özellikle uygulamanın açılış süresinin biraz uzamasına ve uygulamada yer yer gecikmelerin yaşanmasına neden olur. <b>JIT</b> derleyici <b>sınıf metotlarını</b>, <b>döngü bloklarını</b> ve hataları ele aldığımız <b>catch bloklarını</b> derler.</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>Java Sanal Makinasının</b> her türlü davranışını <b>görünür </b>kılabiliriz. Buna <b>JIT</b> derleyicinin davranışı da dahildir. <b>JIT</b>'lenen metotları görmek için uygulamayı aşağıdaki parametrelerle çalıştırmalısınız:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;">[</span>centos<span style="color: #555555; font-weight: bold;">@guru</span> bin<span style="color: #333333;">]</span>$ java <span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">+</span>UnlockDiagnosticVMOptions <span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">+</span>PrintCompilation <span style="color: #333333;">-</span>jar app<span style="color: #333333;">.</span><span style="color: #0000cc;">jar</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Hatta <b>JIT</b>'lenen metotlarını makina dili karşılıklarını bile görebilirsiniz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;">[</span>centos<span style="color: #555555; font-weight: bold;">@guru</span> bin<span style="color: #333333;">]</span>$ java <span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">+</span>UnlockDiagnosticVMOptions <span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">+</span>PrintAssembly <span style="color: #333333;">-</span>jar app<span style="color: #333333;">.</span><span style="color: #0000cc;">jar</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Ancak yukarıdaki komutun ekrana <b>JIT</b> derleyicinin ürettiği kodun makina dili karşılığını yazabilmesi için özel bir kütüphaneye ihtiyacınız bulunuyor.</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>Oracle</b> firmasının sağladığı <b>Java Sanal Makina</b> ürününün adı <b>HotSpot</b>'dur. Hotspot içinde iki farklı karakteristikte <b>JIT</b> derleyici bulunur: <b>C1</b> ve <b>C2</b>. Java uygulamalarının başarımını ölçmek için farklı metrikler kullanarak ölçümler yapabiliriz. <b>Açılış zamanı</b> ve <b>cevap süresi</b> başarımı ölçmek için kullanılabilecek iki önemli ölçüttür. Masaüstü uygulamaları için <b>açılış süresi</b> ve web uygulamaları için ise <b>cevap süresi</b> daha önemlidir. Masaüstü uygulamaları, kullanıcı arayüzünü bir an önce kullanıcıya sunmalıdır. Örneğin, e-posta göndermek istiyorsunuz, bunun için favori e-posta istemcinizin masaüstü simgesine tıkladınız. Pencerenin hemen açılmasını ve iletinizi bir an önce yazabilmeyi istersiniz. Nasıl olsa yazmaya başladığınızda, işlemci ile karşılaştırıldığında kaplumbağa hızında yazıyor olacaksınız. Yazılımın çok da hızlı çalışmaya ihtiyacı yok. Buna karşılık web uygulamalarında ise uygulama sunucusunun biraz geç açılmasına tahammül edebilirsiniz ama bir istek geldiğinde ona en hızlı sürede yanıt vermek ve cevabı dönebilmek istersiniz. İşte, <b>C1</b> derleyicisi açılış süresini iyileştirmek ve <b>C2</b> derleyicisi ise hızlı yanıt süresini iyileştirmek üzere en iyilenmiştir.</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Ancak biz uygulamanın hem hızlı açılmasını hem de kısa sürede çok iş çıkarmasını isteriz! <b>Java 7</b>'de her iki <b>JIT derleyiciyi</b> (<b>C1</b> ve <b>C2</b>) de katmanlı bir yapıda kullanan bir derleyici geldi: <b>Katmanlı JIT Derleyici </b>(=<b>Tiered Compiler</b>). <b>Java 7</b>'de bu derleyici varsayılan olarak kapalı geliyor. Açmak için uygulamayı <b>-XX:+TieredCompilation</b> seçeneği açık olacak şekilde çalıştırmanız gerekiyor:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;">[</span>centos<span style="color: #555555; font-weight: bold;">@guru</span> bin<span style="color: #333333;">]</span>$ java <span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">+</span>TieredCompilation <span style="color: #333333;">-</span>jar app<span style="color: #333333;">.</span><span style="color: #0000cc;">jar</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Java 8</b>'de ise katmanlı derleyici olgunlaştığı için varsayılan özellik olarak açık geliyor! Herhangi bir seçenek vermenize gerek bulunmuyor!</span><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Peki, neden uygulama çalıştırılmadan önce <b>class</b> uzantılı dosyaları doğrudan uygulamanın üzerinde çalışacağı işlemcinin anlayacağı komutlara dönüştürmüyoruz? Genel olarak bu işlem uygulamanın birim zamanda iş çıkarma kapasitesini düşürecektir. Ancak bazı özel durumlarda uygulamanın açılış süresini iyileştirme potansiyeli bulunuyor. <b>Java 9</b>'da <b>çalışma zamanından önce derleme </b>(=<b>ahead of time compilation, AOT</b>) geldi. Başlangıçta, bu özelliğin sadece <b>64-bitlik Linux sistemlerde</b> çalıştığını belirtmem gerekiyor. </span><br />
<b style="font-family: georgia, "times new roman", serif;"><br />
</b> <span style="font-family: "georgia" , "times new roman" , serif;">Çalışma zamanından önce derleyici <b>Java Geliştirme Kiti</b> içinden çıkan bir araç olarak geliyor: <b>jaotc</b>. <b>jaotc</b> ile bir sınıfı, bir dağıtım dosyası içindeki sınıfları ve bir modül içindeki sınıfları derleyebiliriz. Derlendiğinde ise <b>so</b> uzantılı paylaşımlı kütüphane dosyası oluşturuluyor.</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Önce bir sınıfı <b>jaotc </b>ile derleyelim:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;">[</span>centos<span style="color: #555555; font-weight: bold;">@guru</span> bin<span style="color: #333333;">]</span>$ jaotc <span style="color: #333333;">--</span>compile<span style="color: #333333;">-</span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #333333;">-</span>tiered <span style="color: #333333;">-</span>J<span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">-</span>UseAOT <span style="color: #333333;">-</span>J<span style="color: #333333;">-</span>Xmx2g <span style="color: #333333;">--</span>info com<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/</span>application<span style="color: #333333;">/</span>AnimalApp<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span> <span style="color: #333333;">--</span>output <span style="color: #333333;">./</span>libanimalapp<span style="color: #333333;">.</span><span style="color: #0000cc;">so</span>
Compiling <span style="color: #333333;">./</span>libanimalapp<span style="color: #333333;">...</span>
<span style="color: #0000dd; font-weight: bold;">1</span> classes found <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">59</span> ms<span style="color: #333333;">)</span>
<span style="color: #0000dd; font-weight: bold;">4</span> methods total<span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">4</span> methods to compile <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">7</span> ms<span style="color: #333333;">)</span>
Compiling with <span style="color: #0000dd; font-weight: bold;">2</span> threads
<span style="color: #333333;">.</span>
<span style="color: #0000dd; font-weight: bold;">4</span> methods compiled<span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span> methods failed <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">852</span> ms<span style="color: #333333;">)</span>
Parsing compiled <span style="color: #0066bb; font-weight: bold;">code</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">4</span> ms<span style="color: #333333;">)</span>
Processing <span style="color: #0066bb; font-weight: bold;">metadata</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">28</span> ms<span style="color: #333333;">)</span>
Preparing stubs <span style="color: #0066bb; font-weight: bold;">binary</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span> ms<span style="color: #333333;">)</span>
Preparing compiled <span style="color: #0066bb; font-weight: bold;">binary</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span> ms<span style="color: #333333;">)</span>
Creating <span style="color: #997700; font-weight: bold;">binary:</span> <span style="color: #333333;">./</span>libanimalapp<span style="color: #333333;">.</span><span style="color: #0000cc;">o</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">15</span> ms<span style="color: #333333;">)</span>
Creating shared <span style="color: #997700; font-weight: bold;">library:</span> <span style="color: #333333;">./</span>libanimalapp<span style="color: #333333;">.</span><span style="color: #0000cc;">so</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">30</span> ms<span style="color: #333333;">)</span>
Total <span style="color: #997700; font-weight: bold;">time:</span> <span style="color: #0000dd; font-weight: bold;">1863</span> ms
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Şimdi bir <b>jar</b> dağıtım dosyası içindeki sınıfları <b>jaotc</b> ile derleyelim:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;">[</span>centos<span style="color: #555555; font-weight: bold;">@guru</span> bin<span style="color: #333333;">]</span>$ jaotc <span style="color: #333333;">--</span>compile<span style="color: #333333;">-</span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #333333;">-</span>tiered <span style="color: #333333;">-</span>J<span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">-</span>UseAOT <span style="color: #333333;">-</span>J<span style="color: #333333;">-</span>Xmx2g <span style="color: #333333;">--</span>info <span style="color: #333333;">--</span>jar app<span style="color: #333333;">.</span><span style="color: #0000cc;">jar</span> <span style="color: #333333;">--</span>output <span style="color: #333333;">./</span>libanimals<span style="color: #333333;">.</span><span style="color: #0000cc;">so</span>
Compiling <span style="color: #333333;">./</span>libanimals<span style="color: #333333;">...</span>
<span style="color: #0000dd; font-weight: bold;">7</span> classes found <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">97</span> ms<span style="color: #333333;">)</span>
<span style="color: #0000dd; font-weight: bold;">31</span> methods total<span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">27</span> methods to compile <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">11</span> ms<span style="color: #333333;">)</span>
Compiling with <span style="color: #0000dd; font-weight: bold;">2</span> threads
<span style="color: #333333;">.</span>
<span style="color: #0000dd; font-weight: bold;">27</span> methods compiled<span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span> methods failed <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">2214</span> ms<span style="color: #333333;">)</span>
Parsing compiled <span style="color: #0066bb; font-weight: bold;">code</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">4</span> ms<span style="color: #333333;">)</span>
Processing <span style="color: #0066bb; font-weight: bold;">metadata</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">54</span> ms<span style="color: #333333;">)</span>
Preparing stubs <span style="color: #0066bb; font-weight: bold;">binary</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span> ms<span style="color: #333333;">)</span>
Preparing compiled <span style="color: #0066bb; font-weight: bold;">binary</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span> ms<span style="color: #333333;">)</span>
Creating <span style="color: #997700; font-weight: bold;">binary:</span> <span style="color: #333333;">./</span>libanimals<span style="color: #333333;">.</span><span style="color: #0000cc;">o</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">20</span> ms<span style="color: #333333;">)</span>
Creating shared <span style="color: #997700; font-weight: bold;">library:</span> <span style="color: #333333;">./</span>libanimals<span style="color: #333333;">.</span><span style="color: #0000cc;">so</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">20</span> ms<span style="color: #333333;">)</span>
Total <span style="color: #997700; font-weight: bold;">time:</span> <span style="color: #0000dd; font-weight: bold;">3211</span> ms
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Son olarak ise <b>java.sql</b> modülü içindeki sınıfları <b>jaotc</b> ile derleyelim:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;">[</span>centos<span style="color: #555555; font-weight: bold;">@guru</span> <span style="color: #333333;">~]</span>$ jaotc <span style="color: #333333;">--</span>compile<span style="color: #333333;">-</span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #333333;">-</span>tiered <span style="color: #333333;">-</span>J<span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">-</span>UseAOT <span style="color: #333333;">-</span>J<span style="color: #333333;">-</span>Xmx2g <span style="color: #333333;">--</span>info <span style="color: #333333;">--</span>module java<span style="color: #333333;">.</span><span style="color: #0000cc;">sql</span> <span style="color: #333333;">--</span>output <span style="color: #333333;">./</span>libjava<span style="color: #333333;">.</span><span style="color: #0000cc;">sql</span><span style="color: #333333;">-</span>tiered<span style="color: #333333;">.</span><span style="color: #0000cc;">so</span>
Compiling <span style="color: #333333;">./</span>libjava<span style="color: #333333;">.</span><span style="color: #0000cc;">sql</span><span style="color: #333333;">-</span>tiered<span style="color: #333333;">...</span>
<span style="color: #0000dd; font-weight: bold;">81</span> classes found <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">113</span> ms<span style="color: #333333;">)</span>
<span style="color: #0000dd; font-weight: bold;">1311</span> methods total<span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">323</span> methods to compile <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">101</span> ms<span style="color: #333333;">)</span>
Compiling with <span style="color: #0000dd; font-weight: bold;">2</span> threads
<span style="color: #333333;">....</span>
<span style="color: #0000dd; font-weight: bold;">323</span> methods compiled<span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">0</span> methods failed <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">6650</span> ms<span style="color: #333333;">)</span>
Parsing compiled <span style="color: #0066bb; font-weight: bold;">code</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">26</span> ms<span style="color: #333333;">)</span>
Processing <span style="color: #0066bb; font-weight: bold;">metadata</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">226</span> ms<span style="color: #333333;">)</span>
Preparing stubs <span style="color: #0066bb; font-weight: bold;">binary</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span> ms<span style="color: #333333;">)</span>
Preparing compiled <span style="color: #0066bb; font-weight: bold;">binary</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">3</span> ms<span style="color: #333333;">)</span>
Creating <span style="color: #997700; font-weight: bold;">binary:</span> <span style="color: #333333;">./</span>libjava<span style="color: #333333;">.</span><span style="color: #0000cc;">sql</span><span style="color: #333333;">-</span>tiered<span style="color: #333333;">.</span><span style="color: #0000cc;">o</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">131</span> ms<span style="color: #333333;">)</span>
Creating shared <span style="color: #997700; font-weight: bold;">library:</span> <span style="color: #333333;">./</span>libjava<span style="color: #333333;">.</span><span style="color: #0000cc;">sql</span><span style="color: #333333;">-</span>tiered<span style="color: #333333;">.</span><span style="color: #0000cc;">so</span> <span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">208</span> ms<span style="color: #333333;">)</span>
Total <span style="color: #997700; font-weight: bold;">time:</span> <span style="color: #0000dd; font-weight: bold;">8365</span> ms
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Uygulamaları çalıştırırken <b>Java Sanal Makinasının</b>, <b>so kütüphanesinde</b> verilen metodları kullanmasını ise aşağıdaki örneklerdeki gösterilen seçenekleri vererek sağlıyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;">[</span>centos<span style="color: #555555; font-weight: bold;">@guru</span> bin<span style="color: #333333;">]</span>$ java <span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span>AOTLibrary<span style="color: #333333;">=./</span>libanimalapp<span style="color: #333333;">.</span><span style="color: #0000cc;">so</span> <span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">+</span>UnlockDiagnosticVMOptions <span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">+</span>PrintAOT <span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">+</span>UseAOTStrictLoading <span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">+</span>UseAOT <span style="color: #333333;">-</span>jar app<span style="color: #333333;">.</span><span style="color: #0000cc;">jar</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">application</span><span style="color: #333333;">.</span><span style="color: #0000cc;">AnimalApp</span>
<span style="color: #0000dd; font-weight: bold;">15</span> <span style="color: #0000dd; font-weight: bold;">1</span> loaded <span style="color: #333333;">./</span>libanimalapp<span style="color: #333333;">.</span><span style="color: #0000cc;">so</span> aot library
<span style="color: #0000dd; font-weight: bold;">172</span> <span style="color: #0000dd; font-weight: bold;">1</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">application</span><span style="color: #333333;">.</span><span style="color: #0000cc;">AnimalApp</span><span style="color: #333333;">.</span><span style="color: #0000cc;">main</span><span style="color: #333333;">([</span>Ljava<span style="color: #333333;">/</span>lang<span style="color: #333333;">/</span>String<span style="color: #333333;">;)</span>V
<span style="color: #0000dd; font-weight: bold;">172</span> <span style="color: #0000dd; font-weight: bold;">2</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">application</span><span style="color: #333333;">.</span><span style="color: #0000cc;">AnimalApp</span><span style="color: #333333;">.<</span>init<span style="color: #333333;">>()</span>V
<span style="color: #0000dd; font-weight: bold;">172</span> <span style="color: #0000dd; font-weight: bold;">3</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">application</span><span style="color: #333333;">.</span><span style="color: #0000cc;">AnimalApp</span><span style="color: #333333;">.</span><span style="color: #0000cc;">lambda</span>$main$1<span style="color: #333333;">(</span>Lcom<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/</span>domain<span style="color: #333333;">/</span>Animal<span style="color: #333333;">;)</span>Z
<span style="color: #0000dd; font-weight: bold;">172</span> <span style="color: #0000dd; font-weight: bold;">4</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">application</span><span style="color: #333333;">.</span><span style="color: #0000cc;">AnimalApp</span><span style="color: #333333;">.</span><span style="color: #0000cc;">lambda</span>$main$0<span style="color: #333333;">(</span>Ljava<span style="color: #333333;">/</span>lang<span style="color: #333333;">/</span>Class<span style="color: #333333;">;</span>Lcom<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/</span>domain<span style="color: #333333;">/</span>Animal<span style="color: #333333;">;)</span>V
</pre>
</div>
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;">[</span>centos<span style="color: #555555; font-weight: bold;">@guru</span> bin<span style="color: #333333;">]</span>$ java <span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span>AOTLibrary<span style="color: #333333;">=./</span>libanimals<span style="color: #333333;">.</span><span style="color: #0000cc;">so</span> <span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">+</span>UnlockDiagnosticVMOptions <span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">+</span>PrintAOT <span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">+</span>UseAOTStrictLoading <span style="color: #333333;">-</span><span style="color: #997700; font-weight: bold;">XX:</span><span style="color: #333333;">+</span>UseAOT <span style="color: #333333;">-</span>jar app<span style="color: #333333;">.</span><span style="color: #0000cc;">jar</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">application</span><span style="color: #333333;">.</span><span style="color: #0000cc;">AnimalApp</span>
<span style="color: #0000dd; font-weight: bold;">11</span> <span style="color: #0000dd; font-weight: bold;">1</span> loaded <span style="color: #333333;">./</span>libanimals<span style="color: #333333;">.</span><span style="color: #0000cc;">so</span> aot library
<span style="color: #0000dd; font-weight: bold;">144</span> <span style="color: #0000dd; font-weight: bold;">1</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">application</span><span style="color: #333333;">.</span><span style="color: #0000cc;">AnimalApp</span><span style="color: #333333;">.<</span>init<span style="color: #333333;">>()</span>V
<span style="color: #0000dd; font-weight: bold;">144</span> <span style="color: #0000dd; font-weight: bold;">2</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">application</span><span style="color: #333333;">.</span><span style="color: #0000cc;">AnimalApp</span><span style="color: #333333;">.</span><span style="color: #0000cc;">lambda</span>$main$1<span style="color: #333333;">(</span>Lcom<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/</span>domain<span style="color: #333333;">/</span>Animal<span style="color: #333333;">;)</span>Z
<span style="color: #0000dd; font-weight: bold;">144</span> <span style="color: #0000dd; font-weight: bold;">3</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">application</span><span style="color: #333333;">.</span><span style="color: #0000cc;">AnimalApp</span><span style="color: #333333;">.</span><span style="color: #0000cc;">lambda</span>$main$0<span style="color: #333333;">(</span>Ljava<span style="color: #333333;">/</span>lang<span style="color: #333333;">/</span>Class<span style="color: #333333;">;</span>Lcom<span style="color: #333333;">/</span>example<span style="color: #333333;">/</span>animals<span style="color: #333333;">/</span>domain<span style="color: #333333;">/</span>Animal<span style="color: #333333;">;)</span>V
<span style="color: #0000dd; font-weight: bold;">144</span> <span style="color: #0000dd; font-weight: bold;">4</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">application</span><span style="color: #333333;">.</span><span style="color: #0000cc;">AnimalApp</span><span style="color: #333333;">.</span><span style="color: #0000cc;">main</span><span style="color: #333333;">([</span>Ljava<span style="color: #333333;">/</span>lang<span style="color: #333333;">/</span>String<span style="color: #333333;">;)</span>V
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">5</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Animal</span><span style="color: #333333;">.</span><span style="color: #0000cc;">getLegs</span><span style="color: #333333;">()</span>I
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">6</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Animal</span><span style="color: #333333;">.<</span>init<span style="color: #333333;">>(</span>I<span style="color: #333333;">)</span>V
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">7</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Animal</span><span style="color: #333333;">.</span><span style="color: #0000cc;">walk</span><span style="color: #333333;">()</span>V
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">8</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Cat</span><span style="color: #333333;">.<</span>init<span style="color: #333333;">>(</span>Ljava<span style="color: #333333;">/</span>lang<span style="color: #333333;">/</span>String<span style="color: #333333;">;)</span>V
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">9</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Cat</span><span style="color: #333333;">.<</span>init<span style="color: #333333;">>()</span>V
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">10</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Cat</span><span style="color: #333333;">.</span><span style="color: #0000cc;">play</span><span style="color: #333333;">()</span>V
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">11</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Cat</span><span style="color: #333333;">.</span><span style="color: #0000cc;">eat</span><span style="color: #333333;">()</span>V
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">12</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Cat</span><span style="color: #333333;">.</span><span style="color: #0000cc;">toString</span><span style="color: #333333;">()</span>Ljava<span style="color: #333333;">/</span>lang<span style="color: #333333;">/</span>String<span style="color: #333333;">;</span>
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">13</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Cat</span><span style="color: #333333;">.</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">()</span>Ljava<span style="color: #333333;">/</span>lang<span style="color: #333333;">/</span>String<span style="color: #333333;">;</span>
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">14</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Cat</span><span style="color: #333333;">.</span><span style="color: #0000cc;">setName</span><span style="color: #333333;">(</span>Ljava<span style="color: #333333;">/</span>lang<span style="color: #333333;">/</span>String<span style="color: #333333;">;)</span>V
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">15</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Spider</span><span style="color: #333333;">.<</span>init<span style="color: #333333;">>()</span>V
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">16</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Spider</span><span style="color: #333333;">.</span><span style="color: #0000cc;">eat</span><span style="color: #333333;">()</span>V
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">17</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Spider</span><span style="color: #333333;">.</span><span style="color: #0000cc;">toString</span><span style="color: #333333;">()</span>Ljava<span style="color: #333333;">/</span>lang<span style="color: #333333;">/</span>String<span style="color: #333333;">;</span>
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">18</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Fish</span><span style="color: #333333;">.<</span>init<span style="color: #333333;">>(</span>Ljava<span style="color: #333333;">/</span>lang<span style="color: #333333;">/</span>String<span style="color: #333333;">;)</span>V
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">19</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Fish</span><span style="color: #333333;">.<</span>init<span style="color: #333333;">>()</span>V
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">20</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Fish</span><span style="color: #333333;">.</span><span style="color: #0000cc;">play</span><span style="color: #333333;">()</span>V
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">21</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Fish</span><span style="color: #333333;">.</span><span style="color: #0000cc;">toString</span><span style="color: #333333;">()</span>Ljava<span style="color: #333333;">/</span>lang<span style="color: #333333;">/</span>String<span style="color: #333333;">;</span>
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">22</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Fish</span><span style="color: #333333;">.</span><span style="color: #0000cc;">eat</span><span style="color: #333333;">()</span>V
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">23</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Fish</span><span style="color: #333333;">.</span><span style="color: #0000cc;">getName</span><span style="color: #333333;">()</span>Ljava<span style="color: #333333;">/</span>lang<span style="color: #333333;">/</span>String<span style="color: #333333;">;</span>
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">24</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Fish</span><span style="color: #333333;">.</span><span style="color: #0000cc;">setName</span><span style="color: #333333;">(</span>Ljava<span style="color: #333333;">/</span>lang<span style="color: #333333;">/</span>String<span style="color: #333333;">;)</span>V
<span style="color: #0000dd; font-weight: bold;">181</span> <span style="color: #0000dd; font-weight: bold;">25</span> aot<span style="color: #333333;">[</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">]</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Fish</span><span style="color: #333333;">.</span><span style="color: #0000cc;">walk</span><span style="color: #333333;">()</span>V
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>jaotc</b> derlenen ve çalıştırılan kod parçaları başlangıçta yorumlamalı çalıştırmaya göre kesinlikle daha hızlı çalışacaktır. Üstelik başlangıç bu kodun <b>JIT</b>'lenmesi için zaman kaybedilmediği için uygulamamız potansiyel olarak daha hızlı açılacak ve hızlı çalışacaktır. <b>AOT</b> kullanmadan önceki ve sonraki başarımı mutlaka ölçmelisiniz! </span>Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-58941505261655234462017-07-16T22:07:00.000+03:002017-07-17T22:47:17.835+03:00Java Sanal Makinasında Sınıf Yükleme Başarımının İyileştirilmesi<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOyqcC7n4izyZihBw0oRGSwvIEFUUSCp0hhI3DAuQ4TUfQwaujUSaFw0JnLPE4llqolWbaegrudNd_ZuCf_zXtKsS8cwjONnzOr-DFT-lXDWrWollCtzLusBLNzO1jNb4vAP-0XXcVPKbY/s1600/java-class-loading.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1178" data-original-width="825" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOyqcC7n4izyZihBw0oRGSwvIEFUUSCp0hhI3DAuQ4TUfQwaujUSaFw0JnLPE4llqolWbaegrudNd_ZuCf_zXtKsS8cwjONnzOr-DFT-lXDWrWollCtzLusBLNzO1jNb4vAP-0XXcVPKbY/s320/java-class-loading.png" width="224" /></a></div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Java uygulamaları çalışabilmek için <b>Java Sanal Makinasına</b> (=<b>JSM</b>) ihtiyaç duyarlar. JSM içinde uygulamanın başarımını belirleyen üç temel bileşen yer alır: </span><br />
<ul>
<li><b style="font-family: Georgia, "Times New Roman", serif;">JIT</b><span style="font-family: "georgia" , "times new roman" , serif;"> (Just-In-Time) </span><b style="font-family: Georgia, "Times New Roman", serif;">Derleyici</b></li>
</ul>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">JIT derleyici bytecode’ları JSM’nin üzerinde çalıştığı platformun anlayacağı, örneğin Intel komutlarına dönüştürür. Üstelik bunu yaparken devingen en iyileme de yapar. Bunun için uygulamanın basit bir kesitini (=profiling) alır. Bu kesit bilgisine göre onlarca en iyileme tekniğinden hangilerini uygulayacağına karar verir. </span></blockquote>
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>Çöp Toplayıcı</b></span></li>
</ul>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Yürütme zamanında ortaya çıkan bellek ihtiyacını ise <b>Heap </b>olarak adlandırılan bir bellek alanından <b>new </b>işlecini kullanarak karşılıyoruz. <b>new </b>ile aldığımız alanı işimiz bitince geri vermemiz gerekmez. Bu alanın yönetiminden <b>Çöp Toplayıcı</b> sorumludur. <b>Çöp toplayıcı</b>, temel olarak <b>Heap</b>’de canlı nesneleri saptar ve ölü nesneleri yeniden kullanılabilir bellek alanlarına dönüştürür. <b>Çöp toplayıcı</b> geliştiricinin üzerinden önemli bir yükü alır. Ancak bunun için yürütme zamanında bir bedel ödenir. <b>HotSpot </b>içinde çok sayıda çöp toplayıcı yer alır. Bunlardan hangilerinin seçileceği ve en iyilenmesi önemli bir konudur. <b>JDK 7u4</b> ile birlikte <b>G1GC</b> (<b>Garbage First</b>) olarak adlandırılan yeni bir çöp toplayıcısı geldi. <b>Java 8</b>'de <b>G1GC</b> olgunlaştı ve nihayet <b>Java 9</b> ile birlikte varsayılan çöp toplayıcısı <b>G1GC</b> oluyor.</span></blockquote>
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>Sınıf Yükleyici</b> (=class loader)</span></li>
</ul>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Java, nesneye dayalı bir programlama dilidir. Bu nedenle, her kavramı sınıf ile modelliyoruz ve sınıflardan yarattığımız nesneler ile de problemleri çözmeye çalışıyoruz. Dolayısı ile bir Java uygulaması, çok sayıda sınıftan oluşur. Sınıf yükleyicisinin görevi, sınıfları ihtiyaç duyuldukça belleğe, bellekte özel bir alana yüklemektir. <b>Java 7</b>'ye kadar bu alanın adı <b>Perm</b>[enant] <b>Gen</b>[eration], <b>Java 8</b>'den itibaren ise <b>Meta Space</b> olarak adlandırılmaktadır. Uygulamayı çalıştırdığımızda, sınıf yükleyicisi sınıfların hepsini birden tek bir seferde bu alana yüklenmez, biraz tembellik eder. İlk ihtiyaç duyulduğunda sınıf yüklenir. Sınıfların yüklenmesi programatik olarak da yönlendirilebilir. <b>Sınıf Yükleyici</b>, sadece sınıfı belleğe yüklemez, önce <b>class </b>dosya formatına uygunluğunu sınar, güvenlik kontrolü yapar ve nihayetinde bu denetimlerden geçebilirse belleğe yükler. Sınıf yüklemenin başarımı, ağırlıklı olarak, uygulamanın açılış süresi başarımını etkiler. <b>Java 7</b>'den itibaren <b>Sınıf Yükleyici</b> birden fazla iplik (=thread) tarafından paralel olarak çalıştırılabilir.</span></blockquote>
<span style="font-family: "georgia" , "times new roman" , serif;">Sınıf yükleme başarımını arttırmak için uygulayabileceğimiz iki yöntem bulunuyor:</span><br />
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>Güvenlik Kontrolünü kaldırmak</b></span></li>
</ul>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Eğer <b>jar</b> dosyaları uzaktan yüklenmiyorsa ve işletim sisteminin güvenliği sağlanmışsa Sınıf Yükleyicisinden bu adımı atlamasını isteyebiliriz. Bunun için uygulamayı başlatırken <b>-Xverify:none</b> seçeneğini sağlamamız yeterli olacaktır. Aşağıda <b>Spring MVC</b> ve <b>Spring Data</b> çatılarının kullanıldığı bir </span><span style="font-family: "georgia" , "times new roman" , serif;"><b>Spring Boot</b> </span><span style="font-family: "georgia" , "times new roman" , serif;">uygulamasının açılış zamanlarına ilişkin istatistiksel bilgiler paylaşılmıştır. Uygulama <b>-Xverify:none</b> seçeneği kullanılmadan, <i>beş kere</i> çalıştırıldığında, açılış süreleri aşağıdaki gibi gerçekleşmiştir:</span></blockquote>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">Started SpringBootApplication in 7.381 seconds (JVM running for 8.275)</span>
<span style="color: #888888;">Started SpringBootApplication in 8.409 seconds (JVM running for 9.436)</span>
<span style="color: #888888;">Started SpringBootApplication in 7.559 seconds (JVM running for 8.449)</span>
<span style="color: #888888;">Started SpringBootApplication in 7.306 seconds (JVM running for 8.258)</span>
<span style="color: #888888;">Started SpringBootApplication in 7.97 seconds (JVM running for 8.856)</span></pre>
</div>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Uygulama yine beş defa, bu kez <b>-Xverify:none</b> seçeneği ile başlatıldığında, açılış süreleri aşağıdaki gibi gerçekleşmiştir:</span></blockquote>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">Started SpringBootApplication in 7.01 seconds (JVM running for 7.908)</span>
<span style="color: #888888;">Started SpringBootApplication in 6.889 seconds (JVM running for 7.746)</span>
<span style="color: #888888;">Started SpringBootApplication in 6.733 seconds (JVM running for 7.572)</span>
<span style="color: #888888;">Started SpringBootApplication in 6.673 seconds (JVM running for 7.761)</span>
<span style="color: #888888;">Started SpringBootApplication in 6.741 seconds (JVM running for 7.556)</span>
</pre>
</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK_ML2GEUlJwuD3s8CeYpMXPkrn6MtC3I0hfAXInqkt_lOARfhFi0Kmni9WDfRqfpOsbEEyYgpoWiNSEYgOQNYSpP9OgQrIBgyEuzKxiNpwTzYhFQN9O4xly7ra7PDpT8SfIk0OUOgbHXp/s1600/class-loading-fig1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="339" data-original-width="702" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK_ML2GEUlJwuD3s8CeYpMXPkrn6MtC3I0hfAXInqkt_lOARfhFi0Kmni9WDfRqfpOsbEEyYgpoWiNSEYgOQNYSpP9OgQrIBgyEuzKxiNpwTzYhFQN9O4xly7ra7PDpT8SfIk0OUOgbHXp/s1600/class-loading-fig1.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b>Açılış süresi karşılaştırması</b></span></td></tr>
</tbody></table>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Sınıf yükleyicinin .class dosyalarını yüklerken, güvenlik denetimi </span><span style="font-family: "georgia" , "times new roman" , serif;">özelliği kapatılırsa, açılış süresi <i>ortalama </i><b>0.94</b> saniye kadar kısalmaktadır. Bu değer açılış süresinde <b>%10'a kadar ulaşan</b> bir iyileşme anlamına gelmektedir.</span></blockquote>
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>Class Data Sharing (CDS)</b></span></li>
</ul>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Eğer bir makinada çok sayıda Java uygulaması çalışıyorsa, uygulamalar arasında sınıf metadata bilgisi paylaşılabilinir. Bunun için sınıf metadatasını bir kez oluşturmak gerekir. <b>JDK 8u40</b>'dan önce sadece <b>JDK </b>içinde yer alan temel sınıflar için sınıf metadata paylaşımı mümkündü. </span><b style="font-family: georgia, "times new roman", serif;">JDK 8u40</b><span style="font-family: "georgia" , "times new roman" , serif;">'dan itibaren sınıf metadatasının paylaşılmasını istediğimiz sınıfların listesini Java Sanal Makinasına verebiliyoruz. Uygulamanın eriştiği sınıfların listesini almak için uygulamayı bir kez <b>-XX:DumpLoadedClassList</b> seçeneği ile çalıştırmak ve sınıf listesini diske kaydetmek gerekir:</span></blockquote>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">c:\tmp>java -version</span>
<span style="color: #888888;">java version "1.8.0_131"</span>
<span style="color: #888888;">Java(TM) SE Runtime Environment (build 1.8.0_131-b11)</span>
<span style="color: #888888;">Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)</span>
<span style="color: #888888;">c:\tmp>java -XX:DumpLoadedClassList=list.txt -jar Java2D.jar</span>
</pre>
</div>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Ardından sınıf metadatasını aşağıdaki komutla yaratabiliriz:</span></blockquote>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">c:\tmp>java -XX:+UnlockCommercialFeatures -XX:+UseAppCDS -XX:SharedClassListFile=list.txt -Xshare:dump</span>
<span style="color: #888888;">Allocated shared space: 37879808 bytes at 0x0000000800000000</span>
<span style="color: #888888;">Loading classes to share ...</span>
<span style="color: #888888;">Loading classes to share: done.</span>
<span style="color: #888888;">Rewriting and linking classes ...</span>
<span style="color: #888888;">Rewriting and linking classes: done</span>
<span style="color: #888888;">Number of classes 2284</span>
<span style="color: #888888;"> instance classes = 2270</span>
<span style="color: #888888;"> obj array classes = 6</span>
<span style="color: #888888;"> type array classes = 8</span>
<span style="color: #888888;">Calculating fingerprints ... done.</span>
<span style="color: #888888;">Removing unshareable information ... done.</span>
<span style="color: #888888;">Shared Lookup Cache Table Buckets = 8216 bytes</span>
<span style="color: #888888;">Shared Lookup Cache Table Body = 64736 bytes</span>
<span style="color: #888888;">ro space: 6381128 [ 36.5% of total] out of 16777216 bytes [38.0% used] at 0x0000000800000000</span>
<span style="color: #888888;">rw space: 9590512 [ 54.9% of total] out of 16777216 bytes [57.2% used] at 0x0000000801000000</span>
<span style="color: #888888;">md space: 1477592 [ 8.5% of total] out of 4194304 bytes [35.2% used] at 0x0000000802000000</span>
<span style="color: #888888;">mc space: 34053 [ 0.2% of total] out of 131072 bytes [26.0% used] at 0x0000000802400000</span>
<span style="color: #888888;">total : 17483285 [100.0% of total] out of 37879808 bytes [46.2% used]</span>
</pre>
</div>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Artık uygulamayı CDS özelliği açık olacak şekilde başlatabiliriz:</span></blockquote>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">c:\tmp>start java -XX:+UnlockCommercialFeatures -XX:+UseAppCDS -Xshare:on -jar Java2D.jar</span>
</pre>
</div>
<br />Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-77986899225238563692017-07-16T15:22:00.000+03:002017-07-17T08:21:02.096+03:00Java'da Çok Şekillilik Üzerine Bir Örnek<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitpheRdv446jTVR8o_c17Rm-VpPVwCoXdyKSk0ykdK31Tuonh49Te2bF6CGvUpEYmpZjrWCLIhA4sqhhBacqGYb8T4OR_U1i_tRNNbKr1-POe2oY0Mf5H6t5YE2kjVOX6h1ht6ZHqbdGKG/s1600/terminator-polymorphism.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="480" data-original-width="853" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitpheRdv446jTVR8o_c17Rm-VpPVwCoXdyKSk0ykdK31Tuonh49Te2bF6CGvUpEYmpZjrWCLIhA4sqhhBacqGYb8T4OR_U1i_tRNNbKr1-POe2oY0Mf5H6t5YE2kjVOX6h1ht6ZHqbdGKG/s640/terminator-polymorphism.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><div style="text-align: left;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b>John Connor</b>: Wait a minute here. You're telling me that this thing can imitate anything it touches?</span></div>
<div style="text-align: left;">
<span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b>The Terminator</b>: Anything it samples by physical contact. </span></div>
</td></tr>
</tbody></table>
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br /></b></span>
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Çok şekillik</b>, <b><i>Nesneye Dayalı Programlamanın</i></b> en önemli mekanizmasıdır. Aşağıda çok şekilliliğin </span><b style="font-family: georgia, "times new roman", serif;">Java</b><span style="font-family: "georgia" , "times new roman" , serif;">'da </span><span style="font-family: "georgia" , "times new roman" , serif;">nasıl çalıştığını incelememizi sağlayacak bir kod örneği verilmiştir:</span><br />
<br />
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span style="background-color: white; color: #008800; font-weight: bold;">package</span><span style="background-color: white;"> com</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">example</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">polymorphism</span><span style="background-color: white; color: #333333;">;</span><span style="background-color: white;">
</span><span style="background-color: white; color: #888888;">/**</span><span style="background-color: white;">
</span><span style="background-color: white; color: #888888;"> * </span><span style="background-color: white;">
</span><span style="background-color: white; color: #888888;"> * @author Binnur KURT (binnur.kurt@gmail.com)</span><span style="background-color: white;">
</span><span style="background-color: white; color: #888888;"> *</span><span style="background-color: white;">
</span><span style="background-color: white; color: #888888;"> */</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">public</span><span style="background-color: white;"> </span><span style="background-color: white; color: #008800; font-weight: bold;">class</span><span style="background-color: white;"> </span><span style="background-color: white; color: #bb0066; font-weight: bold;">Question</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333333;">{</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">public</span><span style="background-color: white;"> </span><span style="background-color: white; color: #008800; font-weight: bold;">static</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333399; font-weight: bold;">void</span><span style="background-color: white;"> </span><span style="background-color: white; color: #0066bb; font-weight: bold;">main</span><span style="background-color: white; color: #333333;">(</span><span style="background-color: white;">String</span><span style="background-color: white; color: #333333;">[]</span><span style="background-color: white;"> args</span><span style="background-color: white; color: #333333;">)</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333333;">{</span><span style="background-color: white;">
C c </span><span style="background-color: white; color: #333333;">=</span><span style="background-color: white;"> </span><span style="background-color: white; color: #008800; font-weight: bold;">new</span><span style="background-color: white;"> C</span><span style="background-color: white; color: #333333;">(</span><span style="background-color: white; color: #0000dd; font-weight: bold;">2</span><span style="background-color: white; color: #333333;">);</span><span style="background-color: white;">
A a </span><span style="background-color: white; color: #333333;">=</span><span style="background-color: white;"> c</span><span style="background-color: white; color: #333333;">;</span><span style="background-color: white;">
B b </span><span style="background-color: white; color: #333333;">=</span><span style="background-color: white;"> c</span><span style="background-color: white; color: #333333;">;</span><span style="background-color: white;">
System</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">out</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">println</span><span style="background-color: white; color: #333333;">(</span><span style="background-color: white;">a</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">x</span><span style="background-color: white; color: #333333;">);</span><span style="background-color: white;">
System</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">out</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">println</span><span style="background-color: white; color: #333333;">(</span><span style="background-color: white;">b</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">x</span><span style="background-color: white; color: #333333;">);</span><span style="background-color: white;">
System</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">out</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">println</span><span style="background-color: white; color: #333333;">(</span><span style="background-color: white;">c</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">x</span><span style="background-color: white; color: #333333;">);</span><span style="background-color: white;">
System</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">out</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">println</span><span style="background-color: white; color: #333333;">(((</span><span style="background-color: white;">A</span><span style="background-color: white; color: #333333;">)</span><span style="background-color: white;"> c</span><span style="background-color: white; color: #333333;">).</span><span style="background-color: white; color: #0000cc;">x</span><span style="background-color: white; color: #333333;">);</span><span style="background-color: white;">
System</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">out</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">println</span><span style="background-color: white; color: #333333;">(((</span><span style="background-color: white;">B</span><span style="background-color: white; color: #333333;">)</span><span style="background-color: white;"> c</span><span style="background-color: white; color: #333333;">).</span><span style="background-color: white; color: #0000cc;">x</span><span style="background-color: white; color: #333333;">);</span><span style="background-color: white;">
System</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">out</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">println</span><span style="background-color: white; color: #333333;">(((</span><span style="background-color: white;">A</span><span style="background-color: white; color: #333333;">)</span><span style="background-color: white;"> b</span><span style="background-color: white; color: #333333;">).</span><span style="background-color: white; color: #0000cc;">x</span><span style="background-color: white; color: #333333;">);</span><span style="background-color: white;">
System</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">out</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">println</span><span style="background-color: white; color: #333333;">(</span><span style="background-color: white;">a</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">getX</span><span style="background-color: white; color: #333333;">());</span><span style="background-color: white;">
System</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">out</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">println</span><span style="background-color: white; color: #333333;">(</span><span style="background-color: white;">b</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">getX</span><span style="background-color: white; color: #333333;">());</span><span style="background-color: white;">
System</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">out</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">println</span><span style="background-color: white; color: #333333;">(</span><span style="background-color: white;">c</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">getX</span><span style="background-color: white; color: #333333;">());</span><span style="background-color: white;">
System</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">out</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">println</span><span style="background-color: white; color: #333333;">(((</span><span style="background-color: white;">A</span><span style="background-color: white; color: #333333;">)</span><span style="background-color: white;"> c</span><span style="background-color: white; color: #333333;">).</span><span style="background-color: white; color: #0000cc;">getX</span><span style="background-color: white; color: #333333;">());</span><span style="background-color: white;">
System</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">out</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">println</span><span style="background-color: white; color: #333333;">(((</span><span style="background-color: white;">B</span><span style="background-color: white; color: #333333;">)</span><span style="background-color: white;"> c</span><span style="background-color: white; color: #333333;">).</span><span style="background-color: white; color: #0000cc;">getX</span><span style="background-color: white; color: #333333;">());</span><span style="background-color: white;">
System</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">out</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">println</span><span style="background-color: white; color: #333333;">(((</span><span style="background-color: white;">A</span><span style="background-color: white; color: #333333;">)</span><span style="background-color: white;"> b</span><span style="background-color: white; color: #333333;">).</span><span style="background-color: white; color: #0000cc;">getX</span><span style="background-color: white; color: #333333;">());</span><span style="background-color: white;">
</span><span style="background-color: white; color: #333333;">}</span><span style="background-color: white;">
</span><span style="background-color: white; color: #333333;">}</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">class</span><span style="background-color: white;"> </span><span style="background-color: white; color: #bb0066; font-weight: bold;">A</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333333;">{</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">public</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333399; font-weight: bold;">int</span><span style="background-color: white;"> x</span><span style="background-color: white; color: #333333;">;</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">public</span><span style="background-color: white;"> </span><span style="background-color: white; color: #0066bb; font-weight: bold;">A</span><span style="background-color: white; color: #333333;">(</span><span style="background-color: white; color: #333399; font-weight: bold;">int</span><span style="background-color: white;"> x</span><span style="background-color: white; color: #333333;">)</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333333;">{</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">this</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">x</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333333;">=</span><span style="background-color: white;"> x</span><span style="background-color: white; color: #333333;">;</span><span style="background-color: white;">
</span><span style="background-color: white; color: #333333;">}</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">public</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333399; font-weight: bold;">int</span><span style="background-color: white;"> </span><span style="background-color: white; color: #0066bb; font-weight: bold;">getX</span><span style="background-color: white; color: #333333;">()</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333333;">{</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">return</span><span style="background-color: white;"> x</span><span style="background-color: white; color: #333333;">;</span><span style="background-color: white;">
</span><span style="background-color: white; color: #333333;">}</span><span style="background-color: white;">
</span><span style="background-color: white; color: #333333;">}</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">class</span><span style="background-color: white;"> </span><span style="background-color: white; color: #bb0066; font-weight: bold;">B</span><span style="background-color: white;"> </span><span style="background-color: white; color: #008800; font-weight: bold;">extends</span><span style="background-color: white;"> A </span><span style="background-color: white; color: #333333;">{</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">public</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333399; font-weight: bold;">int</span><span style="background-color: white;"> x</span><span style="background-color: white; color: #333333;">;</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">public</span><span style="background-color: white;"> </span><span style="background-color: white; color: #0066bb; font-weight: bold;">B</span><span style="background-color: white; color: #333333;">(</span><span style="background-color: white; color: #333399; font-weight: bold;">int</span><span style="background-color: white;"> x</span><span style="background-color: white; color: #333333;">)</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333333;">{</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">super</span><span style="background-color: white; color: #333333;">(</span><span style="background-color: white; color: #0000dd; font-weight: bold;">3</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333333;">*</span><span style="background-color: white;"> x</span><span style="background-color: white; color: #333333;">);</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">this</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">x</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333333;">=</span><span style="background-color: white;"> x</span><span style="background-color: white; color: #333333;">;</span><span style="background-color: white;">
</span><span style="background-color: white; color: #333333;">}</span><span style="background-color: white;">
</span><span style="background-color: white; color: #555555; font-weight: bold;">@Override</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">public</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333399; font-weight: bold;">int</span><span style="background-color: white;"> </span><span style="background-color: white; color: #0066bb; font-weight: bold;">getX</span><span style="background-color: white; color: #333333;">()</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333333;">{</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">return</span><span style="background-color: white;"> x</span><span style="background-color: white; color: #333333;">;</span><span style="background-color: white;">
</span><span style="background-color: white; color: #333333;">}</span><span style="background-color: white;">
</span><span style="background-color: white; color: #333333;">}</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">class</span><span style="background-color: white;"> </span><span style="background-color: white; color: #bb0066; font-weight: bold;">C</span><span style="background-color: white;"> </span><span style="background-color: white; color: #008800; font-weight: bold;">extends</span><span style="background-color: white;"> B </span><span style="background-color: white; color: #333333;">{</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">public</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333399; font-weight: bold;">int</span><span style="background-color: white;"> x</span><span style="background-color: white; color: #333333;">;</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">public</span><span style="background-color: white;"> </span><span style="background-color: white; color: #0066bb; font-weight: bold;">C</span><span style="background-color: white; color: #333333;">(</span><span style="background-color: white; color: #333399; font-weight: bold;">int</span><span style="background-color: white;"> x</span><span style="background-color: white; color: #333333;">)</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333333;">{</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">super</span><span style="background-color: white; color: #333333;">(</span><span style="background-color: white; color: #0000dd; font-weight: bold;">2</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333333;">*</span><span style="background-color: white;"> x</span><span style="background-color: white; color: #333333;">);</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">this</span><span style="background-color: white; color: #333333;">.</span><span style="background-color: white; color: #0000cc;">x</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333333;">=</span><span style="background-color: white;"> x</span><span style="background-color: white; color: #333333;">;</span><span style="background-color: white;">
</span><span style="background-color: white; color: #333333;">}</span><span style="background-color: white;">
</span><span style="background-color: white; color: #555555; font-weight: bold;">@Override</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">public</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333399; font-weight: bold;">int</span><span style="background-color: white;"> </span><span style="background-color: white; color: #0066bb; font-weight: bold;">getX</span><span style="background-color: white; color: #333333;">()</span><span style="background-color: white;"> </span><span style="background-color: white; color: #333333;">{</span><span style="background-color: white;">
</span><span style="background-color: white; color: #008800; font-weight: bold;">return</span><span style="background-color: white;"> x</span><span style="background-color: white; color: #333333;">;</span><span style="background-color: white;">
</span><span style="background-color: white; color: #333333;">}</span><span style="background-color: white;">
</span><span style="background-color: white; color: #333333;">}</span>
</pre>
</div>
<span style="font-family: "georgia" , "times new roman" , serif;"></span><br />
<div>
<span style="font-family: "georgia" , "times new roman" , serif;"><span style="font-family: "georgia" , "times new roman" , serif;"><br /></span></span></div>
<span style="font-family: "georgia" , "times new roman" , serif;">
Öncelikli olarak <b>C c= new C(2)</b> satırında <b>C</b> tipinden bir nesne yaratıldığında bellekte oluşan yapıyı anlamamız gerekir. Aşağıdaki şekilde <b>A</b>, <b>B</b> ve <b>C</b> tipinden referansları ve <b>C</b> tipinden nesne arasındaki bellekteki ilişki verilmiştir:</span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7HLy-2avZct_xOXI_Ck3IMQlZOjEFzVizTh30zh_gibhOrbG7EJ96sVqn8gA0qL8JWl5uYRj8rLtg_k9gf9b70FIXsWf-Dx5fMWtmfThhk2HT6DN_8RdxpByzSp9GiY4PHyEimcFG2a17/s1600/polymorphism-fig-01.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="167" data-original-width="174" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7HLy-2avZct_xOXI_Ck3IMQlZOjEFzVizTh30zh_gibhOrbG7EJ96sVqn8gA0qL8JWl5uYRj8rLtg_k9gf9b70FIXsWf-Dx5fMWtmfThhk2HT6DN_8RdxpByzSp9GiY4PHyEimcFG2a17/s1600/polymorphism-fig-01.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: left;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">Önce <b>C</b> tipinden <b>c</b> referansı yaratılır. <b>c</b> değişkeni bir fonksiyon bloğunda tanımlandığı için <b><i>yığında</i></b> (=<i><b>stack</b></i>) yaratılacaktır. O nedenle kutunun üzerine <b>S</b> etiketi koyduk. <b>c</b> bir referans değişkeni olduğu için bir nesnenin referansını taşıyacaktır. Bu nedenle kutunun içine <b>@</b> sembolü koyduk. Ancak kutu henüz geçerli bir nesnenin adresini taşımıyor!</span></td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdST4_ay3VEB71vz_sBlR0ZA932Jryv4Aa-E431n33O4qtEnh3xuRNGbvTvGouaH1RUxtbvogRHr5SSTrmkACdWCi3VFYVXUqtfTt-R_UGPAewhyphenhyphenfPUU2SrjCut3EViLxmO5y0wFrd7bd2/s1600/polymorphism-fig-02.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="409" data-original-width="653" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdST4_ay3VEB71vz_sBlR0ZA932Jryv4Aa-E431n33O4qtEnh3xuRNGbvTvGouaH1RUxtbvogRHr5SSTrmkACdWCi3VFYVXUqtfTt-R_UGPAewhyphenhyphenfPUU2SrjCut3EViLxmO5y0wFrd7bd2/s1600/polymorphism-fig-02.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><b>Java</b>'da tüm nesneler Heap'de yaratılır. Bu nedenle bu nesnelere <b>Heap nesnesi</b> de denir. <b>Java Sanal Makinası</b> bazı özel durumlarda başarım için bir nesneyi yığında da yaratabilir. Bu durumu göz ardı edip, <b>C</b> tipinden nesneyi <b>Heap</b>'de yaratmaya başlayalım. Bir sınıftan nesne yaratılırken <b><i>sadece </i></b>öznitelikleri için bellekten yer ayrılır. Her nesnenin bellekteki diziliminde bir <b>başlık </b>kısmı bulunur. Bu başlık kısımında nesnenin <b>sanal tablosuna</b> bir referans, çeşitli sayaçlar gibi bilgiler bulunur. Ancak aşağıdaki çizimlerde, basitlik için bu başlık kısmını gözardı edeceğiz. <b>C</b> sınıfı <b><i>yalın bir sınıf </i></b>değil: önce <b>B</b> sınıfından, <b>B</b> sınıfı da <b>A</b> sınıfından türetilmiş durumda. Elbette <b>A</b> sınıfı da <b>Object </b>sınıfından türetilmiş ancak bu durumu şimdilik göz ardı edelim. Önce <b>A</b> sınıfından gelen veriler için bellekte yer ayrılır. Ardından <b>A</b> sınıfından gelen <b><i>x</i></b>'i ilklendirmek üzere <b>A</b> sınıfının kurucu fonksiyonu çalılşacaktır. Peki, <b>A</b> sınıfının kurucu fonksiyonu parametre değerini nasıl alır? <b>Java</b>'da <i>temel sınıfın</i> tüm özellikleri <b>kalıtılımla</b> <i>türetilmiş sınıfa</i> geçer, <b>kurucu fonksiyonlar hariç</b>! Temel sınıfın kurucu fonksiyonu türetilmiş sınıfın kurucu fonksiyonu değildir! Türetilmiş sınıf için de bir <b>kurucu fonksiyon yazmak gerekir</b>. Üstelik türetilmiş sınıf için yazdığımız kurucu fonksiyon ilk iş olarak temel sınıfın kurucusu fonksiyonunu <b>super</b> anahtar kelimesi ile çağırmak zorundadır. Örneğimizde <b>C</b> sınıfının kurucu fonksiyonu <b>super(2*<i>x</i>)</b> ile <b>B</b>'nin kurucu fonksiyonunu ve <b>B</b>'nin kurucu fonksiyonu da <b>super(3*<i>x</i>)</b> ile <b>A</b>'nın kurucu fonksiyonunu çağırmaktadır: <b>C(<i>2</i>) </b></span><b><span style="font-size: large;">→</span><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"> B(<i>4</i>) </span><span style="font-size: large;">→</span></b><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><b> C(</b><i style="font-weight: bold;">12</i><b>)</b>. Bu sayede <b>A</b> kurucu fonksiyonu <b><i>12</i></b> parametresi ile çağrılmış olur. O halde <b>A</b> sınıfından gelen <i><b>x</b></i>'in değeri <b><i>12</i></b> olur.</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><img border="0" data-original-height="405" data-original-width="652" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihGUS49mz7X_o-h9GmLO3M2MIiw0OBQDWwicEntNuM-mnG9vGZoZOjOrda52ZxEEJjCMqbvc5gotahFyyK9NNKUaoY2REuLnbOxKfbwuzTQzqvx8sRw-2lDXXx7-6NW8zDWmHeKnv_KG7f/s1600/polymorphism-fig-03.png" style="margin-left: auto; margin-right: auto;" /></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">Daha sonra <b>B</b>'den gelen <b><i>x</i></b> için <b>Heap</b>'de yer ayrılır ve ardından <b>B</b>'nin kurucusu bu <b><i>x</i></b>'e ilk değerini atar: <b><i>4</i></b>.</span></td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihGUS49mz7X_o-h9GmLO3M2MIiw0OBQDWwicEntNuM-mnG9vGZoZOjOrda52ZxEEJjCMqbvc5gotahFyyK9NNKUaoY2REuLnbOxKfbwuzTQzqvx8sRw-2lDXXx7-6NW8zDWmHeKnv_KG7f/s1600/polymorphism-fig-03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><br /></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihGUS49mz7X_o-h9GmLO3M2MIiw0OBQDWwicEntNuM-mnG9vGZoZOjOrda52ZxEEJjCMqbvc5gotahFyyK9NNKUaoY2REuLnbOxKfbwuzTQzqvx8sRw-2lDXXx7-6NW8zDWmHeKnv_KG7f/s1600/polymorphism-fig-03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSADFKs108b-kqivBM-KiQFgiQsNRqEnkfIhv3Kpv1Ew2w06js5bGgyTyPIIXsgjc_feVJfJXnJCbnw6kOuCTBHSnKZ1Yspf-ahswq2AMxcHl8smCfIwLyTkaVPRcCZ3DLer0zL3NZLjvb/s1600/polymorphism-fig-04.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="403" data-original-width="650" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSADFKs108b-kqivBM-KiQFgiQsNRqEnkfIhv3Kpv1Ew2w06js5bGgyTyPIIXsgjc_feVJfJXnJCbnw6kOuCTBHSnKZ1Yspf-ahswq2AMxcHl8smCfIwLyTkaVPRcCZ3DLer0zL3NZLjvb/s1600/polymorphism-fig-04.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">Son olarak, </span><b style="font-family: Georgia, "Times New Roman", serif; font-size: x-large;">C</b><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">'den gelen <i><b>x</b></i> için <b>Heap</b>'de yer ayrılır ve ardından </span><b style="font-family: Georgia, "Times New Roman", serif; font-size: x-large;">C</b><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">'nin kurucusu bu </span><b style="font-family: Georgia, "Times New Roman", serif; font-size: x-large;"><i>x</i></b><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">'e ilk değerini atar: </span><b style="font-family: Georgia, "Times New Roman", serif; font-size: x-large;"><i>12</i></b><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;">. Böylelikle <b>C</b> sınıfından nesne yaratılması işlemi tamamlanmış oluyor.</span></td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrf_60HK9UsY9ZcvDKu-Tb3iJY3wKFE3E9ttxjLQRDpgTOCY6QTpWTmoXN4kelwD1P4XT9YrdIC8FAipO2oN4RI7QP9EULxD8LM-GwR3CXnOgn6xOAvuoaGOUe3mG9ctKRI54fOGPoRRy7/s1600/polymorphism-fig-05.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="404" data-original-width="654" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrf_60HK9UsY9ZcvDKu-Tb3iJY3wKFE3E9ttxjLQRDpgTOCY6QTpWTmoXN4kelwD1P4XT9YrdIC8FAipO2oN4RI7QP9EULxD8LM-GwR3CXnOgn6xOAvuoaGOUe3mG9ctKRI54fOGPoRRy7/s1600/polymorphism-fig-05.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: justify;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><b>A</b> tipinden bir referans hem <b>A</b> tipinden bir nesneye hem de A sınıfından türetilmiş ne kadar sınıf varsa (<b>B</b> ve <b>C</b> sınıfları) hepsini referans edebilir. Bu örnekte <b>A</b> tipinden referansımız olan <b><i>a</i></b> değişkeni de <b>C</b> tipinden bir nesneyi gösteriyor.</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><img border="0" data-original-height="466" data-original-width="649" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmkpQxsEHG5OjZTvvhoDhQdyoPQU1EYebTxQgFpveadhA537_Zqi3V68OsZyxeo1oxcCUACY-Nnm6V8NkqedSzmV9I2NCOhwfbJ8PYNlr3riDHgVxh8v_QtmWX0K9qJx5CTZ1F9QOEXRZP/s1600/polymorphism-fig-06.png" style="margin-left: auto; margin-right: auto;" /></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><b style="font-family: Georgia, "Times New Roman", serif; font-size: x-large; text-align: justify;">B</b><span style="font-family: "georgia" , "times new roman" , serif; font-size: large; text-align: justify;"> tipinden bir referans hem </span><b style="font-family: Georgia, "Times New Roman", serif; font-size: x-large; text-align: justify;">B</b><span style="font-family: "georgia" , "times new roman" , serif; font-size: large; text-align: justify;"> tipinden bir nesneye hem de B sınıfından türetilmiş ne kadar sınıf varsa (sadece</span><span style="font-family: "georgia" , "times new roman" , serif; font-size: large; text-align: justify;"> </span><b style="font-family: Georgia, "Times New Roman", serif; font-size: x-large; text-align: justify;">C</b><span style="font-family: "georgia" , "times new roman" , serif; font-size: large; text-align: justify;"> sınıfı) hepsini referans edebilir. Bu örnekte </span><b style="font-family: Georgia, "Times New Roman", serif; font-size: x-large; text-align: justify;">B</b><span style="font-family: "georgia" , "times new roman" , serif; font-size: large; text-align: justify;"> tipinden referansımız olan </span><b style="font-family: Georgia, "Times New Roman", serif; font-size: x-large; text-align: justify;"><i>b</i></b><span style="font-family: "georgia" , "times new roman" , serif; font-size: large; text-align: justify;"> değişkeni de </span><b style="font-family: Georgia, "Times New Roman", serif; font-size: x-large; text-align: justify;">C</b><span style="font-family: "georgia" , "times new roman" , serif; font-size: large; text-align: justify;"> tipinden bir nesneyi gösteriyor.</span></td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmkpQxsEHG5OjZTvvhoDhQdyoPQU1EYebTxQgFpveadhA537_Zqi3V68OsZyxeo1oxcCUACY-Nnm6V8NkqedSzmV9I2NCOhwfbJ8PYNlr3riDHgVxh8v_QtmWX0K9qJx5CTZ1F9QOEXRZP/s1600/polymorphism-fig-06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><br /></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmkpQxsEHG5OjZTvvhoDhQdyoPQU1EYebTxQgFpveadhA537_Zqi3V68OsZyxeo1oxcCUACY-Nnm6V8NkqedSzmV9I2NCOhwfbJ8PYNlr3riDHgVxh8v_QtmWX0K9qJx5CTZ1F9QOEXRZP/s1600/polymorphism-fig-06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><br />
<span style="font-family: "georgia" , "times new roman" , serif;">Artık aşağıdaki ifade ile bellekte oluşan yapıyı tanıyoruz:</span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">C c <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> C<span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #333333;">);</span>
A a <span style="color: #333333;">=</span> c<span style="color: #333333;">;</span>
B b <span style="color: #333333;">=</span> c<span style="color: #333333;">;</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Şimdi sırayla aşağıdaki kod parçalarının davranışını çalışabiliriz:</span><br />
<br />
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b><i>Referanslar üzerinden özniteliklere erişim</i></b></span></li>
</ul>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Öncelikli olarak yukarıdaki kod parçasının kötü tasarlanmış olduğunu belirtmeliyim. <b>Nesneye Dayalı Programlama</b>da hiç bir zaman öznitelikleri, referans üzerinden, doğrudan erişime açmamalıyız! Verilerimizi gizlemeliyiz! Ancak bu çalışmadaki amacımız <b>dilin inceliklerini</b> ve arka tarafta <b>çalışmasındaki detayları</b> kavramak olacaktır.</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Şimdi aşağıdaki kod parçasının davranışını çalışabiliriz:</span> </blockquote>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>a<span style="color: #333333;">.</span><span style="color: #0000cc;">x</span><span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>b<span style="color: #333333;">.</span><span style="color: #0000cc;">x</span><span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>c<span style="color: #333333;">.</span><span style="color: #0000cc;">x</span><span style="color: #333333;">);</span></pre>
</div>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Verilere referanslar üzerinden erişildiğinde önemli olan referansın gösterdiği nesnenin tipi değil, referansın tanımlandığı tipdir. Bu nedenle <i><b>a.x</b></i>'de <b>A</b> sınıfında tanımlanan <b><i>x</i></b>'in değerine, <b><i>b.x</i></b>'de <b>B</b> sınıfında tanımlanan <b><i>x</i></b>'e ve en nihayetinde de <i><b>c.x</b></i>'de <b>C</b> sınıfındaki <b><i>x</i></b>'e erişiyoruz. Bu nedenle yukarıdaki kod parçası çalıştırıldığında ekranda <b><i>12</i></b>, <i><b>4</b></i> ve <b><i>2</i></b> değerlerini görürüz.</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Şimdi ise referansları farklı tiplere dönüştürürerek yine veriye erişmek istiyoruz:</span></blockquote>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(((</span>A<span style="color: #333333;">)</span> c<span style="color: #333333;">).</span><span style="color: #0000cc;">x</span><span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(((</span>B<span style="color: #333333;">)</span> c<span style="color: #333333;">).</span><span style="color: #0000cc;">x</span><span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(((</span>A<span style="color: #333333;">)</span> b<span style="color: #333333;">).</span><span style="color: #0000cc;">x</span><span style="color: #333333;">);</span></pre>
</div>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki analiz hala geçerlidir: verilere referanslar üzerinden erişildiğinde önemli olan referansın gösterdiği nesnenin tipi değil, referansın tanımlandığı tipdir. Ancak bu sefer tip dönüşümü yapıldığı için hedef tipin tanımladığı sınıftaki veriye erişeceğiz. Buna göre ekran çıktısı sırasıyla <b><i>12</i></b>, <i><b>4</b></i> ve <b><i>12</i></b> olacaktır.</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki örneklerde görüldüğü gibi referanslar üzerinden özniteliklere eişildiğinde çok şekillilik çalışmıyor. Çünkü <b>çok şekillilik sadece fonksiyonlar üzerinde çalışır</b>, <b>veriler üzerinde çalışmaz</b>!</span></blockquote>
<ul>
<li><i style="font-family: georgia, "times new roman", serif; font-weight: bold;">Referanslar üzerinden özniteliklere erişim</i> </li>
</ul>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Şimdi <b><i>a</i></b>, <i><b>b</b></i> ve <b><i>c</i></b> referanslarını kullanarak <b>getX()</b> isimli metodu önce doğrudan çağıralım:</span></blockquote>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>a<span style="color: #333333;">.</span><span style="color: #0000cc;">getX</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>b<span style="color: #333333;">.</span><span style="color: #0000cc;">getX</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>c<span style="color: #333333;">.</span><span style="color: #0000cc;">getX</span><span style="color: #333333;">());</span>
</pre>
</div>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Her üç referans değişkeni de (<b><i>a</i></b>, <i><b>b</b></i> ve <b><i>c</i></b>) <b>C</b> tipinden bir nesneyi gösterdiği için her üç durumda da <b>C</b> sınıfındaki <b>getX()</b> metodu çalışacaktır ve ekranda üç satır olmak üzere <b><i>2</i></b> değerini görürüz.</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Aşağıdaki durumda ise <b><i>a</i></b>, <i><b>b</b></i> ve <i style="font-weight: bold;">c</i> değişkenleri üzerinde tip dönüşümü yaparak kullanıyoruz:</span></blockquote>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(((</span>A<span style="color: #333333;">)</span> c<span style="color: #333333;">).</span><span style="color: #0000cc;">getX</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(((</span>B<span style="color: #333333;">)</span> c<span style="color: #333333;">).</span><span style="color: #0000cc;">getX</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(((</span>A<span style="color: #333333;">)</span> b<span style="color: #333333;">).</span><span style="color: #0000cc;">getX</span><span style="color: #333333;">());</span></pre>
</div>
<blockquote class="tr_bq">
<span style="font-family: "georgia" , "times new roman" , serif;">Bu kullanımlarda değişen bir durum olmayacak ve çok şekillilik her zaman çalışacaktır. Sonuç olarak istediğiniz kadar referans değişken üzerinde tip dönüşümü yapın, referansın gösterdiği nesne hala <b>C</b> tipinden, dolayısı ile <b>C</b> sınıfındaki <b>getX()</b> fonksiyonu çalışacaktır. Yukarıdaki kod parçası çalıştığında </span><span style="font-family: "georgia" , "times new roman" , serif;">ekranda üç satır olmak üzere </span><b style="font-family: Georgia, "Times New Roman", serif;"><i>2</i></b><span style="font-family: "georgia" , "times new roman" , serif;"> değerini görürüz </span><span style="background-color: #f1f1f1; font-family: "verdana" , sans-serif;">∎</span> </blockquote>
Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com1tag:blogger.com,1999:blog-2756890279096274314.post-18670809648188184292017-07-14T03:43:00.003+03:002017-08-02T23:13:23.027+03:00Java SE 7 Kodunu Java SE 9'a Taşımak<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA5nOHwo85d4zxhtf-bJKWXG9FHsvyIS7_e_iZ3FiAiYrs8q9xKeXe-h4myzZAMGMJK4CHOf4HzXhgpf0aI9tbbOdLa7Pv7odDudOz1IXN6sr1POA3G3wDRmIVtqn9cDWz2kzNadM8tTox/s1600/java-se789.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="576" data-original-width="466" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA5nOHwo85d4zxhtf-bJKWXG9FHsvyIS7_e_iZ3FiAiYrs8q9xKeXe-h4myzZAMGMJK4CHOf4HzXhgpf0aI9tbbOdLa7Pv7odDudOz1IXN6sr1POA3G3wDRmIVtqn9cDWz2kzNadM8tTox/s400/java-se789.jpeg" width="323" /></a></div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Bu yazıda <b>Java SE 7</b> ve öncesinde yazılmış bir uygulamada yer alan dizi ve torbalar üzerinde gerçekleştirilmiş döngülerin <b>Java SE 9</b>'a taşınması ile ilgili bir örnek ele alınacaktır. Aşağıda <b>UML </b>sınıf çizgesi verilen alan modelini önce <b>Java 7</b>'de kodlayalım:</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA6fwwpihdn868MTpBc7kMFrmUBoI28XGtbYR1r6kjpEs78P6caFN6tcJhExAEVIEpXaxHdl-4MP1kAkusfhT77CiyBw5OeIavfdwJhEFgxhJYaW29if_rLetS5DeUFU9FLmeKbaFlorlB/s1600/animals-domain-model.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="486" data-original-width="976" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA6fwwpihdn868MTpBc7kMFrmUBoI28XGtbYR1r6kjpEs78P6caFN6tcJhExAEVIEpXaxHdl-4MP1kAkusfhT77CiyBw5OeIavfdwJhEFgxhJYaW29if_rLetS5DeUFU9FLmeKbaFlorlB/s1600/animals-domain-model.png" /></a></div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Animal.java</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> * </span>
<span style="color: #888888;"> * @author Binnur KURT (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">abstract</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Animal</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">protected</span> <span style="color: #333399; font-weight: bold;">int</span> legs<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Animal</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> legs<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">legs</span> <span style="color: #333333;">=</span> legs<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">int</span> <span style="color: #0066bb; font-weight: bold;">getLegs</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> legs<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">walk</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Animal is walking now..."</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">abstract</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">eat</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Pet.java</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> * </span>
<span style="color: #888888;"> * @author Binnur KURT (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">abstract</span> <span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">Pet</span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setName</span><span style="color: #333333;">(</span>String name<span style="color: #333333;">);</span>
String <span style="color: #0066bb; font-weight: bold;">getName</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">abstract</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">play</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Spider.java</u>:</b></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> * </span>
<span style="color: #888888;"> * @author Binnur KURT (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Spider</span> <span style="color: #008800; font-weight: bold;">extends</span> Animal <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Spider</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">super</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">8</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">eat</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Spider is eating now..."</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">toString</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="background-color: #fff0f0;">"Spider [legs="</span> <span style="color: #333333;">+</span> legs <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"]"</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<b><span style="font-family: "georgia" , "times new roman" , serif;"><u>Cat.java</u>:</span></b><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> * </span>
<span style="color: #888888;"> * @author Binnur KURT (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Cat</span> <span style="color: #008800; font-weight: bold;">extends</span> Animal <span style="color: #008800; font-weight: bold;">implements</span> Pet <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> String name<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Cat</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Garfield"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Cat</span><span style="color: #333333;">(</span>String name<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">super</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">4</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">name</span> <span style="color: #333333;">=</span> name<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setName</span><span style="color: #333333;">(</span>String name<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">name</span> <span style="color: #333333;">=</span> name<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">getName</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> name<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">play</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>name <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" is playing now..."</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">eat</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>name <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" is eating now..."</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">toString</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="background-color: #fff0f0;">"Cat [name="</span> <span style="color: #333333;">+</span> name <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">", legs="</span> <span style="color: #333333;">+</span> legs <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"]"</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><u>Fish.java</u>:</b></span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">domain</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> * </span>
<span style="color: #888888;"> * @author Binnur KURT (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Fish</span> <span style="color: #008800; font-weight: bold;">extends</span> Animal <span style="color: #008800; font-weight: bold;">implements</span> Pet <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> String name<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Fish</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Nemo"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #0066bb; font-weight: bold;">Fish</span><span style="color: #333333;">(</span>String name<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">super</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">name</span> <span style="color: #333333;">=</span> name<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">setName</span><span style="color: #333333;">(</span>String name<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">name</span> <span style="color: #333333;">=</span> name<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">getName</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> name<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">play</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>name <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" is playing now..."</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">eat</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>name <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" is eating now..."</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">walk</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>name <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" is swimming now..."</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #555555; font-weight: bold;">@Override</span>
<span style="color: #008800; font-weight: bold;">public</span> String <span style="color: #0066bb; font-weight: bold;">toString</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="background-color: #fff0f0;">"Fish [name="</span> <span style="color: #333333;">+</span> name <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">", legs="</span> <span style="color: #333333;">+</span> legs <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"]"</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Şimdi bu alan modelini kullanan bir uygulama kodunu <b>Java 7</b>'de kodlayalım:</span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">application</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.ArrayList</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.Arrays</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.animals.domain.Animal</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.animals.domain.Cat</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.animals.domain.Fish</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.animals.domain.Pet</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.animals.domain.Spider</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> * </span>
<span style="color: #888888;"> * @author Binnur KURT (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">AnimalAppInJava7</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
List<span style="color: #333333;"><</span>Animal<span style="color: #333333;">></span> animals <span style="color: #333333;">=</span> Arrays<span style="color: #333333;">.</span><span style="color: #0000cc;">asList</span><span style="color: #333333;">(</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Spider</span><span style="color: #333333;">(),</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Cat</span><span style="color: #333333;">(),</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Fish</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Free Willy"</span><span style="color: #333333;">),</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Cat</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Tekir"</span><span style="color: #333333;">),</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Fish</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Jaws"</span><span style="color: #333333;">),</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Spider</span><span style="color: #333333;">()</span>
<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span>Animal animal <span style="color: #333333;">:</span> animals<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
animal<span style="color: #333333;">.</span><span style="color: #0000cc;">walk</span><span style="color: #333333;">();</span>
animal<span style="color: #333333;">.</span><span style="color: #0000cc;">eat</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>animal <span style="color: #008800; font-weight: bold;">instanceof</span> Pet<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #333333;">((</span>Pet<span style="color: #333333;">)</span> animal<span style="color: #333333;">).</span><span style="color: #0000cc;">play</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
List<span style="color: #333333;"><</span>Animal<span style="color: #333333;">></span> wildAnimals <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ArrayList<span style="color: #333333;"><>();</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span>Animal animal <span style="color: #333333;">:</span> animals<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(!(</span>animal <span style="color: #008800; font-weight: bold;">instanceof</span> Pet<span style="color: #333333;">))</span>
wildAnimals<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>animal<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Wild Animals: "</span><span style="color: #333333;">+</span>wildAnimals<span style="color: #333333;">);</span>
List<span style="color: #333333;"><</span>Pet<span style="color: #333333;">></span> pets <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ArrayList<span style="color: #333333;"><>();</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span>Animal animal <span style="color: #333333;">:</span> animals<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>animal <span style="color: #008800; font-weight: bold;">instanceof</span> Pet<span style="color: #333333;">)</span>
pets<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">((</span>Pet<span style="color: #333333;">)</span> animal<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Pets: "</span><span style="color: #333333;">+</span>pets<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">int</span> maxLegs<span style="color: #333333;">=</span> <span style="color: #333333;">-</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span>Animal <span style="color: #997700; font-weight: bold;">animal:</span> animals<span style="color: #333333;">){</span>
<span style="color: #008800; font-weight: bold;">final</span> <span style="color: #333399; font-weight: bold;">int</span> legs <span style="color: #333333;">=</span> animal<span style="color: #333333;">.</span><span style="color: #0000cc;">getLegs</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>legs<span style="color: #333333;">></span>maxLegs<span style="color: #333333;">)</span> maxLegs<span style="color: #333333;">=</span> legs<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"max number of legs: "</span><span style="color: #333333;">+</span>maxLegs<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Java SE 7</b>'de yazdığımız uygulamada ağırlıklı olarak <b>Java SE 5</b>'de gelen <b>for</b> döngüsünü kullanarak <b>torbalar üzerinde çalışan döngüler</b> kurduk. Şimdi birebir aynı işi yapan uygulamayı <b>Java SE 9</b>'da kodlayalım:</span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">animals</span><span style="color: #333333;">.</span><span style="color: #0000cc;">application</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.Arrays</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.Random</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.function.Consumer</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.function.Predicate</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.Collectors</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.animals.domain.Animal</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.animals.domain.Cat</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.animals.domain.Fish</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.animals.domain.Pet</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.example.animals.domain.Spider</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> * </span>
<span style="color: #888888;"> * @author Binnur KURT (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">AnimalAppInJava9</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
List<span style="color: #333333;"><</span>Animal<span style="color: #333333;">></span> animals<span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Spider</span><span style="color: #333333;">(),</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Cat</span><span style="color: #333333;">(),</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Fish</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Free Willy"</span><span style="color: #333333;">),</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Cat</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Tekir"</span><span style="color: #333333;">),</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Fish</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Jaws"</span><span style="color: #333333;">),</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Spider</span><span style="color: #333333;">()</span>
<span style="color: #333333;">);</span>
Class<span style="color: #333333;"><</span>Pet<span style="color: #333333;">></span> clazz <span style="color: #333333;">=</span> Pet<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">;</span>
Consumer<span style="color: #333333;"><</span>Animal<span style="color: #333333;">></span> walk <span style="color: #333333;">=</span> <span style="color: #997700; font-weight: bold;">Animal:</span><span style="color: #333333;">:</span>walk<span style="color: #333333;">;</span>
Consumer<span style="color: #333333;"><</span>Animal<span style="color: #333333;">></span> eat <span style="color: #333333;">=</span> <span style="color: #997700; font-weight: bold;">Animal:</span><span style="color: #333333;">:</span>eat<span style="color: #333333;">;</span>
Consumer<span style="color: #333333;"><</span>Animal<span style="color: #333333;">></span> playIfPet <span style="color: #333333;">=</span> animal <span style="color: #333333;">-></span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>clazz<span style="color: #333333;">.</span><span style="color: #0000cc;">isInstance</span><span style="color: #333333;">(</span>animal<span style="color: #333333;">))</span>
clazz<span style="color: #333333;">.</span><span style="color: #0000cc;">cast</span><span style="color: #333333;">(</span>animal<span style="color: #333333;">).</span><span style="color: #0000cc;">play</span><span style="color: #333333;">();</span>
<span style="color: #333333;">};</span>
animals<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>walk<span style="color: #333333;">.</span><span style="color: #0000cc;">andThen</span><span style="color: #333333;">(</span>eat<span style="color: #333333;">).</span><span style="color: #0000cc;">andThen</span><span style="color: #333333;">(</span>playIfPet<span style="color: #333333;">));</span>
Predicate<span style="color: #333333;"><?</span> <span style="color: #008800; font-weight: bold;">super</span> Animal<span style="color: #333333;">></span> isPet <span style="color: #333333;">=</span> animal <span style="color: #333333;">-></span> animal <span style="color: #008800; font-weight: bold;">instanceof</span> Pet<span style="color: #333333;">;</span>
animals<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span>isPet<span style="color: #333333;">).</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>Pet<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">::</span>cast<span style="color: #333333;">).</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Pet:</span><span style="color: #333333;">:</span>play<span style="color: #333333;">);</span>
List<span style="color: #333333;"><</span>Animal<span style="color: #333333;">></span> pets<span style="color: #333333;">=</span> animals<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span>isPet<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">toList</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Pets: "</span><span style="color: #333333;">+</span>pets<span style="color: #333333;">);</span>
Predicate<span style="color: #333333;"><?</span> <span style="color: #008800; font-weight: bold;">super</span> Animal<span style="color: #333333;">></span> isWild<span style="color: #333333;">=</span> isPet<span style="color: #333333;">.</span><span style="color: #0000cc;">negate</span><span style="color: #333333;">();</span>
List<span style="color: #333333;"><</span>Animal<span style="color: #333333;">></span> wildAnimals<span style="color: #333333;">=</span> animals<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span>isWild<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">toList</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Wild animals: "</span><span style="color: #333333;">+</span>wildAnimals<span style="color: #333333;">);</span>
animals<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Animal:</span><span style="color: #333333;">:</span>getLegs<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">max</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Integer:</span><span style="color: #333333;">:</span>compare<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">ifPresent</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Java 7</b> ve öncesinde uzun uzun yazdığımız döngüleri <b>Java 9</b>'da <b>tek satırlık</b> ifadelerle karşılamak mümkün:</span><br />
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Önce hayvanları yürüyüşe çıkaralım, ardından karınlarını doyuralım ve evcil olanları ile oyun oynayalım:</span></li>
</ul>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">animals<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>walk<span style="color: #333333;">.</span><span style="color: #0000cc;">andThen</span><span style="color: #333333;">(</span>eat<span style="color: #333333;">).</span><span style="color: #0000cc;">andThen</span><span style="color: #333333;">(</span>playIfPet<span style="color: #333333;">));</span></pre>
</div>
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Evcil hayvanlar ile oyun oynayalım:</span></li>
</ul>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">animals<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span>Pet<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">::</span>isInstance<span style="color: #333333;">).</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>Pet<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">::</span>cast<span style="color: #333333;">).</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Pet:</span><span style="color: #333333;">:</span>play<span style="color: #333333;">);</span>
</pre>
</div>
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Vahşi hayvanların listesini alalım:</span></li>
</ul>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">animals<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span>isWild<span style="color: #333333;">).</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">toList</span><span style="color: #333333;">());</span></pre>
</div>
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Evcil hayvanların listesini alalım:</span></li>
</ul>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">animals<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span>isPet<span style="color: #333333;">).</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">toList</span><span style="color: #333333;">());</span></pre>
</div>
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;">En çok ayağa sahip hayvanda kaç adet ayak bulunur:</span></li>
</ul>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">animals<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Animal:</span><span style="color: #333333;">:</span>getLegs<span style="color: #333333;">).</span><span style="color: #0000cc;">max</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Integer:</span><span style="color: #333333;">:</span>compare<span style="color: #333333;">).</span><span style="color: #0000cc;">ifPresent</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span></pre>
</div>
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;">Hayvanların toplam ayak sayısı:</span></li>
</ul>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333399; font-weight: bold;">int</span> numberOfLegs<span style="color: #333333;">=</span> animals<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">mapToInt</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Animal:</span><span style="color: #333333;">:</span>getLegs<span style="color: #333333;">).</span><span style="color: #0000cc;">sum</span><span style="color: #333333;">();</span>
</pre>
</div>
<br />
<b style="font-family: georgia, "times new roman", serif; font-size: x-large;">Tek Satırlık İfadeler</b><br />
<span style="font-family: "georgia" , "times new roman" , serif; font-size: large;"><b><br />
</b></span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>Java SE 8</b>'de gelen <i><b>Fonksiyonel Programlama</b></i>, <b>Stream API</b> ve <b>MapReduce</b> çatıları sayesinde çözümü tek satırlık ifadelerle oluşturabiliyoruz. Bu tek satırlık ifadelere örnekler oluşturabilmek amacıyla yukardıki örnek alan modelini kullanarak, farklı problemler çözelim. </span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>1.</b> <b>Java 9</b>'da rastgele olarak 100 <b>Animal</b> türünden nesne ile dolu bir liste elde etmeye çalışalım:</span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">List<span style="color: #333333;"><</span>Supplier<span style="color: #333333;"><</span>Animal<span style="color: #333333;">>></span> constructors<span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Spider:</span><span style="color: #333333;">:</span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #333333;">,</span><span style="color: #997700; font-weight: bold;">Cat:</span><span style="color: #333333;">:</span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #333333;">,</span><span style="color: #997700; font-weight: bold;">Fish:</span><span style="color: #333333;">:</span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #333333;">);</span>
List<span style="color: #333333;"><</span>Animal<span style="color: #333333;">></span> randomAnimals<span style="color: #333333;">=</span>
<span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">Random</span><span style="color: #333333;">().</span><span style="color: #0000cc;">ints</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span>constructors<span style="color: #333333;">.</span><span style="color: #0000cc;">size</span><span style="color: #333333;">())</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">limit</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">100</span><span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">mapToObj</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">constructors:</span><span style="color: #333333;">:</span>get<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span> <span style="color: #997700; font-weight: bold;">Supplier:</span><span style="color: #333333;">:</span>get <span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span> Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">toList</span><span style="color: #333333;">()</span> <span style="color: #333333;">);</span>
randomAnimals<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>2.</b> Her bir <b>Animal </b>türünden kaç adet nesne var sınıflandırmaya çalışalım:</span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">Function<span style="color: #333333;"><</span>Animal<span style="color: #333333;">,</span> String<span style="color: #333333;">></span> groupByClassName <span style="color: #333333;">=</span> animal <span style="color: #333333;">-></span> animal<span style="color: #333333;">.</span><span style="color: #0000cc;">getClass</span><span style="color: #333333;">().</span><span style="color: #0000cc;">getSimpleName</span><span style="color: #333333;">();</span>
Map<span style="color: #333333;"><</span>String<span style="color: #333333;">,</span> Long<span style="color: #333333;">></span> animalCountsByClassName <span style="color: #333333;">=</span>
randomAnimals<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>
Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">groupingBy</span><span style="color: #333333;">(</span> groupByClassName<span style="color: #333333;">,</span> Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">counting</span><span style="color: #333333;">()</span> <span style="color: #333333;">)</span>
<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>animalCountsByClassName<span style="color: #333333;">);</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki kod parçasını çalıştırdığımızda ekranda aşağıdaki gibi bir ileti alıyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;">{</span>Cat<span style="color: #333333;">=</span><span style="color: #0000dd; font-weight: bold;">36</span><span style="color: #333333;">,</span> Spider<span style="color: #333333;">=</span><span style="color: #0000dd; font-weight: bold;">35</span><span style="color: #333333;">,</span> Fish<span style="color: #333333;">=</span><span style="color: #0000dd; font-weight: bold;">29</span><span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>3.</b> Aynı ayak sayısına sahip hayvanların listesini alalım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">Function<span style="color: #333333;"><</span>Animal<span style="color: #333333;">,</span> String<span style="color: #333333;">></span> classNameMapper <span style="color: #333333;">=</span> animal <span style="color: #333333;">-></span> animal<span style="color: #333333;">.</span><span style="color: #0000cc;">getClass</span><span style="color: #333333;">().</span><span style="color: #0000cc;">getSimpleName</span><span style="color: #333333;">();</span>
Map<span style="color: #333333;"><</span>Integer<span style="color: #333333;">,</span> Set<span style="color: #333333;"><</span>String<span style="color: #333333;">>></span> animalCountsByLegs <span style="color: #333333;">=</span>
randomAnimals<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>
Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">groupingBy</span><span style="color: #333333;">(</span>
<span style="color: #997700; font-weight: bold;">Animal:</span><span style="color: #333333;">:</span>getLegs<span style="color: #333333;">,</span>
Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">mapping</span><span style="color: #333333;">(</span>classNameMapper<span style="color: #333333;">,</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">toSet</span><span style="color: #333333;">())</span>
<span style="color: #333333;">)</span>
<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>animalCountsByLegs<span style="color: #333333;">);</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki kod parçasını çalıştırdığımızda ekranda aşağıdaki gibi bir ileti alıyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;">{</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">=[</span>Fish<span style="color: #333333;">],</span> <span style="color: #0000dd; font-weight: bold;">4</span><span style="color: #333333;">=[</span>Cat<span style="color: #333333;">],</span> <span style="color: #0000dd; font-weight: bold;">8</span><span style="color: #333333;">=[</span>Spider<span style="color: #333333;">]}</span>
</pre>
</div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>4.</b> Hayvanları önce ayak sayısına göre, ayak sayıları eşit olanları ise sınıf adına göre sıralı olacak şekilde ekrana yazmak istiyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">final</span> Comparator<span style="color: #333333;"><</span>Animal<span style="color: #333333;">></span> compareByLegNumbers <span style="color: #333333;">=</span> <span style="color: #333333;">(</span>left<span style="color: #333333;">,</span>right<span style="color: #333333;">)</span> <span style="color: #333333;">-></span> left<span style="color: #333333;">.</span><span style="color: #0000cc;">getLegs</span><span style="color: #333333;">()</span> <span style="color: #333333;">-</span> right<span style="color: #333333;">.</span><span style="color: #0000cc;">getLegs</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">final</span> Comparator<span style="color: #333333;"><</span>Animal<span style="color: #333333;">></span> compareByClassName <span style="color: #333333;">=</span> <span style="color: #333333;">(</span>left<span style="color: #333333;">,</span>right<span style="color: #333333;">)</span> <span style="color: #333333;">-></span> left<span style="color: #333333;">.</span><span style="color: #0000cc;">getClass</span><span style="color: #333333;">().</span><span style="color: #0000cc;">getSimpleName</span><span style="color: #333333;">().</span><span style="color: #0000cc;">compareTo</span><span style="color: #333333;">(</span>right<span style="color: #333333;">.</span><span style="color: #0000cc;">getClass</span><span style="color: #333333;">().</span><span style="color: #0000cc;">getSimpleName</span><span style="color: #333333;">());</span>
randomAnimals<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">sorted</span><span style="color: #333333;">(compare</span>ByLegNumbers<span style="color: #333333;">.</span><span style="color: #0000cc;">thenComparing</span><span style="color: #333333;">(compare</span>ByClassName<span style="color: #333333;">)).</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>5.</b> Dört ayaklı evcil hayvanlar içerisinde en kalabalık türün adını bulmaya çalışalım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">final</span> Predicate<span style="color: #333333;"><?</span> <span style="color: #008800; font-weight: bold;">super</span> Animal<span style="color: #333333;">></span> isPet <span style="color: #333333;">=</span> animal <span style="color: #333333;">-></span> animal <span style="color: #008800; font-weight: bold;">instanceof</span> Pet<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">final</span> Comparator<span style="color: #333333;"><</span>Animal<span style="color: #333333;">></span> compareByClassName <span style="color: #333333;">=</span> <span style="color: #333333;">(</span>left<span style="color: #333333;">,</span>right<span style="color: #333333;">)</span> <span style="color: #333333;">-></span> left<span style="color: #333333;">.</span><span style="color: #0000cc;">getClass</span><span style="color: #333333;">().</span><span style="color: #0000cc;">getSimpleName</span><span style="color: #333333;">().</span><span style="color: #0000cc;">compareTo</span><span style="color: #333333;">(</span>right<span style="color: #333333;">.</span><span style="color: #0000cc;">getClass</span><span style="color: #333333;">().</span><span style="color: #0000cc;">getSimpleName</span><span style="color: #333333;">());</span>
<span style="color: #008800; font-weight: bold;">final</span> Function<span style="color: #333333;"><</span>Animal<span style="color: #333333;">,</span> String<span style="color: #333333;">></span> classNameMapper <span style="color: #333333;">=</span> animal <span style="color: #333333;">-></span> animal<span style="color: #333333;">.</span><span style="color: #0000cc;">getClass</span><span style="color: #333333;">().</span><span style="color: #0000cc;">getSimpleName</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">final</span> Comparator<span style="color: #333333;"><</span>Animal<span style="color: #333333;">></span> compareByLegNumbers <span style="color: #333333;">=</span> <span style="color: #333333;">(</span>left<span style="color: #333333;">,</span>right<span style="color: #333333;">)</span> <span style="color: #333333;">-></span> left<span style="color: #333333;">.</span><span style="color: #0000cc;">getLegs</span><span style="color: #333333;">()</span> <span style="color: #333333;">-</span> right<span style="color: #333333;">.</span><span style="color: #0000cc;">getLegs</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">final</span> Collector<span style="color: #333333;"><</span>Animal<span style="color: #333333;">,</span> <span style="color: #333333;">?,</span> Map<span style="color: #333333;"><</span>String<span style="color: #333333;">,</span> Long<span style="color: #333333;">>></span> clusterByAnimalTypeAndCountClusterSize <span style="color: #333333;">=</span> Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">groupingBy</span><span style="color: #333333;">(</span>classNameMapper<span style="color: #333333;">,</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">counting</span><span style="color: #333333;">());</span>
<span style="color: #008800; font-weight: bold;">final</span> Comparator<span style="color: #333333;"><</span>Map<span style="color: #333333;">.</span><span style="color: #0000cc;">Entry</span><span style="color: #333333;"><</span>String<span style="color: #333333;">,</span> Long<span style="color: #333333;">>></span> clusterSizeComparator <span style="color: #333333;">=</span> <span style="color: #333333;">(</span>e1<span style="color: #333333;">,</span>e2<span style="color: #333333;">)</span> <span style="color: #333333;">-></span> Long<span style="color: #333333;">.</span><span style="color: #0000cc;">valueOf</span><span style="color: #333333;">(</span>e1<span style="color: #333333;">.</span><span style="color: #0000cc;">getValue</span><span style="color: #333333;">()</span> <span style="color: #333333;">-</span> e2<span style="color: #333333;">.</span><span style="color: #0000cc;">getValue</span><span style="color: #333333;">()).</span><span style="color: #0000cc;">intValue</span><span style="color: #333333;">();</span>
randomAnimals<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span>isPet<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>clusterByAnimalTypeAndCountClusterSize<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">entrySet</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">max</span><span style="color: #333333;">(</span>clusterSizeComparator<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>Map<span style="color: #333333;">.</span><span style="color: #0000cc;">Entry</span><span style="color: #333333;">::</span>getKey<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">ifPresent</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
</pre>
</div>
<br />Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-42991267147882442002017-06-18T05:38:00.001+03:002017-07-17T22:48:31.745+03:00Java 9'da Görüntü Dosyaları ile Çalışmak<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbUNMwVLAACmJ5-7ifBoeCvBYxiJTcDTWef0E_FWRv9ZoFbXq7SijXGIEtw_FcHI6kplP0hMFasGRKn6PF7l5F9J7_R2u1KPBE1OYMY0y7h6U6ugMdfCEEjtvmf7L71fyeWfh8ZA83vGTZ/s1600/java9-multi-resolution-tiff-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="566" data-original-width="1028" height="352" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbUNMwVLAACmJ5-7ifBoeCvBYxiJTcDTWef0E_FWRv9ZoFbXq7SijXGIEtw_FcHI6kplP0hMFasGRKn6PF7l5F9J7_R2u1KPBE1OYMY0y7h6U6ugMdfCEEjtvmf7L71fyeWfh8ZA83vGTZ/s640/java9-multi-resolution-tiff-1.png" width="640" /></a></div>
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br /></b></span>
<span style="font-family: "georgia" , "times new roman" , serif;"><b>Java 9</b> ile birlikte görüntü dosyalarına erişim ile ilgili olarak iki önemli yenilik bizi bekliyor:</span><br />
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>Image IO</b> paketi ile <b>PNG</b> ve <b>JPEG</b> formatlarında görüntü dosyalarını okuyup, yazabiliyorduk. Artık buna <b>çok sayfalı TIFF</b> formatı da eklendi. Bu tür görüntü dosyalarını artık </span><b style="font-family: Georgia, "Times New Roman", serif;"><a href="http://www.oracle.com/technetwork/java/download-1-0-2-140451.html" target="_blank">Java Advanced Imaging</a></b><span style="font-family: "georgia" , "times new roman" , serif;"> gibi </span><span style="font-family: "georgia" , "times new roman" , serif;">üçüncü parti bir kütüphane kullanmadan </span><span style="font-family: "georgia" , "times new roman" , serif;">erişebiliyoruz.</span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;">İkinci yenilik ise bir görüntünün farklı çözünürlükteki kopyaları ile çalışmayı kolaylaştırıyor. Uygulama içinden elimizdeki ekran ya da görüntü işleme algoritması için en uygun çözünürlükteki görüntüye basit bir şekilde ulaşabiliyoruz. </span></li>
</ul>
<div>
<span style="font-family: "georgia" , "times new roman" , serif;">Örnek uygulamada Roma'nın farklı çözünürlükte çekilmiş görüntüleri ile çalışacağız:</span></div>
<div>
<ul>
<li><b style="font-family: georgia, "times new roman", serif;">rome-1</b><span style="font-family: "georgia" , "times new roman" , serif;">.jpg:</span><span style="font-family: "georgia" , "times new roman" , serif;"> </span><b style="font-family: georgia, "times new roman", serif;">4098</b><span style="font-family: "georgia" , "times new roman" , serif;"> </span><span style="font-family: "georgia" , "times new roman" , serif;">x</span><span style="font-family: "georgia" , "times new roman" , serif;"> </span><b style="font-family: georgia, "times new roman", serif;">4177</b></li>
<li><b style="font-family: georgia, "times new roman", serif;">rome-2</b><span style="font-family: "georgia" , "times new roman" , serif;">.jpg:</span><span style="font-family: "georgia" , "times new roman" , serif;"> </span><b style="font-family: georgia, "times new roman", serif;">2049</b><span style="font-family: "georgia" , "times new roman" , serif;"> </span><span style="font-family: "georgia" , "times new roman" , serif;">x</span><span style="font-family: "georgia" , "times new roman" , serif;"> </span><b style="font-family: georgia, "times new roman", serif;">2089</b></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>rome-3</b>.jpg: <b>1025</b> x <b>1045</b></span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>rome-4</b>.jpg: <b>513</b> x <b>523</b></span></li>
</ul>
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj_VWh6vfqc9hPhW4giV_QSNFC96Kll5JxNG6XDYnOnoPdp6I7TnrAcSTVBBDcUQjY7b12f7h1dN8BfueH4MpvjOrD91fG5J4WVAm-w5o2MW7Tc_7MiEQKErXQqrO_qwB747wrD17oGQpf/s1600/java9-multi-resolution-tiff-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1048" data-original-width="1548" height="432" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj_VWh6vfqc9hPhW4giV_QSNFC96Kll5JxNG6XDYnOnoPdp6I7TnrAcSTVBBDcUQjY7b12f7h1dN8BfueH4MpvjOrD91fG5J4WVAm-w5o2MW7Tc_7MiEQKErXQqrO_qwB747wrD17oGQpf/s640/java9-multi-resolution-tiff-2.png" width="640" /></a></div>
<br /></div>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">java9</span><span style="color: #333333;">.</span><span style="color: #0000cc;">features</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.awt.Image</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.awt.image.BaseMultiResolutionImage</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.awt.image.BufferedImage</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.awt.image.MultiResolutionImage</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.File</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.IOException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.Objects</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.function.Function</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.Collectors</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">javax.imageio.ImageIO</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">MultiResolutiomImageExample</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> imageFileNames <span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"rome-4.jpg"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"rome-3.jpg"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"rome-2.jpg"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"rome-1.jpg"</span><span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> Function<span style="color: #333333;"><</span>String<span style="color: #333333;">,</span> BufferedImage<span style="color: #333333;">></span> mapToBufferedImage <span style="color: #333333;">=</span> file <span style="color: #333333;">-></span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">try</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> ImageIO<span style="color: #333333;">.</span><span style="color: #0000cc;">read</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"build/classes"</span><span style="color: #333333;">,</span>file<span style="color: #333333;">));</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">catch</span> <span style="color: #333333;">(</span>IOException e<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">null</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">};</span>
List<span style="color: #333333;"><</span>BufferedImage<span style="color: #333333;">></span> images <span style="color: #333333;">=</span> imageFileNames<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>mapToBufferedImage<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Objects:</span><span style="color: #333333;">:</span>nonNull<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">toList</span><span style="color: #333333;">());</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">err</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"images.size():"</span><span style="color: #333333;">+</span>images<span style="color: #333333;">.</span><span style="color: #0000cc;">size</span><span style="color: #333333;">());</span>
MultiResolutionImage multiResolutionImage <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> BaseMultiResolutionImage<span style="color: #333333;">(</span>images<span style="color: #333333;">.</span><span style="color: #0000cc;">toArray</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> Image<span style="color: #333333;">[</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">]));</span>
List<span style="color: #333333;"><</span>Image<span style="color: #333333;">></span> imageVariants <span style="color: #333333;">=</span> multiResolutionImage<span style="color: #333333;">.</span><span style="color: #0000cc;">getResolutionVariants</span><span style="color: #333333;">();</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"number of images: "</span> <span style="color: #333333;">+</span> imageVariants<span style="color: #333333;">.</span><span style="color: #0000cc;">size</span><span style="color: #333333;">());</span>
imageVariants<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> Image image1 <span style="color: #333333;">=</span> multiResolutionImage<span style="color: #333333;">.</span><span style="color: #0000cc;">getResolutionVariant</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1024</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">768</span><span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>image1<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> Image image2 <span style="color: #333333;">=</span> multiResolutionImage<span style="color: #333333;">.</span><span style="color: #0000cc;">getResolutionVariant</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">2049</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2089</span><span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>image2<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıda örnek uygulamada Roma'nın dört farklı çözünürlükteki görüntüsünü dosyalardan okuduktan sonra <b>MultiResolutionImage</b> sınıfının yönetimine bırakıyoruz. <b>MultiResolutionImage</b> kurucu fonksiyonu bu görüntüleri <b>BufferedImage</b> tipinden bir dizide <b><i>en düşük çözünürlükten en yüksek çözünürlüğe doğru sıralı olacak şekilde</i></b> bizden bekliyor. En uygun çözünürlükte görüntüye ulaşmak için ise </span><b style="font-family: Georgia, "Times New Roman", serif;">MultiResolutionImage</b><span style="font-family: "georgia" , "times new roman" , serif;"> sınıfının <b>getResolutionVariant()</b> metodunu kullanıyoruz:</span><br />
<ul>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>multiResolutionImage.getResolutionVariant(<span style="color: red;">1024</span>, <span style="color: #073763;">768</span>) </b>çağrısı <b><span style="color: red;">1025</span></b> x <b><span style="color: #073763;">1045 </span></b>çözünürlüğe sahip görüntüyü dönerken </span></li>
<li><span style="font-family: "georgia" , "times new roman" , serif;"><b>multiResolutionImage.getResolutionVariant(<span style="color: red;">2049</span>,<span style="color: #073763;">2089</span>)</b> çağrısı <span style="color: red;"><b>2049 </b></span>x <b><span style="color: #073763;">2089 </span></b>çözünürlüğe sahip görüntüyü döndü.</span></li>
</ul>
<span style="font-family: "georgia" , "times new roman" , serif;">Şimdi ise çok sayfalı <b>TIFF </b>dokümanı okuyan basit bir uygulama geliştireceğiz. Bu uygulamada kullanacağımız çok sayfalı <b>TIFF</b>, bir önceki örnekte kullandığımız yukarıda değerleri verilen dört farklı çözünürlükteki görüntüyü içeriyor.</span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">java9</span><span style="color: #333333;">.</span><span style="color: #0000cc;">features</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.awt.Image</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.awt.image.BaseMultiResolutionImage</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.awt.image.BufferedImage</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.awt.image.MultiResolutionImage</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.File</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileInputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.FileNotFoundException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.IOException</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.io.InputStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.Optional</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.Collectors</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.IntStream</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">javax.imageio.ImageIO</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">javax.imageio.ImageReader</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">javax.imageio.stream.*</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">MultiPageTiffExample</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> ImageReader tiffReader<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> Optional<span style="color: #333333;"><</span>BufferedImage<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">read</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> index<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">try</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span>tiffReader<span style="color: #333333;">.</span><span style="color: #0000cc;">read</span><span style="color: #333333;">(</span>index<span style="color: #333333;">));</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">catch</span> <span style="color: #333333;">(</span>IOException ex<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">empty</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> FileNotFoundException<span style="color: #333333;">,</span> IOException <span style="color: #333333;">{</span>
InputStream stream <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> FileInputStream<span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"build/classes"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"/image.tif"</span><span style="color: #333333;">));</span>
tiffReader <span style="color: #333333;">=</span> ImageIO<span style="color: #333333;">.</span><span style="color: #0000cc;">getImageReadersByFormatName</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"tiff"</span><span style="color: #333333;">).</span><span style="color: #0000cc;">next</span><span style="color: #333333;">();</span>
ImageInputStream input <span style="color: #333333;">=</span> ImageIO<span style="color: #333333;">.</span><span style="color: #0000cc;">createImageInputStream</span><span style="color: #333333;">(</span>stream<span style="color: #333333;">);</span>
tiffReader<span style="color: #333333;">.</span><span style="color: #0000cc;">setInput</span><span style="color: #333333;">(</span>input<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> <span style="color: #333399; font-weight: bold;">int</span> numOfImages <span style="color: #333333;">=</span> tiffReader<span style="color: #333333;">.</span><span style="color: #0000cc;">getNumImages</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">true</span><span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"# of pages: "</span> <span style="color: #333333;">+</span> numOfImages<span style="color: #333333;">);</span>
List<span style="color: #333333;"><</span>BufferedImage<span style="color: #333333;">></span> images <span style="color: #333333;">=</span> IntStream<span style="color: #333333;">.</span><span style="color: #0000cc;">range</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> numOfImages<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">mapToObj</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">MultiPageTiffExample:</span><span style="color: #333333;">:</span>read<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Optional:</span><span style="color: #333333;">:</span>isPresent<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">flatMap</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">Optional:</span><span style="color: #333333;">:</span>stream<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">toList</span><span style="color: #333333;">());</span>
MultiResolutionImage multiResolutionImage <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> BaseMultiResolutionImage<span style="color: #333333;">(</span>images<span style="color: #333333;">.</span><span style="color: #0000cc;">toArray</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> Image<span style="color: #333333;">[</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">]));</span>
List<span style="color: #333333;"><</span>Image<span style="color: #333333;">></span> imageVariants <span style="color: #333333;">=</span> multiResolutionImage<span style="color: #333333;">.</span><span style="color: #0000cc;">getResolutionVariants</span><span style="color: #333333;">();</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"number of images: "</span> <span style="color: #333333;">+</span> imageVariants<span style="color: #333333;">.</span><span style="color: #0000cc;">size</span><span style="color: #333333;">());</span>
imageVariants<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> Image image1 <span style="color: #333333;">=</span> multiResolutionImage<span style="color: #333333;">.</span><span style="color: #0000cc;">getResolutionVariant</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1024</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">768</span><span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>image1<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">final</span> Image image2 <span style="color: #333333;">=</span> multiResolutionImage<span style="color: #333333;">.</span><span style="color: #0000cc;">getResolutionVariant</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">2049</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">2089</span><span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>image2<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br /></span>
<span style="font-family: "georgia" , "times new roman" , serif;"><b>TIFF </b>formatında görüntü dosyalarını okumak için kullanacağımız nesneyi <b>ImageIO.getImageReadersByFormatName("<span style="color: red;">tiff</span>")</b>.<b><span style="color: #073763;">next</span>()</b> ile alıyoruz. </span><span style="font-family: "georgia" , "times new roman" , serif;">Uygulamaların kodlarına </span><a href="http://www.omegaegitim.com/sources/java9.what-is-new-image-io.zip" style="font-family: georgia, "times new roman", serif;" target="_blank">bu bağlantıdan</a><span style="font-family: "georgia" , "times new roman" , serif;"> ulaşabilirsiniz.</span>Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-54484733216370989262017-06-11T17:23:00.002+03:002017-06-12T15:06:50.885+03:00Javascript'de FilterMapReduce Kullanımı<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWDfH1UVsBwM8W6GftBjZ2YsjAwf3rVKXav1O9nfT8IKvhqacCSCChZ-OAcWrF8pF1JMXFrp13HSiJgAGiO3rNB33lBMrMXCXdeYfdHVj-pKKkNXzfyKt9xF7MjI3mT-dkF3dxpBs5T992/s1600/map-reduce-js.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="239" data-original-width="773" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWDfH1UVsBwM8W6GftBjZ2YsjAwf3rVKXav1O9nfT8IKvhqacCSCChZ-OAcWrF8pF1JMXFrp13HSiJgAGiO3rNB33lBMrMXCXdeYfdHVj-pKKkNXzfyKt9xF7MjI3mT-dkF3dxpBs5T992/s640/map-reduce-js.png" width="640" /></a></div>
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br />
</b></span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>Javascript</b>, <b>HTML 5</b> ile birlikte istemci tarafta, web tarayıcıda uygulama geliştirmek için standard bir dile dönüştü. <b>HTML5</b> ile gelen <i style="background-color: white;">WebSocket API</i><span style="background-color: white;">, </span><i style="background-color: white;">Local Storage API</i><span style="background-color: white;">, </span><i style="background-color: white;">Battery Status API</i><span style="background-color: white;">, </span><i style="background-color: white;">FullScreen API</i><span style="background-color: white;">, </span><i style="background-color: white;">Canvas API</i><span style="background-color: white;">, </span><i style="background-color: white;">Geolocation API</i><span style="background-color: white;">, </span><i style="background-color: white;">Vibration API</i><span style="background-color: white;">, </span><i style="background-color: white;">Multimedia API</i><span style="background-color: white;">, </span><i style="background-color: white;">Local Storage API</i><span style="background-color: white;">, </span><i style="background-color: white;">File API</i><span style="background-color: white;">, </span><i style="background-color: white;">WebGL API</i><span style="background-color: white;">, </span><i style="background-color: white;">Drag-and-Drop</i><span style="background-color: white;"> API gibi </span></span><span style="font-family: "georgia" , "times new roman" , serif;">bir yığın API'ye <b>JavaScript</b>'de yazdığımız uygulamadan erişebiliyoruz. Ancak Javascript kullanımı sadece ön uç (=front-end) ile sınırlı değil. <b>Nodejs</b> ile arka uçta (=back-end) uygulama geliştirmek istediğinizde <b>Javascript</b> kullanmalısınız. <b>JDK 8</b> ile birlikte gelen <b>Java Sanal Makinası</b> (=Java Virtual Machine), <b>JavaScript</b> ile yazılmış uygulamaları hızlı bir şekilde çalıştırabiliyor. <b>Javascript</b>'i hem ön uçta hem de arka uçta uygulama geliştirmek için kullanıyoruz.</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>Javascript</b>'de verileri saklamak için dizi kullanıyoruz. Dizi özel bir tür nesne. Dizi, verileri anahtar-değer ikilileri olarak saklıyor. Dizide saklanan tüm veriler üzerinde işlem yapmak için döngü oluşturuyoruz. Döngüyü oluşturmanın çeşitli yöntemleri bulunuyor:</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b><i>i.</i></b> <b>for</b> ile döngüyü dizinin dışında oluşturuyoruz. İndis sıfırdan başlamak üzere dizinin son elemanının indis değerini alacak şekilde bir arttırılıyor:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">var</span> sum<span style="color: #333333;">=</span><span style="color: #0000dd; font-weight: bold;">0</span>;
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">var</span> i<span style="color: #333333;">=</span><span style="color: #0000dd; font-weight: bold;">0</span>;i<span style="color: #333333;"><</span>countries.length;<span style="color: #333333;">++</span>i){
<span style="color: #008800; font-weight: bold;">var</span> country <span style="color: #333333;">=</span> countries[i];
sum <span style="color: #333333;">+=</span> country.population;
}
console.log(<span style="background-color: #fff0f0;">"Total population : "</span><span style="color: #333333;">+</span> sum);
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b><i>ii.</i></b> <b>for-each</b> gösterimi ile döngüyü yine dizinin dışında oluşturuyoruz, ancak bu sefer dizi indisini düzenlemekle uğraşmıyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">var</span> sum<span style="color: #333333;">=</span><span style="color: #0000dd; font-weight: bold;">0</span>;
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">var</span> i <span style="color: #008800; font-weight: bold;">in</span> countries){
<span style="color: #008800; font-weight: bold;">var</span> country <span style="color: #333333;">=</span> countries[i];
sum <span style="color: #333333;">+=</span> country.population;
}
console.log(<span style="background-color: #fff0f0;">"Total population : "</span><span style="color: #333333;">+</span> sum);
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Dizide saklanan verileri işlemek için kullanılabilecek üçüncü ve en güçlü yöntem <b>MapReduce</b> yapısıdır. Şimdi örneklerle <b>Javascript</b>'de <b>MapReduce</b> çatısının kullanımını çalışalım. Önce üzerinde çalışacağımız veri modeline bir göz atalım. Verileri <b>http://www.omegaegitim.com/resources/countries.json</b> URL adresinden çekiyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">let</span> url <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">'http://www.omegaegitim.com/resources/countries.json'</span>;
fetch( url)
.then( res <span style="color: #333333;">=></span> res.json() )
.then( ( countries ) <span style="color: #333333;">=></span> console.log( JSON.stringify(countries[<span style="color: #0000dd; font-weight: bold;">215</span>]) ) )
.<span style="color: #008800; font-weight: bold;">catch</span>( err <span style="color: #333333;">=></span> console.error( err ) );
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Dizinin 215 indisli gözünde Türkiye ile ilgili bilgiler var:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">{
<span style="background-color: #fff0f0;">"capital"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">3358</span>,
<span style="background-color: #fff0f0;">"cities"</span><span style="color: #333333;">:</span> [
{
<span style="background-color: #fff0f0;">"district"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Istanbul"</span>,
<span style="background-color: #fff0f0;">"_id"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">3357</span>,
<span style="background-color: #fff0f0;">"name"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Istanbul"</span>,
<span style="background-color: #fff0f0;">"population"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">8787958</span>
},
{
<span style="background-color: #fff0f0;">"district"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Ankara"</span>,
<span style="background-color: #fff0f0;">"_id"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">3358</span>,
<span style="background-color: #fff0f0;">"name"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Ankara"</span>,
<span style="background-color: #fff0f0;">"population"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">3038159</span>
},
{
<span style="background-color: #fff0f0;">"district"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Izmir"</span>,
<span style="background-color: #fff0f0;">"_id"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">3359</span>,
<span style="background-color: #fff0f0;">"name"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Izmir"</span>,
<span style="background-color: #fff0f0;">"population"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">2130359</span>
},
{
<span style="background-color: #fff0f0;">"district"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Adana"</span>,
<span style="background-color: #fff0f0;">"_id"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">3360</span>,
<span style="background-color: #fff0f0;">"name"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Adana"</span>,
<span style="background-color: #fff0f0;">"population"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">1131198</span>
},
. . . ,
{
<span style="background-color: #fff0f0;">"district"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Balikesir"</span>,
<span style="background-color: #fff0f0;">"_id"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">3418</span>,
<span style="background-color: #fff0f0;">"name"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Bandirma"</span>,
<span style="background-color: #fff0f0;">"population"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">90200</span>
}
],
<span style="background-color: #fff0f0;">"_id"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"TUR"</span>,
<span style="background-color: #fff0f0;">"continent"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Asia"</span>,
<span style="background-color: #fff0f0;">"gnp"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">20000</span>,
<span style="background-color: #fff0f0;">"governmentForm"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Republic"</span>,
<span style="background-color: #fff0f0;">"headOfState"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Ahmet Necdet Sezer"</span>,
<span style="background-color: #fff0f0;">"indepYear"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">1923</span>,
<span style="background-color: #fff0f0;">"lifeExpectancy"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">85</span>,
<span style="background-color: #fff0f0;">"localName"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Türkiye"</span>,
<span style="background-color: #fff0f0;">"name"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Turkey"</span>,
<span style="background-color: #fff0f0;">"population"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">66591000</span>,
<span style="background-color: #fff0f0;">"region"</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"Middle East"</span>,
<span style="background-color: #fff0f0;">"surfaceArea"</span><span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">774828</span>
}
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Listelenen bilgiler arasında ülkenin ISO 2 standardında kodu, ülkenin adı, yüzölçümü, başkenti, nüfusu, yönetim biçimi, yer aldığı kıta, Gayri Safi Milli Hasılası ve illeri gibi bilgiler yer alıyor. Bu veri modeline göre aşağıdaki soruları <b>MapReduce</b> çatısını kullanarak çözmeye çalışalım.</span><br />
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b style="background-color: white;">1.</b><span style="background-color: white;"> </span><i style="background-color: white;">Kaç kıta olduğunu bulalım:</i></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">let</span> url <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">'http://www.omegaegitim.com/resources/countries.json'</span>;
<span style="color: #008800; font-weight: bold;">var</span> continents <span style="color: #333333;">=</span> [];
fetch(url)
.then(res <span style="color: #333333;">=></span> res.json())
.then((countries) <span style="color: #333333;">=></span> {
continents<span style="color: #333333;">=</span> countries.map( country <span style="color: #333333;">=></span> country.continent ).reduce(
(continents,continent) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">if</span> ( continents.indexOf(continent) <span style="color: #333333;"><</span> <span style="color: #0000dd; font-weight: bold;">0</span> ) {
continents.push(continent);
}
<span style="color: #008800; font-weight: bold;">return</span> continents;
}, [] );
continents.sort();
console.log( JSON.stringify(continents) );
})
.<span style="color: #008800; font-weight: bold;">catch</span>(err <span style="color: #333333;">=></span> console.error(err));
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki kodu çalıştırdığımızda 7 kıtanın listelendiğini görüyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">[<span style="background-color: #fff0f0;">"Africa"</span>,<span style="background-color: #fff0f0;">"Antarctica"</span>,<span style="background-color: #fff0f0;">"Asia"</span>,<span style="background-color: #fff0f0;">"Europe"</span>,<span style="background-color: #fff0f0;">"North America"</span>,<span style="background-color: #fff0f0;">"Oceania"</span>,<span style="background-color: #fff0f0;">"South America"</span>]</pre>
</div>
<br />
<b style="background-color: white; font-family: georgia, "times new roman", serif;">2.</b><span style="background-color: white; font-family: "georgia" , "times new roman" , serif;"> </span><i style="background-color: white; font-family: georgia, "times new roman", serif;">Her bir kıtada kaç ülke olduğunu bulalım:</i><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">let</span> url <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">'http://www.omegaegitim.com/resources/countries.json'</span>;
fetch(url)
.then(res <span style="color: #333333;">=></span> res.json())
.then((countries) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">var</span> result<span style="color: #333333;">=</span> countries.map( ( country ) <span style="color: #333333;">=></span> { <span style="color: #008800; font-weight: bold;">return</span> { name <span style="color: #333333;">:</span> country.name, continent<span style="color: #333333;">:</span> country.continent } } ).reduce(
(continents, o ) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">if</span> ( <span style="color: #333333;">!</span>continents.hasOwnProperty(o.continent) ) {
continents[o.continent] <span style="color: #333333;">=</span> { name<span style="color: #333333;">:</span> o.continent, countries<span style="color: #333333;">:</span> [ o.name ] };
} <span style="color: #008800; font-weight: bold;">else</span> {
continents[o.continent].countries.push( o.name );
}
<span style="color: #008800; font-weight: bold;">return</span> continents;
}, {} );
continents<span style="color: #333333;">=</span> [];
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">var</span> o <span style="color: #008800; font-weight: bold;">in</span> result) continents.push(result[o]);
continents.sort( (o1,o2) <span style="color: #333333;">=></span> o1.name.localeCompare(o2.name) );
continents.forEach( (continent) <span style="color: #333333;">=></span> console.log(<span style="background-color: #fff0f0;">"There are "</span><span style="color: #333333;">+</span>continent.countries.length<span style="color: #333333;">+</span><span style="background-color: #fff0f0;">" countries in "</span><span style="color: #333333;">+</span>continent.name) );
})
.<span style="color: #008800; font-weight: bold;">catch</span>(err <span style="color: #333333;">=></span> console.error(err));
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki kodu çalıştırdığımızda her bir kıtada kaç ülke olduğunun listesini görebiliyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">There are <span style="color: #0000dd; font-weight: bold;">58</span> countries <span style="color: #008800; font-weight: bold;">in</span> Africa
There are <span style="color: #0000dd; font-weight: bold;">5</span> countries <span style="color: #008800; font-weight: bold;">in</span> Antarctica
There are <span style="color: #0000dd; font-weight: bold;">51</span> countries <span style="color: #008800; font-weight: bold;">in</span> Asia
There are <span style="color: #0000dd; font-weight: bold;">46</span> countries <span style="color: #008800; font-weight: bold;">in</span> Europe
There are <span style="color: #0000dd; font-weight: bold;">37</span> countries <span style="color: #008800; font-weight: bold;">in</span> North America
There are <span style="color: #0000dd; font-weight: bold;">28</span> countries <span style="color: #008800; font-weight: bold;">in</span> Oceania
There are <span style="color: #0000dd; font-weight: bold;">14</span> countries <span style="color: #008800; font-weight: bold;">in</span> South America
</pre>
</div>
<br />
<b style="background-color: white; font-family: georgia, "times new roman", serif;">3.</b><span style="background-color: white; font-family: "georgia" , "times new roman" , serif;"> </span><span style="font-family: "georgia" , "times new roman" , serif;"><i>Şimdi her kıtanın GNP (Gross National Product)(=Gayri Safi Milli Hasıla) değerine göre en zengin ülkesini bulalım:</i></span><br />
<div>
<br /></div>
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">let</span> url <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">'http://www.omegaegitim.com/resources/countries.json'</span>;
fetch(url)
.then(res <span style="color: #333333;">=></span> res.json())
.then((countries) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">var</span> result<span style="color: #333333;">=</span> countries.map( ( country ) <span style="color: #333333;">=></span> { <span style="color: #008800; font-weight: bold;">return</span> { name <span style="color: #333333;">:</span> country.name, continent<span style="color: #333333;">:</span> country.continent, gnp<span style="color: #333333;">:</span> country.gnp } } ).reduce(
(continents, o ) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">if</span> ( <span style="color: #333333;">!</span>continents.hasOwnProperty(o.continent) ) {
continents[o.continent] <span style="color: #333333;">=</span> { name<span style="color: #333333;">:</span> o.continent, richestCountry<span style="color: #333333;">:</span> { name<span style="color: #333333;">:</span> o.name, gnp <span style="color: #333333;">:</span> o.gnp }};
} <span style="color: #008800; font-weight: bold;">else</span> {
<span style="color: #008800; font-weight: bold;">var</span> richestCountry<span style="color: #333333;">=</span> continents[o.continent].richestCountry;
<span style="color: #008800; font-weight: bold;">if</span> ( richestCountry.gnp <span style="color: #333333;"><</span> o.gnp ){
richestCountry.gnp<span style="color: #333333;">=</span> o.gnp;
richestCountry.name<span style="color: #333333;">=</span> o.name;
}
}
<span style="color: #008800; font-weight: bold;">return</span> continents;
}, {} );
continents<span style="color: #333333;">=</span> [];
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">var</span> o <span style="color: #008800; font-weight: bold;">in</span> result) continents.push(result[o]);
continents.sort( (o1,o2) <span style="color: #333333;">=></span> o1.name.localeCompare(o2.name) );
continents.forEach( (continent) <span style="color: #333333;">=></span> console.log(<span style="background-color: #fff0f0;">"Richest country in "</span><span style="color: #333333;">+</span>continent.name<span style="color: #333333;">+</span><span style="background-color: #fff0f0;">" is "</span> <span style="color: #333333;">+</span> continent.richestCountry.name <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" with "</span> <span style="color: #333333;">+</span> continent.richestCountry.gnp <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" gnp."</span> ) );
})
.<span style="color: #008800; font-weight: bold;">catch</span>(err <span style="color: #333333;">=></span> console.error(err));
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Yukarıdaki kodu çalıştırdığımızda her bir kıtadaki en zengin ülkenin listesini görebiliyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">Richest country <span style="color: #008800; font-weight: bold;">in</span> Africa is South Africa <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">116729</span> gnp.
Richest country <span style="color: #008800; font-weight: bold;">in</span> Antarctica is Antarctica <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">0</span> gnp.
Richest country <span style="color: #008800; font-weight: bold;">in</span> Asia is Japan <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">3787042</span> gnp.
Richest country <span style="color: #008800; font-weight: bold;">in</span> Europe is Germany <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">2133367</span> gnp.
Richest country <span style="color: #008800; font-weight: bold;">in</span> North America is United States <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">8510700</span> gnp.
Richest country <span style="color: #008800; font-weight: bold;">in</span> Oceania is Australia <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">351182</span> gnp.
Richest country <span style="color: #008800; font-weight: bold;">in</span> South America is Brazil <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">776739</span> gnp.
</pre>
</div>
<br />
<b style="background-color: white; font-family: georgia, "times new roman", serif;">4.</b><span style="background-color: white; font-family: "georgia" , "times new roman" , serif;"> </span><span style="font-family: "georgia" , "times new roman" , serif;"><i>En az bir kişinin yaşadığı dünya ülkelerinin minimum, maksimum ve ortalama nüfus sayılarını hesaplayalım:</i></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">let</span> url <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">'http://www.omegaegitim.com/resources/countries.json'</span>;
fetch(url)
.then(res <span style="color: #333333;">=></span> res.json())
.then((countries) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">var</span> statistics<span style="color: #333333;">=</span> countries.filter( country <span style="color: #333333;">=></span> country.population <span style="color: #333333;">></span> <span style="color: #0000dd; font-weight: bold;">0</span> )
.map( ( country ) <span style="color: #333333;">=></span> { <span style="color: #008800; font-weight: bold;">return</span> { name <span style="color: #333333;">:</span> country.name, population<span style="color: #333333;">:</span> country.population } } ).reduce(
( statistics, o ) <span style="color: #333333;">=></span> {
statistics.counter<span style="color: #333333;">++</span>;
statistics.total <span style="color: #333333;">+=</span> o.population;
<span style="color: #008800; font-weight: bold;">if</span> ( <span style="color: #007020;">isNaN</span>(statistics.minimum)<span style="color: #333333;">||</span> statistics.minimum <span style="color: #333333;">></span> o.population)
statistics.minimum<span style="color: #333333;">=</span> o.population;
<span style="color: #008800; font-weight: bold;">if</span> ( <span style="color: #007020;">isNaN</span>(statistics.maximum) <span style="color: #333333;">||</span> statistics.maximum <span style="color: #333333;"><</span> o.population)
statistics.maximum<span style="color: #333333;">=</span> o.population;
statistics.average<span style="color: #333333;">=</span> statistics.total<span style="color: #333333;">/</span>statistics.counter;
<span style="color: #008800; font-weight: bold;">return</span> statistics;
}, { minimum<span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">NaN</span>, maximum<span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">NaN</span>, counter<span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">0</span>, average<span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">0</span>, total<span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">0</span>} );
console.log(JSON.stringify(statistics));
})
.<span style="color: #008800; font-weight: bold;">catch</span>(err <span style="color: #333333;">=></span> console.error(err));
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">İşte nüfus ile ilgili istatistikler:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">{<span style="background-color: #fff0f0;">"minimum"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">50</span>,<span style="background-color: #fff0f0;">"maximum"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">1277558000</span>,<span style="background-color: #fff0f0;">"counter"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">232</span>,<span style="background-color: #fff0f0;">"average"</span><span style="color: #333333;">:</span><span style="color: #6600ee; font-weight: bold;">26201506.25</span>,<span style="background-color: #fff0f0;">"total"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">6078749450</span>}
</pre>
</div>
<br />
<b style="background-color: white; font-family: georgia, "times new roman", serif;">5.</b><span style="background-color: white; font-family: "georgia" , "times new roman" , serif;"> </span><span style="font-family: "georgia" , "times new roman" , serif;"><i>Bir önceki hesaplamayı bu sefer kıta özelinde yapalım ve her bir kıta için en az bir kişinin yaşadığı kıta ülkelerinin minimum, maksimum ve ortalama nüfus sayılarını hesaplayalım:</i></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">let</span> url <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">'http://www.omegaegitim.com/resources/countries.json'</span>;
fetch(url)
.then(res <span style="color: #333333;">=></span> res.json())
.then((countries) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">var</span> result<span style="color: #333333;">=</span> countries.filter( country <span style="color: #333333;">=></span> country.population <span style="color: #333333;">></span> <span style="color: #0000dd; font-weight: bold;">0</span> )
.map( ( country ) <span style="color: #333333;">=></span> { <span style="color: #008800; font-weight: bold;">return</span> { name <span style="color: #333333;">:</span> country.name, population<span style="color: #333333;">:</span> country.population, continent<span style="color: #333333;">:</span> country.continent } } ).reduce(
( statistics, o ) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">if</span> (<span style="color: #333333;">!</span>statistics.hasOwnProperty(o.continent)){
statistics[o.continent]<span style="color: #333333;">=</span> { continent<span style="color: #333333;">:</span> o.continent, minimum<span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">NaN</span>, maximum<span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">NaN</span>, counter<span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">0</span>, average<span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">0</span>, total<span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">0</span> };
}
<span style="color: #008800; font-weight: bold;">var</span> stat<span style="color: #333333;">=</span> statistics[o.continent];
stat.counter<span style="color: #333333;">++</span>;
stat.total <span style="color: #333333;">+=</span> o.population;
<span style="color: #008800; font-weight: bold;">if</span> ( <span style="color: #007020;">isNaN</span>(stat.minimum)<span style="color: #333333;">||</span> stat.minimum <span style="color: #333333;">></span> o.population)
stat.minimum<span style="color: #333333;">=</span> o.population;
<span style="color: #008800; font-weight: bold;">if</span> ( <span style="color: #007020;">isNaN</span>(stat.maximum) <span style="color: #333333;">||</span> stat.maximum <span style="color: #333333;"><</span> o.population)
stat.maximum<span style="color: #333333;">=</span> o.population;
stat.average<span style="color: #333333;">=</span> stat.total<span style="color: #333333;">/</span>stat.counter;
<span style="color: #008800; font-weight: bold;">return</span> statistics;
}, {} );
statistics<span style="color: #333333;">=</span> [];
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">var</span> o <span style="color: #008800; font-weight: bold;">in</span> result) statistics.push(result[o]);
statistics.sort( (o1,o2) <span style="color: #333333;">=></span> o1.continent.localeCompare(o2.continent) );
statistics.forEach( stat <span style="color: #333333;">=></span> console.log(JSON.stringify(stat)) );
})
.<span style="color: #008800; font-weight: bold;">catch</span>(err <span style="color: #333333;">=></span> console.error(err));
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">İşte merak ettiğimiz sonuçlar:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">{<span style="background-color: #fff0f0;">"continent"</span><span style="color: #333333;">:</span><span style="background-color: #fff0f0;">"Africa"</span>,<span style="background-color: #fff0f0;">"minimum"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">6000</span>,<span style="background-color: #fff0f0;">"maximum"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">111506000</span>,<span style="background-color: #fff0f0;">"counter"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">57</span>,<span style="background-color: #fff0f0;">"average"</span><span style="color: #333333;">:</span><span style="color: #6600ee; font-weight: bold;">13762719.298245614</span>,<span style="background-color: #fff0f0;">"total"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">784475000</span>}
{<span style="background-color: #fff0f0;">"continent"</span><span style="color: #333333;">:</span><span style="background-color: #fff0f0;">"Asia"</span>,<span style="background-color: #fff0f0;">"minimum"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">286000</span>,<span style="background-color: #fff0f0;">"maximum"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">1277558000</span>,<span style="background-color: #fff0f0;">"counter"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">51</span>,<span style="background-color: #fff0f0;">"average"</span><span style="color: #333333;">:</span><span style="color: #6600ee; font-weight: bold;">72647562.74509804</span>,<span style="background-color: #fff0f0;">"total"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">3705025700</span>}
{<span style="background-color: #fff0f0;">"continent"</span><span style="color: #333333;">:</span><span style="background-color: #fff0f0;">"Europe"</span>,<span style="background-color: #fff0f0;">"minimum"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">1000</span>,<span style="background-color: #fff0f0;">"maximum"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">146934000</span>,<span style="background-color: #fff0f0;">"counter"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">46</span>,<span style="background-color: #fff0f0;">"average"</span><span style="color: #333333;">:</span><span style="color: #6600ee; font-weight: bold;">15871186.956521738</span>,<span style="background-color: #fff0f0;">"total"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">730074600</span>}
{<span style="background-color: #fff0f0;">"continent"</span><span style="color: #333333;">:</span><span style="background-color: #fff0f0;">"North America"</span>,<span style="background-color: #fff0f0;">"minimum"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">7000</span>,<span style="background-color: #fff0f0;">"maximum"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">278357000</span>,<span style="background-color: #fff0f0;">"counter"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">37</span>,<span style="background-color: #fff0f0;">"average"</span><span style="color: #333333;">:</span><span style="color: #6600ee; font-weight: bold;">13053864.864864865</span>,<span style="background-color: #fff0f0;">"total"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">482993000</span>}
{<span style="background-color: #fff0f0;">"continent"</span><span style="color: #333333;">:</span><span style="background-color: #fff0f0;">"Oceania"</span>,<span style="background-color: #fff0f0;">"minimum"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">50</span>,<span style="background-color: #fff0f0;">"maximum"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">18886000</span>,<span style="background-color: #fff0f0;">"counter"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">27</span>,<span style="background-color: #fff0f0;">"average"</span><span style="color: #333333;">:</span><span style="color: #6600ee; font-weight: bold;">1125968.5185185184</span>,<span style="background-color: #fff0f0;">"total"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">30401150</span>}
{<span style="background-color: #fff0f0;">"continent"</span><span style="color: #333333;">:</span><span style="background-color: #fff0f0;">"South America"</span>,<span style="background-color: #fff0f0;">"minimum"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">2000</span>,<span style="background-color: #fff0f0;">"maximum"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">170115000</span>,<span style="background-color: #fff0f0;">"counter"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">14</span>,<span style="background-color: #fff0f0;">"average"</span><span style="color: #333333;">:</span><span style="color: #6600ee; font-weight: bold;">24698571.42857143</span>,<span style="background-color: #fff0f0;">"total"</span><span style="color: #333333;">:</span><span style="color: #0000dd; font-weight: bold;">345780000</span>}</pre>
</div>
<br />
<b style="background-color: white; font-family: georgia, "times new roman", serif;">6.</b><span style="background-color: white; font-family: "georgia" , "times new roman" , serif;"> </span><span style="font-family: "georgia" , "times new roman" , serif;"><i>Şimdi 4'de yaptığımız analizi biraz değiştireceğiz. Minimum, maksimum ve ortalama nüfusu hesaplamıştık. Üzerinde en az bir kişinin yaşıdığı ülkeler arasında minimum ve maksimum nüfusa sahip ülkeleri bulalım:</i></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">let</span> url <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">'http://www.omegaegitim.com/resources/countries.json'</span>;
fetch(url)
.then(res <span style="color: #333333;">=></span> res.json())
.then((countries) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">var</span> statistics<span style="color: #333333;">=</span> countries.filter( country <span style="color: #333333;">=></span> country.population <span style="color: #333333;">></span> <span style="color: #0000dd; font-weight: bold;">0</span> ).reduce(
( statistics, country ) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">if</span> (statistics.lowestPopulatedCountry<span style="color: #333333;">==</span><span style="color: #008800; font-weight: bold;">null</span> <span style="color: #333333;">||</span> statistics.lowestPopulatedCountry.population <span style="color: #333333;"><</span> country.population)
statistics.lowestPopulatedCountry<span style="color: #333333;">=</span> country;
<span style="color: #008800; font-weight: bold;">if</span> (statistics.highestPopulatedCountry<span style="color: #333333;">==</span><span style="color: #008800; font-weight: bold;">null</span> <span style="color: #333333;">||</span> statistics.highestPopulatedCountry.population <span style="color: #333333;">></span> country.population)
statistics.highestPopulatedCountry<span style="color: #333333;">=</span> country;
<span style="color: #008800; font-weight: bold;">return</span> statistics;
}, { lowestPopulatedCountry<span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">null</span>, highestPopulatedCountry<span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">null</span>} );
console.log(<span style="background-color: #fff0f0;">"Lowest Populated Country is "</span>
<span style="color: #333333;">+</span> statistics.lowestPopulatedCountry.name
<span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" with "</span>
<span style="color: #333333;">+</span> statistics.lowestPopulatedCountry.population
<span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" population."</span>);
console.log(<span style="background-color: #fff0f0;">"Highest Populated Country is "</span>
<span style="color: #333333;">+</span> statistics.highestPopulatedCountry.name
<span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" with "</span>
<span style="color: #333333;">+</span> statistics.highestPopulatedCountry.population
<span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" population."</span>);
})
.<span style="color: #008800; font-weight: bold;">catch</span>(err <span style="color: #333333;">=></span> console.error(err));
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">İşte en az ve en çok kalabalık ülkeler:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">Lowest Populated Country is China <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">1277558000</span> population.
Highest Populated Country is Pitcairn <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">50</span> population.
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Sonuçlar şaşırtıcı olmadı ve en kalabalık ülke olarak Çin'i bulduk.</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <b style="background-color: white; font-family: georgia, "times new roman", serif;">7.</b><span style="background-color: white; font-family: "georgia" , "times new roman" , serif;"> </span><span style="font-family: "georgia" , "times new roman" , serif;"><i>Bir önceki incelemeyi bu kez kıta özelinde yapalım ve kıtalardaki en az ve en fazla nüfusa sahip ülkeleri bulalım:</i></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">let</span> url <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">'http://www.omegaegitim.com/resources/countries.json'</span>;
fetch(url)
.then(res <span style="color: #333333;">=></span> res.json())
.then((countries) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">var</span> result<span style="color: #333333;">=</span> countries.filter( country <span style="color: #333333;">=></span> country.population <span style="color: #333333;">></span> <span style="color: #0000dd; font-weight: bold;">0</span> ).reduce(
( statistics, country ) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">if</span> (<span style="color: #333333;">!</span>statistics.hasOwnProperty(country.continent)){
statistics[country.continent]<span style="color: #333333;">=</span> { continent<span style="color: #333333;">:</span> country.continent, lowestPopulatedCountry<span style="color: #333333;">:</span> country, highestPopulatedCountry<span style="color: #333333;">:</span> country };
} <span style="color: #008800; font-weight: bold;">else</span> {
<span style="color: #008800; font-weight: bold;">if</span> (statistics[country.continent].lowestPopulatedCountry.population <span style="color: #333333;"><</span> country.population)
statistics[country.continent].lowestPopulatedCountry<span style="color: #333333;">=</span> country;
<span style="color: #008800; font-weight: bold;">if</span> (statistics[country.continent].highestPopulatedCountry.population <span style="color: #333333;">></span> country.population)
statistics[country.continent].highestPopulatedCountry<span style="color: #333333;">=</span> country;
}
<span style="color: #008800; font-weight: bold;">return</span> statistics;
}, {} );
statistics<span style="color: #333333;">=</span> [];
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">var</span> o <span style="color: #008800; font-weight: bold;">in</span> result) statistics.push(result[o]);
statistics.sort( (o1,o2) <span style="color: #333333;">=></span> o1.continent.localeCompare(o2.continent) );
statistics.forEach( stat <span style="color: #333333;">=></span> {
console.log(<span style="background-color: #fff0f0;">"Lowest Populated Country in "</span> <span style="color: #333333;">+</span> stat.continent <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" is "</span>
<span style="color: #333333;">+</span> stat.lowestPopulatedCountry.name
<span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" with "</span>
<span style="color: #333333;">+</span> stat.lowestPopulatedCountry.population
<span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" population."</span>);
console.log(<span style="background-color: #fff0f0;">"Highest Populated Country in "</span> <span style="color: #333333;">+</span> stat.continent <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" is "</span>
<span style="color: #333333;">+</span> stat.highestPopulatedCountry.name
<span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" with "</span>
<span style="color: #333333;">+</span> stat.highestPopulatedCountry.population
<span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" population."</span>);
} );
})
.<span style="color: #008800; font-weight: bold;">catch</span>(err <span style="color: #333333;">=></span> console.error(err));
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">İşte kıtalardaki en az ve en çok kalabalık ülkelerin listesi:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">Lowest Populated Country <span style="color: #008800; font-weight: bold;">in</span> Africa is Nigeria <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">111506000</span> population.
Highest Populated Country <span style="color: #008800; font-weight: bold;">in</span> Africa is Saint Helena <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">6000</span> population.
Lowest Populated Country <span style="color: #008800; font-weight: bold;">in</span> Asia is China <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">1277558000</span> population.
Highest Populated Country <span style="color: #008800; font-weight: bold;">in</span> Asia is Maldives <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">286000</span> population.
Lowest Populated Country <span style="color: #008800; font-weight: bold;">in</span> Europe is Russian Federation <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">146934000</span> population.
Highest Populated Country <span style="color: #008800; font-weight: bold;">in</span> Europe is Holy See (Vatican City State) <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">1000</span> population.
Lowest Populated Country <span style="color: #008800; font-weight: bold;">in</span> North America is United States <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">278357000</span> population.
Highest Populated Country <span style="color: #008800; font-weight: bold;">in</span> North America is Saint Pierre and Miquelon <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">7000</span> population.
Lowest Populated Country <span style="color: #008800; font-weight: bold;">in</span> Oceania is Australia <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">18886000</span> population.
Highest Populated Country <span style="color: #008800; font-weight: bold;">in</span> Oceania is Pitcairn <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">50</span> population.
Lowest Populated Country <span style="color: #008800; font-weight: bold;">in</span> South America is Brazil <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">170115000</span> population.
Highest Populated Country <span style="color: #008800; font-weight: bold;">in</span> South America is Falkland Islands <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">2000</span> population.
</pre>
</div>
<br />
<b style="background-color: white; font-family: georgia, "times new roman", serif;">8.</b><span style="background-color: white; font-family: "georgia" , "times new roman" , serif;"> </span><span style="font-family: "georgia" , "times new roman" , serif;"><i>Ülkelerin, en az nüfusa ve en çok nüfusa sahip şehirlerini bulalım:</i></span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">let</span> url <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">'http://www.omegaegitim.com/resources/countries.json'</span>;
fetch(url)
.then(res <span style="color: #333333;">=></span> res.json())
.then((countries) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">var</span> result<span style="color: #333333;">=</span> countries.filter( country <span style="color: #333333;">=></span> country.population <span style="color: #333333;">></span> <span style="color: #0000dd; font-weight: bold;">0</span> ).reduce(
( statistics, country ) <span style="color: #333333;">=></span> {
statistics[country.name]<span style="color: #333333;">=</span> { name<span style="color: #333333;">:</span> country.name };
cityStatistics <span style="color: #333333;">=</span> country.cities.reduce(
( cityStatistics , city ) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">if</span> (cityStatistics.lowestPopulatedCity<span style="color: #333333;">==</span><span style="color: #008800; font-weight: bold;">null</span> <span style="color: #333333;">||</span> cityStatistics.lowestPopulatedCity.population <span style="color: #333333;"><</span> city.population)
cityStatistics.lowestPopulatedCity<span style="color: #333333;">=</span> city;
<span style="color: #008800; font-weight: bold;">if</span> (cityStatistics.highestPopulatedCity<span style="color: #333333;">==</span><span style="color: #008800; font-weight: bold;">null</span> <span style="color: #333333;">||</span> cityStatistics.highestPopulatedCity.population <span style="color: #333333;">></span> city.population)
cityStatistics.highestPopulatedCity<span style="color: #333333;">=</span> city;
<span style="color: #008800; font-weight: bold;">return</span> cityStatistics;
}
, { lowestPopulatedCity<span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">null</span>, highestPopulatedCity<span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">null</span> } );
statistics[country.name].lowestPopulatedCity<span style="color: #333333;">=</span> cityStatistics.lowestPopulatedCity;
statistics[country.name].highestPopulatedCity<span style="color: #333333;">=</span> cityStatistics.highestPopulatedCity;
<span style="color: #008800; font-weight: bold;">return</span> statistics;
}, {} );
console.log(result) ;
statistics<span style="color: #333333;">=</span> [];
<span style="color: #008800; font-weight: bold;">for</span> (<span style="color: #008800; font-weight: bold;">var</span> o <span style="color: #008800; font-weight: bold;">in</span> result) statistics.push(result[o]);
console.log(statistics.length);
statistics.sort( (o1,o2) <span style="color: #333333;">=></span> o1.name.localeCompare(o2.name) );
statistics.forEach( stat <span style="color: #333333;">=></span> {
console.log(<span style="background-color: #fff0f0;">"Lowest Populated City in "</span> <span style="color: #333333;">+</span> stat.name <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" is "</span>
<span style="color: #333333;">+</span> stat.lowestPopulatedCity.name
<span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" with "</span>
<span style="color: #333333;">+</span> stat.lowestPopulatedCity.population
<span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" population."</span>);
console.log(<span style="background-color: #fff0f0;">"Highest Populated City in "</span> <span style="color: #333333;">+</span> stat.name <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" is "</span>
<span style="color: #333333;">+</span> stat.highestPopulatedCity.name
<span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" with "</span>
<span style="color: #333333;">+</span> stat.highestPopulatedCity.population
<span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" population."</span>);
} );
})
.<span style="color: #008800; font-weight: bold;">catch</span>(err <span style="color: #333333;">=></span> console.error(err));
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">İşte ülkelerin şehirlerinin durumu:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">Lowest Populated City <span style="color: #008800; font-weight: bold;">in</span> Afghanistan is Herat <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">186800</span> population.
Highest Populated City <span style="color: #008800; font-weight: bold;">in</span> Afghanistan is Mazar<span style="color: #333333;">-</span>e<span style="color: #333333;">-</span>Sharif <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">127800</span> population.
Lowest Populated City <span style="color: #008800; font-weight: bold;">in</span> Albania is Tirana <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">270000</span> population.
Highest Populated City <span style="color: #008800; font-weight: bold;">in</span> Albania is Tirana <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">270000</span> population.
Lowest Populated City <span style="color: #008800; font-weight: bold;">in</span> Algeria is Alger <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">2168000</span> population.
Highest Populated City <span style="color: #008800; font-weight: bold;">in</span> Algeria is Gharda<span style="background-color: #ffaaaa; color: red;">ï</span>a <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">89415</span> population.
. . .
. . .
. . .
Lowest Populated City <span style="color: #008800; font-weight: bold;">in</span> Zambia is Lusaka <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">1317000</span> population.
Highest Populated City <span style="color: #008800; font-weight: bold;">in</span> Zambia is Luanshya <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">118100</span> population.
Lowest Populated City <span style="color: #008800; font-weight: bold;">in</span> Zimbabwe is Harare <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">1410000</span> population.
Highest Populated City <span style="color: #008800; font-weight: bold;">in</span> Zimbabwe is Gweru <span style="color: #008800; font-weight: bold;">with</span> <span style="color: #0000dd; font-weight: bold;">128037</span> population.
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Şu ana kadar <b>MapReduce</b> kullanarak yaptığımız hesaplamaları şimdi paralelleştirmeye çalışacağız. Bunun için <b><a href="https://parallel.js.org/" target="_blank">Parallel JS</a></b> kütüphanesini kullanacağız. Tüm ülkelerin toplam nüfusunu bu kez <i><b>paralel çalışan</b></i> <b>MapReduce</b> ile bulmaya çalışalım:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">let</span> url <span style="color: #333333;">=</span> <span style="background-color: #fff0f0;">'countries.json'</span>;
fetch(url)
.then(res <span style="color: #333333;">=></span> res.json())
.then((countries) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">var</span> task <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> Parallel(countries);
<span style="color: #008800; font-weight: bold;">var</span> async<span style="color: #333333;">=</span> task.map( country <span style="color: #333333;">=></span> country.population )
.reduce( (population) <span style="color: #333333;">=></span> { <span style="color: #008800; font-weight: bold;">return</span> population[<span style="color: #0000dd; font-weight: bold;">0</span>]<span style="color: #333333;">+</span>population[<span style="color: #0000dd; font-weight: bold;">1</span>]; } , <span style="color: #0000dd; font-weight: bold;">0</span>)
async.then( (result) <span style="color: #333333;">=></span> console.log(result) );
});
</pre>
</div>
Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-23140872437972720572017-05-17T02:02:00.003+03:002017-05-21T17:42:30.979+03:00CSS ile İçeriği Değiştirmek<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkmKa24k212yk7xQGz5MRFe-IIdDMeFe57a7glotca7iZj_tek07wllkBcFZH472RHTpHcfzq6rKWSdZ8iNchhMr5-cAgMd8XJhl8L-WZIvemnC-9Frfsjv4JO9CYNKLltNvoz62nMHtrK/s1600/css-sass.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkmKa24k212yk7xQGz5MRFe-IIdDMeFe57a7glotca7iZj_tek07wllkBcFZH472RHTpHcfzq6rKWSdZ8iNchhMr5-cAgMd8XJhl8L-WZIvemnC-9Frfsjv4JO9CYNKLltNvoz62nMHtrK/s1600/css-sass.png" /></a></div>
<span style="font-family: "georgia" , "times new roman" , serif;"><b><br /></b></span>
<span style="font-family: "georgia" , "times new roman" , serif;"><b>HTML5</b> web tarayıcısını uygulama geliştirebileceğimiz bir platforma dönüştürdü. Artık kullanıcı arayüzü mantığını sunucuda değil istemcide, web tarayıcısında oluşturuyoruz. İstemci tarafta uygulama geliştirirken kullanabileceğimiz üç temel teknoloji bulunuyor: <b>HTML</b>, <b>CSS </b>ve <b>Javascript</b>. <b>HTML</b>'i arayüzü oluşturan bileşenlerin biri birileri ile olan ilişkilerini tanımlamak için kullanıyoruz. <b>CSS </b>ise bu bileşenlerin tarayıcıda nasıl görüneceğini kontrol ediyor. Ancak hem <b>HTML </b>hem de <b>CSS </b>durağan bir içerik, kullanıcı arayüzü sunuyor. Kullanıcının arayüzle etkileşimi için bir arayüz mantığının çalıştırılması gerekir. Bunun için ise bir programlama dili olarak <b>Javascript</b>'i kullanıyoruz. <b>HTML5 </b>ise <b>HTML</b>'in en yeni sürümü, daha önceki sürümlerde olduğu gibi <b>HTML5 </b>temelde bir takı teknolojisi. <b>HTML5</b>, geriye doğru uyumlu. Daha önceki takıları yine bu sürümde de kullanabilirsiniz. <b>HTML5 </b>ile birlikte yeni bir çok takı daha geldi. Ancak <b>HTML5</b>'in getirdiği en önemli yenilik bu yeni takılar değil. Yenilik, <b>Javascript </b>üzerinden erişebildiğimiz <b>HTML5 API</b>'leri: <i>WebSocket API</i>, <i>Local Storage API</i>, <i>Battery Status API</i>, <i>FullScreen API</i>, <i>Canvas API</i>, <i>Geolocation API</i>, <i>Vibration API</i>, <i>Multimedia API</i>, <i>Local Storage API</i>, <i>File API</i>, <i>WebGL API</i>, <i>Drag-and-Drop</i> API ve <i>diğerleri</i>. </span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><i><b>DOM API</b></i> web tarayıcısı sayfayı tüm bileşenleri ile birlikte yükledikten sonra bellekte <i>ağaç yapısında</i> bir tür modelini oluşturur. Bu model <i>bileşik tasarım kalıbı</i> (=<i>composite design pattern</i>) kullanılarak gerçekleştirir. <b>DOM API</b> ile <b>Javascript </b>üzerinden bu ağaç üzerinde gezinmek, değişiklik yapmak, düğüm eklemek ve çıkarmak mümkün olur. <b>DOM ağacının</b> tanımladığı dokümana, örtük <b>document</b> nesnesi üzerinden ulaşılır. <b>document</b> nesnesinin <i>getElementById()</i>, <i>getElementsByName()</i>, <i>getElementsByTagName()</i>, <i>getElementsByTagNameNS()</i> gibi metotlarını kullanarak bu ağaç üzerinden <i><b>takı adına</b></i>, <b>id</b> <i>değerine</i>, <b>class </b><i>ismine</i> göre seçim yapmak mümkün </span><span style="font-family: "georgia" , "times new roman" , serif;">olur. Salt <b>Javascript </b>kullanılarak <b>DOM</b>'da değişiklik yapmak uğraştırıcıdır, zaman alır ve kodu daha sonra değiştirmek güç olur. Bunun için <b>jQuery </b>Javascript kütüphanesi kullanılabilir. <b>jQuery</b>'nin seçicilerini kullanarak <b>DOM</b>'da seçim yapmak ve seçilen düğümleri düzenlemek kolaydır. <b>jQuery </b>seçicileri ile ilgili detaylı anlatım için <a href="http://binkurt.blogspot.com.tr/2015/09/jqueryde-seciciler.html" target="_blank">bu yazıyı</a> okuyabilirsiniz. <b>CSS</b> ile de <b>DOM</b>'da seçim yapıp bu seçtiğimiz bileşenlerin tarayıcıda nasıl görüneceğini kontrol ediyoruz. <b>CSS</b> ile çoğu zaman görünümün nasıl olacağını kodlasak da bazen içeriği değiştirmek için kullanabiliriz. Aşağıdaki <b>HTML5</b> dokümanında çeşitli uzantılı dosyaların listesi veriliyor:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;"><!DOCTYPE html></span>
<span style="color: #007700;"><html></span>
<span style="color: #007700;"><head></span>
<span style="color: #007700;"><title></span>Files<span style="color: #007700;"></title></span>
<span style="color: #007700;"></head></span>
<span style="color: #007700;"><body></span>
<span style="color: #007700;"><table></span>
<span style="color: #007700;"><tr></span>
<span style="color: #007700;"><td><a</span> <span style="color: #0000cc;">href=</span><span style="background-color: #fff0f0;">"java.pdf"</span><span style="color: #007700;">></span>Java in action<span style="color: #007700;"></a></td></span>
<span style="color: #007700;"></tr></span>
<span style="color: #007700;"><tr></span>
<span style="color: #007700;"><td><a</span> <span style="color: #0000cc;">href=</span><span style="background-color: #fff0f0;">"python.docx"</span><span style="color: #007700;">></span>Python tutorial<span style="color: #007700;"></a></td></span>
<span style="color: #007700;"></tr></span>
<span style="color: #007700;"><tr></span>
<span style="color: #007700;"><td><a</span> <span style="color: #0000cc;">href=</span><span style="background-color: #fff0f0;">"cobol.pptx"</span><span style="color: #007700;">></span>Cobol programming<span style="color: #007700;"></a></td></span>
<span style="color: #007700;"></tr></span>
<span style="color: #007700;"><tr></span>
<span style="color: #007700;"><td><a</span> <span style="color: #0000cc;">href=</span><span style="background-color: #fff0f0;">"languages.xlsx"</span><span style="color: #007700;">></span>Comparison of programming languages<span style="color: #007700;"></a></td></span>
<span style="color: #007700;"></tr></span>
<span style="color: #007700;"></table></span>
<span style="color: #007700;"></body></span>
<span style="color: #007700;"></html></span>
</pre>
</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiByHSf3EzeZkbYkNLCUsVNhluXOGiQqZE-71_4_3_HwBpm5T3DkkAVuS4jRSu3ahMhXFKV9ekF96pEYvLC_nmlUrW4Ij-M0Q_cv57FGNiwXx4V6nTdGYatRTKZsy8oH9LoiCuIUfquylrG/s1600/css-fig1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiByHSf3EzeZkbYkNLCUsVNhluXOGiQqZE-71_4_3_HwBpm5T3DkkAVuS4jRSu3ahMhXFKV9ekF96pEYvLC_nmlUrW4Ij-M0Q_cv57FGNiwXx4V6nTdGYatRTKZsy8oH9LoiCuIUfquylrG/s1600/css-fig1.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b>HTML'in tarayıcıda görünümü</b></span></td></tr>
</tbody></table>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">Bu dosyaların bağlantılarının yanında dosyanın uzantısına, türüne, formatına göre görüntü göstermek istiyoruz. Bu problemin çözümü için <b>CSS</b>'den yararlanabiliriz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #007700;">table</span> <span style="color: #007700;">tbody</span> <span style="color: #007700;">a</span><span style="color: #333333;">[</span><span style="color: #007700;">href</span><span style="background-color: #ffaaaa; color: red;">$</span><span style="color: #333333;">=</span><span style="background-color: #fff0f0;">".pdf"</span><span style="color: #333333;">]</span><span style="color: #555555; font-weight: bold;">:after</span> {
<span style="color: #008800; font-weight: bold;">content</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0; color: #dd2200;">url("../pdf.png")</span>;
}
<span style="color: #007700;">table</span> <span style="color: #007700;">tbody</span> <span style="color: #007700;">a</span><span style="color: #333333;">[</span><span style="color: #007700;">href</span><span style="background-color: #ffaaaa; color: red;">$</span><span style="color: #333333;">=</span><span style="background-color: #fff0f0;">".docx"</span><span style="color: #333333;">]</span><span style="color: #555555; font-weight: bold;">:after</span> {
<span style="color: #008800; font-weight: bold;">content</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0; color: #dd2200;">url("../docx.png")</span>;
}
<span style="color: #007700;">table</span> <span style="color: #007700;">tbody</span> <span style="color: #007700;">a</span><span style="color: #333333;">[</span><span style="color: #007700;">href</span><span style="background-color: #ffaaaa; color: red;">$</span><span style="color: #333333;">=</span><span style="background-color: #fff0f0;">".pptx"</span><span style="color: #333333;">]</span><span style="color: #555555; font-weight: bold;">:after</span> {
<span style="color: #008800; font-weight: bold;">content</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0; color: #dd2200;">url("../pptx.png")</span>;
}
<span style="color: #007700;">table</span> <span style="color: #007700;">tbody</span> <span style="color: #007700;">a</span><span style="color: #333333;">[</span><span style="color: #007700;">href</span><span style="background-color: #ffaaaa; color: red;">$</span><span style="color: #333333;">=</span><span style="background-color: #fff0f0;">".xlsx"</span><span style="color: #333333;">]</span><span style="color: #555555; font-weight: bold;">:after</span> {
<span style="color: #008800; font-weight: bold;">content</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0; color: #dd2200;">url("../xlsx.png")</span>;
}
</pre>
</div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;"><b>CSS</b>'de uzantısı <i>pdf</i>, <i>docx</i>, <i>pptx </i>ve <i>xlsx</i> ile biten tüm <b><a></b> takılarını seçip, bu elemanlardan sonra uzantıyı gösteren bir imge yerleştiriyoruz:</span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9q21m5ukavhwqtFJe67HDGVaZcnugbEeNtNWE7otZ7kA4O9JccGoI0v7-rfh8nB0QPM7_A7W-dfYLmuhkctktHcJQAZOaiTcJUSQBv1fefxU2qfpVMkL-0-Dp2kfYXQIqNToB1UZDOcsU/s1600/css-fig2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9q21m5ukavhwqtFJe67HDGVaZcnugbEeNtNWE7otZ7kA4O9JccGoI0v7-rfh8nB0QPM7_A7W-dfYLmuhkctktHcJQAZOaiTcJUSQBv1fefxU2qfpVMkL-0-Dp2kfYXQIqNToB1UZDOcsU/s1600/css-fig2.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td class="tr-caption" style="font-size: 12.8px;"><span style="font-family: "georgia" , "times new roman" , serif; font-size: small;"><b>HTML'in CSS ile birlikte tarayıcıda görünümü</b></span></td></tr>
</tbody></table>
</td></tr>
</tbody></table>
<span style="font-family: "georgia" , "times new roman" , serif;">Problemi çözdük ancak sıkıntılı bir durum daha var. Her uzantı için <b>CSS</b>'de yaptığımız seçimi tekrar etmemiz gerekiyor. Örneğimizde dört farklı uzantı olduğu için bu durum fazla yormadı. Ancak 100 farklı uzantı için bunun tekrar etmek istemeyiz. Ne yazık ki <b>CSS </b>bir programlama dili değil. Bu nedenle dizi tanımlayamıyor ve döngü oluşturamıyoruz. Ancak <b>CSS ön işlemcileri</b> (=<b>CSS Preprocessor</b>) ile bu gibi problemleri hızlıca aşmak mümkün. Çok sayıda CSS ön işlemcisi bulunuyor: <a href="http://sass-lang.com/" target="_blank">SASS</a> (<i>Syntactically Awesome Style Sheets</i>), <a href="http://lesscss.org/" target="_blank">less</a>, <a href="http://stylus-lang.com/" target="_blank">stylus</a>. Yukarıdaki problemi <b>SASS</b>'da basit bir şekilde çözebiliriz:</span><br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b style="font-family: Georgia, "Times New Roman", serif;"><br />
</b></span> <span style="font-family: "georgia" , "times new roman" , serif;"><b style="font-family: Georgia, "Times New Roman", serif;">file-extensions.sass:</b> </span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #0000cc;">$ext-list</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"pdf"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"docx"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"pptx"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"xlsx"</span>
<span style="color: #008800; font-weight: bold;">@for</span> <span style="color: #996633;">$i</span> <span style="color: black; font-weight: bold;">from</span> <span style="color: #0000dd; font-weight: bold;">1</span> <span style="color: black; font-weight: bold;">through</span> <span style="color: #0066bb; font-weight: bold;">length</span>(<span style="color: #996633;">$ext-list</span>)
<span style="color: #996633;">$ext</span><span style="color: #333333;">:</span> <span style="color: #0066bb; font-weight: bold;">nth</span>(<span style="color: #996633;">$ext-list</span><span style="color: #333333;">,</span> <span style="color: #996633;">$i</span>)
<span style="color: #007700;">table</span> <span style="color: #007700;">tbody</span> <span style="color: #007700;">a</span>
<span style="color: #0000cc;">&</span><span style="background-color: #ffaaaa; color: red;">[</span><span style="color: #0000cc;">href$</span><span style="color: #333333;">=</span><span style="background-color: #fff0f0;">"</span><span style="background-color: #eeeeee;">#{</span><span style="background-color: #fff0f0;">'.'</span><span style="color: #333333;">+</span><span style="color: #996633;">$ext</span><span style="background-color: #eeeeee;">}</span><span style="background-color: #fff0f0;">"</span>]<span style="color: #333333;">:</span>after
<span style="color: #0000cc;">content</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0; color: #dd2200;">url("../</span><span style="background-color: #eeeeee;">#{</span><span style="color: #996633;">$ext</span><span style="background-color: #eeeeee;">}</span><span style="background-color: #fff0f0; color: #dd2200;">.png")</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>SASS</b> ön işlemcisi kullanarak <b>file-extensions.sass</b> dosyasından <b>CSS </b>üreteriyoruz:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #007700;">table</span> <span style="color: #007700;">tbody</span> <span style="color: #007700;">a</span><span style="color: #333333;">[</span><span style="color: #007700;">href</span><span style="background-color: #ffaaaa; color: red;">$</span><span style="color: #333333;">=</span><span style="background-color: #fff0f0;">".pdf"</span><span style="color: #333333;">]</span><span style="color: #555555; font-weight: bold;">:after</span> {
<span style="color: #008800; font-weight: bold;">content</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0; color: #dd2200;">url("../pdf.png")</span>; }
<span style="color: #007700;">table</span> <span style="color: #007700;">tbody</span> <span style="color: #007700;">a</span><span style="color: #333333;">[</span><span style="color: #007700;">href</span><span style="background-color: #ffaaaa; color: red;">$</span><span style="color: #333333;">=</span><span style="background-color: #fff0f0;">".docx"</span><span style="color: #333333;">]</span><span style="color: #555555; font-weight: bold;">:after</span> {
<span style="color: #008800; font-weight: bold;">content</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0; color: #dd2200;">url("../docx.png")</span>; }
<span style="color: #007700;">table</span> <span style="color: #007700;">tbody</span> <span style="color: #007700;">a</span><span style="color: #333333;">[</span><span style="color: #007700;">href</span><span style="background-color: #ffaaaa; color: red;">$</span><span style="color: #333333;">=</span><span style="background-color: #fff0f0;">".pptx"</span><span style="color: #333333;">]</span><span style="color: #555555; font-weight: bold;">:after</span> {
<span style="color: #008800; font-weight: bold;">content</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0; color: #dd2200;">url("../pptx.png")</span>; }
<span style="color: #007700;">table</span> <span style="color: #007700;">tbody</span> <span style="color: #007700;">a</span><span style="color: #333333;">[</span><span style="color: #007700;">href</span><span style="background-color: #ffaaaa; color: red;">$</span><span style="color: #333333;">=</span><span style="background-color: #fff0f0;">".xlsx"</span><span style="color: #333333;">]</span><span style="color: #555555; font-weight: bold;">:after</span> {
<span style="color: #008800; font-weight: bold;">content</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0; color: #dd2200;">url("../xlsx.png")</span>; }
<span style="color: #888888;">/*# sourceMappingURL=file-extension.css.map */</span>
</pre>
</div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Neyse ki bu sefer <b>CSS</b>'si biz kodlamak zorunda kalmadık!</span>Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0tag:blogger.com,1999:blog-2756890279096274314.post-59047311671915256252017-04-27T01:28:00.000+03:002017-06-20T12:48:44.415+03:00Creating Strong Password using Stream API of Java 9<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxqUdPFNNFFCQWWHBh2xfP4nhGNxZvzuEXuwoJcXdmi1lNgvEFUlOuctvcOXEqrPeLog8g7AwTBLBXQSBrkdO178OCl393QjiQJ-P2S2tv5VL59nTJ-V1Tv7A4VaL-JgsXLIf1_wmDzFqH/s1600/strong-password.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxqUdPFNNFFCQWWHBh2xfP4nhGNxZvzuEXuwoJcXdmi1lNgvEFUlOuctvcOXEqrPeLog8g7AwTBLBXQSBrkdO178OCl393QjiQJ-P2S2tv5VL59nTJ-V1Tv7A4VaL-JgsXLIf1_wmDzFqH/s1600/strong-password.png" /></a></div>
<span style="font-family: "georgia" , "times new roman" , serif;"><br />
</span> <span style="font-family: "georgia" , "times new roman" , serif;">Creating a strong password has never been so easy in <b>Java</b> when <b>Stream API</b> is used. <b>Stream API</b> is introduced in <b>Java SE 8</b> and has changed the way we think and develop in Java together with the <b><i>functional programming</i></b> and <i><b>lambda expressions</b></i>. <b>Java 9</b> will improve the <b>Stream API</b> with new convenience methods. <b>Stream API</b> is basically designed to work with collections in functional style. I would like to exemplify this new way of thinking simply by creating a strong password: </span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">java9</span><span style="color: #333333;">.</span><span style="color: #0000cc;">features</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.security.SecureRandom</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.Collectors</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.IntStream</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">final</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">StrongPasswordApplication</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> CHARACTER_TABLE<span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span>
<span style="background-color: #fff0f0;">"a"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"b"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"c"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"d"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"e"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"f"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"g"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"h"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"i"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"j"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"k"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"l"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"m"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"n"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"o"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"p"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"q"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"r"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"s"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"t"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"u"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"v"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"w"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"x"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"y"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"z"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"A"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"B"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"C"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"D"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"E"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"F"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"G"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"H"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"I"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"J"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"K"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"L"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"M"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"N"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"O"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"P"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Q"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"R"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"S"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"T"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"U"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"V"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"W"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"X"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Y"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Z"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"0"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"1"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"2"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"3"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"4"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"5"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"6"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"7"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"8"</span><span style="color: #333333;">,</span><span style="background-color: #fff0f0;">"9"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"_"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"-"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"$"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"@"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"#"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"?"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"%"</span>
<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> String <span style="color: #0066bb; font-weight: bold;">create</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> length<span style="color: #333333;">){</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">SecureRandom</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">ints</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span>CHARACTER_TABLE<span style="color: #333333;">.</span><span style="color: #0000cc;">size</span><span style="color: #333333;">())</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">limit</span><span style="color: #333333;">(</span>length<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">boxed</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span> <span style="color: #997700; font-weight: bold;">CHARACTER_TABLE:</span><span style="color: #333333;">:</span>get <span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">joining</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">There are new methods added to the <b>Stream </b>interface in <b>Java 9</b>: <b>dropWhile</b>, <b>takeWhile</b>, <b>ofNullable</b>. Now, we allow the application programmer to define what strong password is and create a password that conforms that definition:</span><br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">java9</span><span style="color: #333333;">.</span><span style="color: #0000cc;">features</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.security.SecureRandom</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.Collectors</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.stream.IntStream</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">RandomPasswordApplication</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">final</span> List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> CHARACTER_TABLE <span style="color: #333333;">=</span> List<span style="color: #333333;">.</span><span style="color: #0000cc;">of</span><span style="color: #333333;">(</span>
<span style="background-color: #fff0f0;">"a"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"b"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"c"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"d"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"e"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"f"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"g"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"h"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"i"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"j"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"k"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"l"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"m"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"n"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"o"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"p"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"q"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"r"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"s"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"t"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"u"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"v"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"w"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"x"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"y"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"z"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"A"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"B"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"C"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"D"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"E"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"F"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"G"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"H"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"I"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"J"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"K"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"L"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"M"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"N"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"O"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"P"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Q"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"R"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"S"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"T"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"U"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"V"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"W"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"X"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Y"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"Z"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"0"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"1"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"2"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"3"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"4"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"5"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"6"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"7"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"8"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"9"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"0"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"1"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"2"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"3"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"4"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"5"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"6"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"7"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"8"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"9"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"_"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"-"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"$"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"@"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"#"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"&"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"%"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"/"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"\\"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"?"</span><span style="color: #333333;">,</span>
<span style="background-color: #fff0f0;">"*"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"+"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"!"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"."</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">","</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">";"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"~"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"'"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"\""</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">"<"</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;">">"</span>
<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
IntStream<span style="color: #333333;">.</span><span style="color: #0000cc;">range</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">8</span><span style="color: #333333;">,</span> <span style="color: #0000dd; font-weight: bold;">15</span><span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">boxed</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">RandomPasswordApplication:</span><span style="color: #333333;">:</span>createpassword<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>password <span style="color: #333333;">-></span> String<span style="color: #333333;">.</span><span style="color: #0000cc;">format</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Password [length=%d] is %s"</span><span style="color: #333333;">,</span> password<span style="color: #333333;">.</span><span style="color: #0000cc;">length</span><span style="color: #333333;">(),</span> password<span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> String <span style="color: #0066bb; font-weight: bold;">createpassword</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> length<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">final</span> StrongPassword strongness <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> StrongPassword<span style="color: #333333;">.</span><span style="color: #0000cc;">Builder</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">minimumNumberOfDigits</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">minimumNumberOfSpecialCharacters</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">minimumNumberOfCapitalLetters</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">minimumLength</span><span style="color: #333333;">(</span>length<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">build</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">SecureRandom</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">ints</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">,</span> CHARACTER_TABLE<span style="color: #333333;">.</span><span style="color: #0000cc;">size</span><span style="color: #333333;">())</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">boxed</span><span style="color: #333333;">()</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">CHARACTER_TABLE:</span><span style="color: #333333;">:</span>get<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">takeWhile</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">strongness:</span><span style="color: #333333;">:</span>isWeek<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">collect</span><span style="color: #333333;">(</span>Collectors<span style="color: #333333;">.</span><span style="color: #0000cc;">joining</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;"><b>StrongPassword</b> class defines the <i><b>strongness</b></i> of the password:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">example</span><span style="color: #333333;">.</span><span style="color: #0000cc;">java9</span><span style="color: #333333;">.</span><span style="color: #0000cc;">features</span><span style="color: #333333;">;</span>
<span style="color: #888888;">/**</span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * @author Binnur Kurt (binnur.kurt@gmail.com)</span>
<span style="color: #888888;"> */</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">StrongPassword</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> <span style="color: #333399; font-weight: bold;">int</span> minimumNumberOfDigits<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> <span style="color: #333399; font-weight: bold;">int</span> minimumNumberOfCapitalLetters<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> <span style="color: #333399; font-weight: bold;">int</span> minimumNumberOfSpecialCharacters<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #008800; font-weight: bold;">final</span> <span style="color: #333399; font-weight: bold;">int</span> minimumLength<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #333399; font-weight: bold;">int</span> length<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #333399; font-weight: bold;">int</span> numberOfDigits<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #333399; font-weight: bold;">int</span> numberOfSpecialCharacters<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #333399; font-weight: bold;">int</span> numberOfCapitalLetters<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #0066bb; font-weight: bold;">StrongPassword</span><span style="color: #333333;">(</span>Builder builder<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">minimumNumberOfDigits</span> <span style="color: #333333;">=</span> builder<span style="color: #333333;">.</span><span style="color: #0000cc;">minimumNumberOfDigits</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">minimumNumberOfCapitalLetters</span> <span style="color: #333333;">=</span> builder<span style="color: #333333;">.</span><span style="color: #0000cc;">minimumNumberOfCapitalLetters</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">minimumNumberOfSpecialCharacters</span> <span style="color: #333333;">=</span> builder<span style="color: #333333;">.</span><span style="color: #0000cc;">minimumNumberOfSpecialCharacters</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">minimumLength</span> <span style="color: #333333;">=</span> builder<span style="color: #333333;">.</span><span style="color: #0000cc;">minimumLength</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #333399; font-weight: bold;">boolean</span> <span style="color: #0066bb; font-weight: bold;">isWeek</span><span style="color: #333333;">(</span>String s<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">final</span> <span style="color: #333399; font-weight: bold;">boolean</span> isWeekPassword <span style="color: #333333;">=</span> <span style="color: #333333;">(</span>length <span style="color: #333333;"><</span> minimumLength<span style="color: #333333;">)</span>
<span style="color: #333333;">||</span> <span style="color: #333333;">(</span>numberOfDigits <span style="color: #333333;"><</span> minimumNumberOfDigits<span style="color: #333333;">)</span>
<span style="color: #333333;">||</span> <span style="color: #333333;">(</span>numberOfSpecialCharacters <span style="color: #333333;"><</span> minimumNumberOfSpecialCharacters<span style="color: #333333;">)</span>
<span style="color: #333333;">||</span> <span style="color: #333333;">(</span>numberOfCapitalLetters <span style="color: #333333;"><</span> minimumNumberOfCapitalLetters<span style="color: #333333;">);</span>
length<span style="color: #333333;">++;</span>
<span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>Character<span style="color: #333333;">.</span><span style="color: #0000cc;">isDigit</span><span style="color: #333333;">(</span>s<span style="color: #333333;">.</span><span style="color: #0000cc;">charAt</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">)))</span> <span style="color: #333333;">{</span>
numberOfDigits<span style="color: #333333;">++;</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">else</span> <span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(!</span>Character<span style="color: #333333;">.</span><span style="color: #0000cc;">isLetter</span><span style="color: #333333;">(</span>s<span style="color: #333333;">.</span><span style="color: #0000cc;">charAt</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">)))</span> <span style="color: #333333;">{</span>
numberOfSpecialCharacters<span style="color: #333333;">++;</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">else</span> <span style="color: #008800; font-weight: bold;">if</span> <span style="color: #333333;">(</span>s<span style="color: #333333;">.</span><span style="color: #0000cc;">equals</span><span style="color: #333333;">(</span>s<span style="color: #333333;">.</span><span style="color: #0000cc;">toUpperCase</span><span style="color: #333333;">()))</span> <span style="color: #333333;">{</span>
numberOfCapitalLetters<span style="color: #333333;">++;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">return</span> isWeekPassword<span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">Builder</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #333399; font-weight: bold;">int</span> minimumNumberOfDigits<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #333399; font-weight: bold;">int</span> minimumNumberOfCapitalLetters<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #333399; font-weight: bold;">int</span> minimumNumberOfSpecialCharacters<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">private</span> <span style="color: #333399; font-weight: bold;">int</span> minimumLength<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> Builder <span style="color: #0066bb; font-weight: bold;">minimumNumberOfDigits</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> minimumNumberOfDigits<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">minimumNumberOfDigits</span> <span style="color: #333333;">=</span> minimumNumberOfDigits<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> Builder <span style="color: #0066bb; font-weight: bold;">minimumNumberOfCapitalLetters</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> minimumNumberOfCapitalLetters<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">minimumNumberOfCapitalLetters</span> <span style="color: #333333;">=</span> minimumNumberOfCapitalLetters<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> Builder <span style="color: #0066bb; font-weight: bold;">minimumNumberOfSpecialCharacters</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> minimumNumberOfSpecialCharacters<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">minimumNumberOfSpecialCharacters</span> <span style="color: #333333;">=</span> minimumNumberOfSpecialCharacters<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> Builder <span style="color: #0066bb; font-weight: bold;">minimumLength</span><span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> minimumLength<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">.</span><span style="color: #0000cc;">minimumLength</span> <span style="color: #333333;">=</span> minimumLength<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">;</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> StrongPassword <span style="color: #0066bb; font-weight: bold;">build</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">new</span> <span style="color: #0066bb; font-weight: bold;">StrongPassword</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">One example output of the execution is given below:</span><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">Password [length=8] is k@\D%b16</span>
<span style="color: #888888;">Password [length=9] is "+fORbi9f</span>
<span style="color: #888888;">Password [length=10] is D35g,'7zKN</span>
<span style="color: #888888;">Password [length=11] is PJTnpN~YN1o</span>
<span style="color: #888888;">Password [length=12] is 2AD!H"xGhBZd</span>
<span style="color: #888888;">Password [length=13] is b+A9-Ovzc+,RD</span>
<span style="color: #888888;">Password [length=14] is *@Nj\89nW7ep5B</span>
</pre>
</div>
<br />
<span style="font-family: "georgia" , "times new roman" , serif;">You could retrieve the code from <a href="http://www.omegaegitim.com/sources/java9.strong-password.zip" target="_blank">this URL</a> as </span><b>NetBeans IDE Dev</b> (<i>Build 2017-06-14-0001</i>) <span style="font-family: "georgia" , "times new roman" , serif;">project.</span>Dr. Binnur Kurthttp://www.blogger.com/profile/17534373687149909669noreply@blogger.com0