{"id":18250,"date":"2019-03-04T13:48:19","date_gmt":"2019-03-04T12:48:19","guid":{"rendered":"https:\/\/blog.trifork.com\/?p=18250"},"modified":"2024-09-16T11:49:58","modified_gmt":"2024-09-16T09:49:58","slug":"leaving-a-java-legacy-behind","status":"publish","type":"post","link":"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/","title":{"rendered":"Leaving a Java legacy behind"},"content":{"rendered":"\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"660\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2019\/03\/shutterstock_343734560-1024x660.jpg\" alt=\"\" class=\"wp-image-18302\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2019\/03\/shutterstock_343734560-1024x660.jpg 1024w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2019\/03\/shutterstock_343734560-300x193.jpg 300w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2019\/03\/shutterstock_343734560-768x495.jpg 768w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2019\/03\/shutterstock_343734560-1536x990.jpg 1536w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2019\/03\/shutterstock_343734560-2048x1320.jpg 2048w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2019\/03\/shutterstock_343734560-1920x1237.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>As with a house, software&nbsp;applications require maintenance too. Otherwise, you risk the digital equivalent of rot: bit-rot. Often, the maintenance is done like with a house: Superficially to make it look nice again with a new look-and-feel, a new colour scheme (a paint job) and a few new stock photos. But every once in a while you also need to replace your kitchen, redo your living room. However, the technical equivalent &#8212; upgrading your application to a new version of Java &#8212; is not that common.<\/p>\n\n\n\n<p>Often, an application that has been written in Java 5, 6 or 7 will still run on that version. With the new release schedule of Java since version 9 in 2017, that means you may be looking at a lot of ground to cover to catch up. At the time of writing, Java 11 is the latest stable release and version 12 is around the corner.<\/p>\n\n\n\n<p>Here at Trifork, we have been developing software in Java for a long time. During that time we have been asked to modify some of our own work (either under an SLA or ad-hoc), but also to do a scan of, or maintenance on, the work of others. Based on that experience, I would like to take you on a bit of a deep dive into what it means to work with those older versions of Java and why and how you can bring them up to date again.<\/p>\n\n\n\n<p>The most obvious reason to do something about an application written in an older version of Java is the fact that at some point, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Java_version_history\">support for that version will stop<\/a>. That would be enough reason for some managers to freak out, but developers probably won&#8217;t worry too much. They are more amenable to other reasons, like improved performance, code readability, new algorithms or more efficient data structures.<\/p>\n\n\n\n<p><strong>Collections<\/strong><br>Now, this blog is for developers and we&#8217;ve not yet seen a line of code. So let&#8217;s dive into some examples. First one for the old greybeards among us, like myself: the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Java_collections_framework\">Collections API<\/a>. Where we would originally store objects in an array, vector or hashtable, there are now the List, Set and Map interfaces with various implementations and different characteristics to choose from.  So, where we used to create some collection of data like this:<br><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nVector vector = new Vector();\nvector.addElement(\"Element 1\");\nvector.addElement(\"Element 2\");\n<\/pre><\/div>\n\n\n<p>We can now do it like this:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nList list = new ArrayList();\nlist.add(\"Element 1\");\nlist.add(\"Element 2\");\n<\/pre><\/div>\n\n\n<p>Although the changes look minimal at first glance, this meant a huge deal when introduced. There was now a standard way of dealing with collections, and if we find out that our application benefits more from a LinkedList, then all we need to do is change the first line there from ArrayList to LinkedList.<\/p>\n\n\n\n<p>And since Java 9:  <\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nList list = List.of(e1, e2, e3)\n<\/pre><\/div>\n\n\n<p><strong>Iterating<\/strong><br>As with collections, there is also a use for iterating over the content. That is where we have had the perennial for loop (and its lesser used siblings while and do-while):<br><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nfor(int i = 0; i &lt; list.size(); i++) { \/\/ do stuff }\n<\/pre><\/div>\n\n\n<p>A pretty simple example, but as the components become a bit more evolved an <a href=\"https:\/\/en.wikipedia.org\/wiki\/Off-by-one_error\">off-by-one error<\/a> or OB1 is easy to make and not always easily noticed.<br>That one got pretty much covered by the sugar-coated version from Java 8:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nforeach(E e in list) { \/\/ do stuff }\n<\/pre><\/div>\n\n\n<p>At the same time, another new feature was introduced that not only did away with the OB1 but also introduced a host of other opportunities: the <a href=\"https:\/\/www.baeldung.com\/java-8-streams\">Stream API<\/a>. The <em>for each<\/em> equivalent of which would be:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nlist.stream().forEach({ \/\/ do stuff })\n<\/pre><\/div>\n\n\n<p>Besides the forEach(), there are also other options like mapping, filtering and sorting. And all you have to do is provide the operation you want to do:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nlist.parallelStream().forEach(ElementType::increment)\n<\/pre><\/div>\n\n\n<p>The above example is doing everything in parallel under the hood using the <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/concurrent\/ExecutorService.html\">ExecutorService<\/a> and <a href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/essential\/concurrency\/forkjoin.html\">Fork-Join&nbsp;Framework<\/a> as introduced in Java 5 and 7 respectively.<br><\/p>\n\n\n\n<p>Do be careful with applying this to everything though. You are still responsible for making sure the operation is able to work correctly while running in parallel. It can make you run into trouble so much faster, as <a href=\"http:\/\/1.bp.blogspot.com\/_aLMdXt21I2M\/TM6sj_RUFYI\/AAAAAAAAABA\/pAGMAPf3RCI\/s1600\/Fokke+en+Sukke+nieuwe+computer.gif\">Fokke &amp; Sukke commented<\/a> on a while ago&#8230;<\/p>\n\n\n\n<p><strong>Lambdas<\/strong><br>The last code snippet also brings me to another recent language feature: \u03bb-functions. Where at the beginning there was the anonymous inner class construction for some highly specific things, like a <em>Runnable<\/em> implementation:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nexecutorService.submit(new Runnable {\n    @Override\n    public void run() {\n        \/\/ do some stuff\n    }\n})\n<\/pre><\/div>\n\n\n<p>It is now possible to do this with a lot less boilerplate:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nexecutorService.submit(() -&gt; run() {\n    \/\/ do some stuff\n})\n<\/pre><\/div>\n\n\n<p>In some cases, your IDE may be able to help you refactor this code with minimal effort. <\/p>\n\n\n\n<p>If your run implementation happens to be about invoking some service method, you may even be able to shorten it to something like:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nexecutorService.submit(SomeService::doStuff)\n<\/pre><\/div>\n\n\n<p>How is that for reducing the amount of boilerplate?<\/p>\n\n\n\n<p><strong>Strings <\/strong><br>I would like to end with some examples around the String class. Arguably, the most used non-primitive &#8216;primitive&#8217; in Java development, if not in any business programming setting.<\/p>\n\n\n\n<p>Strings have always been a bit of a strange one in Java. It is the only object where you can use operators on like <em>&#8220;foo&#8221; + &#8220;bar&#8221;<\/em> and incidentally it was also for a long time the only class with multiple ways of instantiating an instance. The earlier example in a more &#8216;true&#8217; OO fashion would be written like:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nString fooBar = new String(\"foo\").append(new String(\"bar\"));\n<\/pre><\/div>\n\n\n<p>Can you spot the significant characters in that letter soup?<\/p>\n\n\n\n<p>On the other hand, the shorter notation with operators was allegedly not the most performant code; whether from computational or memory perspective. Some people may remember the errors about the <em>PermGenSpace<\/em> being full due to too many String literals being used.<br>To offset that there was the <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/StringBuffer.html\">StringBuffer<\/a> class. That would allow you to do concatenation without building up a large set of new object instances that would be eligible for garbage collection within milliseconds after creation:<br><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nString fooBar = new StringBuffer(\"foo\").append(\"bar\").toString()\n<\/pre><\/div>\n\n\n<p>Unfortunately, it suffered from the same cautious programming model as the previously mentioned Vector and Hashtable classes. By having all operations synchronised, any operation required an expensive lock to be acquired first.<br><\/p>\n\n\n\n<p>To remedy that, there is the <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/StringBuilder.html\">StringBuilder<\/a> class. The API is the same as the StringBuffer, so it is a drop-in replacement, but it is no longer synchronised.<br>Quite an easy change to make!<br><\/p>\n\n\n\n<p>One thing wasn&#8217;t really covered by this and it was an equivalent of the venerable C  standard library method <em>printf<\/em>. Some logging libraries already had placeholders for things to inject into standard log messages, but for other purposes, there wasn&#8217;t really a standard way to do that.<br>This changed with the introduction of the <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/util\/Formatter.html\">String.format<\/a> method. Looking at the documentation it does appear as if they wanted to outdo the C version in capabilities but also increased the complexity. And <a href=\"https:\/\/redfin.engineering\/java-string-concatenation-which-way-is-best-8f590a7d22a8\">according to some<\/a>, performance is also suffering from this method.<br><\/p>\n\n\n\n<p>Luckily the powers that be didn&#8217;t stop at that. More improvements have been made, like the stream joining methods (in various guises). The <a href=\"http:\/\/www.thejavageek.com\/2013\/06\/19\/the-string-constant-pool\/\">String Constant Pool<\/a> was moved out of the <em>PermGenSpace<\/em> and into the heap space; that at least removes the weird situation that an app has enough memory available, but could still fail because of an <em>OutOfMemory<\/em> error.<br>Further memory improvements were made in Java 9 with the <a href=\"https:\/\/openjdk.java.net\/jeps\/254\">Compact String<\/a> that significantly reduces the memory consumption and hence the need for garbage collection in many apps. And all of that goodness comes just by running it on a newer version of the JVM!<\/p>\n\n\n\n<p>Most of these improvements do not, however, release you from the effort of thinking about how a <em>String<\/em> (or any object for that matter) will be used in your application as most of the measures may be good for some use cases, but can also be very bad for others.<\/p>\n\n\n\n<p><strong>Conclusion<\/strong><br>We&#8217;ve gone through a lot of examples of how you can gain better performance, improve readability, and strengthen the robustness of a Java-based application, by keeping up with the times and leaving a better legacy behind you.<br><\/p>\n\n\n\n<p>All of the above are just examples of what has improved over time. There are plenty more to mention, like finally having a working <a href=\"https:\/\/www.oracle.com\/technetwork\/articles\/java\/jf14-date-time-2125367.html\">Date &amp; Time API<\/a> in Java, the removal of the <em>PermGenSpace<\/em>, the module system and the new <a href=\"https:\/\/docs.oracle.com\/javase\/9\/docs\/api\/java\/util\/concurrent\/Flow.html\">Reactive API<\/a> in version 9, and the <a href=\"https:\/\/openjdk.java.net\/jeps\/286\">val<\/a><a href=\"https:\/\/openjdk.java.net\/jeps\/286\"> keyword<\/a> in Java 10.<\/p>\n\n\n\n<p>Beyond that, the ecosystem also provides plenty of opportunities, be it from libraries and frameworks or from integrating with pieces of code written in alternative JVM-based languages (Kotlin for data classes, anyone?). <br><\/p>\n\n\n\n<p>I hope I&#8217;ve provided you with some insights into what is available and that could benefit your work. Java may be getting older, but it has by no means stopped improving. But you do have to keep up with it though &#8212; now more than ever before!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Struggling with Legacy System Modernization?<\/h3>\n\n\n\n<p>If you\u2019re facing challenges modernizing your legacy systems\u2014whether it&#8217;s integrating with modern technologies, ensuring compliance, or managing operational disruptions &#8211; Trifork is here to guide you. <\/p>\n\n\n\n<p>We specialize in simplifying the complexity of legacy system upgrades with a strategic, agile approach that breaks down overwhelming tasks into manageable phases.<\/p>\n\n\n\n<p><a href=\"https:\/\/trifork.nl\/contact\/\">Contact Us Now for Expert Legacy System Modernization Assistance!<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>As with a house, software&nbsp;applications require maintenance too. Otherwise, you risk the digital equivalent of rot: bit-rot. Often, the maintenance is done like with a house: Superficially to make it look nice again with a new look-and-feel, a new colour scheme (a paint job) and a few new stock photos. But every once in a [&hellip;]<\/p>\n","protected":false},"author":112,"featured_media":18302,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"categories":[31,10],"tags":[11,242,470,467],"class_list":["post-18250","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","category-development","tag-java","tag-java-api","tag-legacy","tag-software-development"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Leaving a Java legacy behind - Trifork Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Leaving a Java legacy behind - Trifork Blog\" \/>\n<meta property=\"og:description\" content=\"As with a house, software&nbsp;applications require maintenance too. Otherwise, you risk the digital equivalent of rot: bit-rot. Often, the maintenance is done like with a house: Superficially to make it look nice again with a new look-and-feel, a new colour scheme (a paint job) and a few new stock photos. But every once in a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/\" \/>\n<meta property=\"og:site_name\" content=\"Trifork Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-03-04T12:48:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-16T09:49:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2019\/03\/shutterstock_343734560-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1650\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Thomas Zeeman\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Thomas Zeeman\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/\",\"url\":\"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/\",\"name\":\"Leaving a Java legacy behind - Trifork Blog\",\"isPartOf\":{\"@id\":\"https:\/\/trifork.nl\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2019\/03\/shutterstock_343734560-scaled.jpg\",\"datePublished\":\"2019-03-04T12:48:19+00:00\",\"dateModified\":\"2024-09-16T09:49:58+00:00\",\"author\":{\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/efdddc5a3544e58b3f0b5c9e4d538380\"},\"breadcrumb\":{\"@id\":\"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/#primaryimage\",\"url\":\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2019\/03\/shutterstock_343734560-scaled.jpg\",\"contentUrl\":\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2019\/03\/shutterstock_343734560-scaled.jpg\",\"width\":2560,\"height\":1650},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/trifork.nl\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Leaving a Java legacy behind\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/trifork.nl\/blog\/#website\",\"url\":\"https:\/\/trifork.nl\/blog\/\",\"name\":\"Trifork Blog\",\"description\":\"Keep updated on the technical solutions Trifork is working on!\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/trifork.nl\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/efdddc5a3544e58b3f0b5c9e4d538380\",\"name\":\"Thomas Zeeman\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7d4352b454b0123a6a8e1b71a69bd5de?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7d4352b454b0123a6a8e1b71a69bd5de?s=96&d=mm&r=g\",\"caption\":\"Thomas Zeeman\"},\"url\":\"https:\/\/trifork.nl\/blog\/author\/thomasz\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Leaving a Java legacy behind - Trifork Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/","og_locale":"en_US","og_type":"article","og_title":"Leaving a Java legacy behind - Trifork Blog","og_description":"As with a house, software&nbsp;applications require maintenance too. Otherwise, you risk the digital equivalent of rot: bit-rot. Often, the maintenance is done like with a house: Superficially to make it look nice again with a new look-and-feel, a new colour scheme (a paint job) and a few new stock photos. But every once in a [&hellip;]","og_url":"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/","og_site_name":"Trifork Blog","article_published_time":"2019-03-04T12:48:19+00:00","article_modified_time":"2024-09-16T09:49:58+00:00","og_image":[{"width":2560,"height":1650,"url":"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2019\/03\/shutterstock_343734560-scaled.jpg","type":"image\/jpeg"}],"author":"Thomas Zeeman","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Thomas Zeeman","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/","url":"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/","name":"Leaving a Java legacy behind - Trifork Blog","isPartOf":{"@id":"https:\/\/trifork.nl\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/#primaryimage"},"image":{"@id":"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/#primaryimage"},"thumbnailUrl":"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2019\/03\/shutterstock_343734560-scaled.jpg","datePublished":"2019-03-04T12:48:19+00:00","dateModified":"2024-09-16T09:49:58+00:00","author":{"@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/efdddc5a3544e58b3f0b5c9e4d538380"},"breadcrumb":{"@id":"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/#primaryimage","url":"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2019\/03\/shutterstock_343734560-scaled.jpg","contentUrl":"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2019\/03\/shutterstock_343734560-scaled.jpg","width":2560,"height":1650},{"@type":"BreadcrumbList","@id":"https:\/\/trifork.nl\/blog\/leaving-a-java-legacy-behind\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/trifork.nl\/blog\/"},{"@type":"ListItem","position":2,"name":"Leaving a Java legacy behind"}]},{"@type":"WebSite","@id":"https:\/\/trifork.nl\/blog\/#website","url":"https:\/\/trifork.nl\/blog\/","name":"Trifork Blog","description":"Keep updated on the technical solutions Trifork is working on!","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/trifork.nl\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/efdddc5a3544e58b3f0b5c9e4d538380","name":"Thomas Zeeman","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/7d4352b454b0123a6a8e1b71a69bd5de?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7d4352b454b0123a6a8e1b71a69bd5de?s=96&d=mm&r=g","caption":"Thomas Zeeman"},"url":"https:\/\/trifork.nl\/blog\/author\/thomasz\/"}]}},"_links":{"self":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/18250","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/users\/112"}],"replies":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/comments?post=18250"}],"version-history":[{"count":1,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/18250\/revisions"}],"predecessor-version":[{"id":21144,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/18250\/revisions\/21144"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/media\/18302"}],"wp:attachment":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/media?parent=18250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/categories?post=18250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/tags?post=18250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}