{"generator":"Jekyll","link":[{"@attributes":{"href":"https:\/\/www.devdiaries.net\/feed.xml","rel":"self","type":"application\/atom+xml"}},{"@attributes":{"href":"https:\/\/www.devdiaries.net\/","rel":"alternate","type":"text\/html"}}],"updated":"2021-03-09T20:51:34+00:00","id":"https:\/\/www.devdiaries.net\/feed.xml","title":"Devdiaries","subtitle":"Programming tips, tricks, news for the Java programming language, Openhift, Cloud Native Microservices and Security","entry":[{"title":"Anemic Domain Model vs Rich Domain Model in Java","link":{"@attributes":{"href":"https:\/\/www.devdiaries.net\/blog\/Java-Anemic-Domain-Model-Rich-Domain-Model\/","rel":"alternate","type":"text\/html","title":"Anemic Domain Model vs Rich Domain Model in Java"}},"published":"2021-03-08T00:00:00+00:00","updated":"2021-03-08T00:00:00+00:00","id":"https:\/\/www.devdiaries.net\/blog\/Java-Anemic-Domain-Model-Rich-Domain-Model","content":"<p>When we write code, we try to hide as many details as possible - using appropriate access modifiers. Most often we use getters and setters methods to set the appropriate state of an object. Is this a good practice?\nIn this article you will learn what is <strong>Anemic Domain Model<\/strong> and <strong>Rich Domain Model<\/strong> and which way of creating models is the best. \nWhat\u2019s more, you\u2019ll find a special opportunity from <a href=\"https:\/\/codegym.cc\/\">CodeGym<\/a> at the end of this post. I invite you to read :)<\/p>\n<h1 id=\"why-are-getters-and-setters-unsafe-anemic-domain-model-vs-rich-domain-model\">Why are getters and setters unsafe? Anemic Domain Model vs Rich Domain Model<\/h1>\n\n<p>Take a look at the code below:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"><span class=\"kn\">import<\/span> <span class=\"nn\">java.util.UUID<\/span><span class=\"o\">;<\/span>  \n  \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">User<\/span> <span class=\"o\">{<\/span>  \n <span class=\"kd\">public<\/span> <span class=\"n\">UUID<\/span> <span class=\"n\">userId<\/span><span class=\"o\">;<\/span>  \n <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"n\">name<\/span><span class=\"o\">;<\/span>  \n <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"n\">email<\/span><span class=\"o\">;<\/span>  \n <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"n\">isBlocked<\/span><span class=\"o\">;<\/span>   \n <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"n\">isActive<\/span><span class=\"o\">;<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p>Do you see any potential risks? That\u2019s right! The class contains public fields that can be changed anywhere else in the application code.\nIt will be hard for us to control such an application, especially if it becomes a big project.<\/p>\n\n<p>All right. Let\u2019s make changes so that the fields are not public:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"><span class=\"kn\">import<\/span> <span class=\"nn\">java.util.UUID<\/span><span class=\"o\">;<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">User<\/span> <span class=\"o\">{<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"n\">UUID<\/span> <span class=\"n\">userId<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">name<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">email<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kt\">boolean<\/span> <span class=\"n\">isBlocked<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kt\">boolean<\/span> <span class=\"n\">isActive<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"n\">UUID<\/span> <span class=\"nf\">getUserId<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">userId<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setUserId<\/span><span class=\"o\">(<\/span><span class=\"n\">UUID<\/span> <span class=\"n\">userId<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">userId<\/span> <span class=\"o\">=<\/span> <span class=\"n\">userId<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getName<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">name<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setName<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">name<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">name<\/span> <span class=\"o\">=<\/span> <span class=\"n\">name<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getEmail<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">email<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setEmail<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">email<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">email<\/span> <span class=\"o\">=<\/span> <span class=\"n\">email<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">isBlocked<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">isBlocked<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setBlocked<\/span><span class=\"o\">(<\/span><span class=\"kt\">boolean<\/span> <span class=\"n\">blocked<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">isBlocked<\/span> <span class=\"o\">=<\/span> <span class=\"n\">blocked<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">isActive<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">isActive<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setActive<\/span><span class=\"o\">(<\/span><span class=\"kt\">boolean<\/span> <span class=\"n\">active<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">isActive<\/span> <span class=\"o\">=<\/span> <span class=\"n\">active<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<p>Does it look familiar? You have certainly come across such a code before.  In accordance with best practices - fields are private. But adding getters and setters does not improve the situation (because we have the same access to variables - as if they were public). So how to deal with this problem?\nThe answer is the <strong>Rich Domain Model<\/strong> you are about to read about.<\/p>\n\n<h2 id=\"why-is-public-unsafe\">Why is public unsafe?<\/h2>\n<p>Let\u2019s go back to the first example.<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">User<\/span> <span class=\"o\">{<\/span>  \n <span class=\"kd\">public<\/span> <span class=\"n\">UUID<\/span> <span class=\"n\">userId<\/span><span class=\"o\">;<\/span>  \n <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"n\">name<\/span><span class=\"o\">;<\/span>  \n <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"n\">email<\/span><span class=\"o\">;<\/span>  \n <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"n\">isBlocked<\/span><span class=\"o\">;<\/span>   \n <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"n\">isActive<\/span><span class=\"o\">;<\/span>\n<span class=\"o\">}<\/span>\n  <\/code><\/pre><\/figure>\n\n<p>The <code class=\"highlighter-rouge\">User<\/code> class above exposes its implementation, which in this case is very dangerous. Why? We can freely manipulate all the fields in this class. You can set any field without any consequences. Another problem can be changing the user id at any time in the code.<\/p>\n\n<h2 id=\"anemic-domain-model-in-java\">Anemic Domain Model in Java<\/h2>\n<p>A class with state exposed by getters and setters is an Anemic Model. An anemic domain model is often used as DTO (<em>Data Transfer Object<\/em>) object - a class with private fields and setters and getters. With an anemic approach, our models become just \u201ccontainers\u201d for the data, and all the logic for operating on that data is extracted to classes such as: <code class=\"highlighter-rouge\">**Service<\/code>, <code class=\"highlighter-rouge\">**Helper<\/code>, <code class=\"highlighter-rouge\">**Processor<\/code>, etc.<\/p>\n\n<p>What do you think the <code class=\"highlighter-rouge\">UserService<\/code> class might look like? Let\u2019s put together some requirements:<\/p>\n<ul>\n  <li>The user at creation is non-active. Only after email confirmation his account is activated,<\/li>\n  <li>By default, the user is not blocked. In case of breaking the rules, the user can be blocked by the administrator,<\/li>\n  <li>User email address must be from gmail.com domain,<\/li>\n  <li>User name must be shorter than 100 characters.<\/li>\n<\/ul>\n\n<p>Here we go! Following the most popular pattern, we create individual services:<\/p>\n\n<p><code class=\"highlighter-rouge\">UserActivationService<\/code> - service responsible for user activation. A user can only be activated once!<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"><span class=\"kn\">import<\/span> <span class=\"nn\">anemic.exceptions.UserAlreadyActivatedException<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">anemic.exceptions.UserNotFoundException<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">anemic.model.User<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">anemic.repository.UserRepository<\/span><span class=\"o\">;<\/span>\n\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.UUID<\/span><span class=\"o\">;<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">UserActivationService<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"n\">UserRepository<\/span> <span class=\"n\">userRepository<\/span><span class=\"o\">;<\/span>\n\n\n    <span class=\"kd\">public<\/span> <span class=\"nf\">UserActivationService<\/span><span class=\"o\">(<\/span><span class=\"n\">UserRepository<\/span> <span class=\"n\">userRepository<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">userRepository<\/span> <span class=\"o\">=<\/span> <span class=\"n\">userRepository<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">activateUser<\/span><span class=\"o\">(<\/span><span class=\"n\">UUID<\/span> <span class=\"n\">userId<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kt\">var<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">userRepository<\/span><span class=\"o\">.<\/span><span class=\"na\">getById<\/span><span class=\"o\">(<\/span><span class=\"n\">userId<\/span><span class=\"o\">).<\/span><span class=\"na\">orElseThrow<\/span><span class=\"o\">(<\/span><span class=\"nl\">UserNotFoundException:<\/span><span class=\"o\">:<\/span><span class=\"k\">new<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">validateIfUserIsActive<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">setActive<\/span><span class=\"o\">(<\/span><span class=\"kc\">true<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">userRepository<\/span><span class=\"o\">.<\/span><span class=\"na\">save<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">validateIfUserIsActive<\/span><span class=\"o\">(<\/span><span class=\"n\">User<\/span> <span class=\"n\">user<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">isActive<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">UserAlreadyActivatedException<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">);<\/span>\n        <span class=\"o\">}<\/span>\n    <span class=\"o\">}<\/span>\n\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p><code class=\"highlighter-rouge\">UserBlockerService<\/code> - service responsible for blocking users. As with activation - a user can only be blocked once. It is not possible to block a previously blocked user.<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"><span class=\"kn\">import<\/span> <span class=\"nn\">anemic.exceptions.UserAlreadyBlockedException<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">anemic.exceptions.UserNotFoundException<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">anemic.model.User<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">anemic.repository.UserRepository<\/span><span class=\"o\">;<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">UserBlockerService<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"n\">UserRepository<\/span> <span class=\"n\">userRepository<\/span><span class=\"o\">;<\/span>\n\n\n    <span class=\"kd\">public<\/span> <span class=\"nf\">UserBlockerService<\/span><span class=\"o\">(<\/span><span class=\"n\">UserRepository<\/span> <span class=\"n\">userRepository<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">userRepository<\/span> <span class=\"o\">=<\/span> <span class=\"n\">userRepository<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">block<\/span><span class=\"o\">(<\/span><span class=\"n\">User<\/span> <span class=\"n\">user<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">userRepository<\/span><span class=\"o\">.<\/span><span class=\"na\">getById<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">getUserId<\/span><span class=\"o\">()).<\/span><span class=\"na\">orElseThrow<\/span><span class=\"o\">(<\/span><span class=\"nl\">UserNotFoundException:<\/span><span class=\"o\">:<\/span><span class=\"k\">new<\/span><span class=\"o\">);<\/span>\n\n        <span class=\"n\">validateIfUserIsNotBlocked<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">setBlocked<\/span><span class=\"o\">(<\/span><span class=\"kc\">true<\/span><span class=\"o\">);<\/span>\n\n        <span class=\"n\">userRepository<\/span><span class=\"o\">.<\/span><span class=\"na\">save<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">validateIfUserIsNotBlocked<\/span><span class=\"o\">(<\/span><span class=\"n\">User<\/span> <span class=\"n\">user<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">isBlocked<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">UserAlreadyBlockedException<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">);<\/span>\n        <span class=\"o\">}<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p><code class=\"highlighter-rouge\">UserRegistrationService<\/code> - service responsible for user registration. According to the above requirements, we need to validate the username length and email address.<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"><span class=\"kn\">import<\/span> <span class=\"nn\">anemic.exceptions.UserAlreadyExistsException<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">anemic.exceptions.UserNameTooLongException<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">anemic.exceptions.WrongEmailDomainException<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">anemic.model.User<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">anemic.repository.UserRepository<\/span><span class=\"o\">;<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">UserRegistrationService<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"n\">String<\/span> <span class=\"n\">MAIL_DOMAIN<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"gmail.com\"<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"n\">UserRepository<\/span> <span class=\"n\">userRepository<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"nf\">UserRegistrationService<\/span><span class=\"o\">(<\/span><span class=\"n\">UserRepository<\/span> <span class=\"n\">userRepository<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">userRepository<\/span> <span class=\"o\">=<\/span> <span class=\"n\">userRepository<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">registerUser<\/span><span class=\"o\">(<\/span><span class=\"n\">User<\/span> <span class=\"n\">user<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">userRepository<\/span><span class=\"o\">.<\/span><span class=\"na\">getById<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">getUserId<\/span><span class=\"o\">()).<\/span><span class=\"na\">isPresent<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">UserAlreadyExistsException<\/span><span class=\"o\">();<\/span>\n        <span class=\"o\">}<\/span>\n\n        <span class=\"n\">validateUserEmailDomain<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">getEmail<\/span><span class=\"o\">());<\/span>\n        <span class=\"n\">validateUserName<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">getName<\/span><span class=\"o\">());<\/span>\n        <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">setActive<\/span><span class=\"o\">(<\/span><span class=\"kc\">false<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">setBlocked<\/span><span class=\"o\">(<\/span><span class=\"kc\">false<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">userRepository<\/span><span class=\"o\">.<\/span><span class=\"na\">save<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">validateUserEmailDomain<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">email<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(!<\/span><span class=\"n\">email<\/span><span class=\"o\">.<\/span><span class=\"na\">endsWith<\/span><span class=\"o\">(<\/span><span class=\"n\">MAIL_DOMAIN<\/span><span class=\"o\">))<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">WrongEmailDomainException<\/span><span class=\"o\">(<\/span><span class=\"n\">email<\/span><span class=\"o\">);<\/span>\n        <span class=\"o\">}<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">validateUserName<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">name<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">.<\/span><span class=\"na\">length<\/span><span class=\"o\">()<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">100<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">UserNameTooLongException<\/span><span class=\"o\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">);<\/span>\n        <span class=\"o\">}<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p>So we have a simple, anemic User domain model that contains no logic. We also have 3 services (<code class=\"highlighter-rouge\">UserActivationService<\/code>, <code class=\"highlighter-rouge\">UserBlockerService<\/code>, <code class=\"highlighter-rouge\">UserRegistrationService<\/code>) with all the logic of the user activation, blocking and registration.\nThis solution is very popular but has a few cons:<\/p>\n<ul>\n  <li>It simply violates the <strong>\u201cTell, Don\u2019t Ask\u201d<\/strong> principle which states that objects should tell the client what they can or cannot do rather than exposing properties and leaving it up to the client to determine if an object is in a particular state for a given action to take place.<\/li>\n  <li>We often have to repeat code across multiple places. In the case of our project - in UserBlockerService and UserActivationService we had to repeat checking if the user already exists.<\/li>\n  <li>The model is completely untestable because we cannot ensure that the model doesn\u2019t get invalid at some point. Theoretically, some other **Service could create a user with a disallowed domain in email and add it to the database - which would break one of our requirements.<\/li>\n<\/ul>\n\n<h2 id=\"rich-domain-model-in-java\">Rich Domain Model in Java<\/h2>\n\n<p>Now let\u2019s look at the same example in the rich domain approach. Let\u2019s start with the <strong>email<\/strong> field. We can move it to a separate class - <code class=\"highlighter-rouge\">Email<\/code>. This has the advantage that we can move the email domain validations to the Email object.\nThis will prevent us from creating an incorrect email address (with a non-allowed domain). We will also not be able to modify the email after it has been created.<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"><span class=\"kn\">import<\/span> <span class=\"nn\">static<\/span> <span class=\"n\">java<\/span><span class=\"o\">.<\/span><span class=\"na\">util<\/span><span class=\"o\">.<\/span><span class=\"na\">Objects<\/span><span class=\"o\">.<\/span><span class=\"na\">requireNonNull<\/span><span class=\"o\">;<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Email<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"n\">String<\/span> <span class=\"n\">MAIL_DOMAIN<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"gmail.com\"<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"n\">String<\/span> <span class=\"n\">email<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Email<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">email<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">requireNonNull<\/span><span class=\"o\">(<\/span><span class=\"n\">email<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"Email not provided\"<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">checkDomain<\/span><span class=\"o\">(<\/span><span class=\"n\">email<\/span><span class=\"o\">);<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">email<\/span> <span class=\"o\">=<\/span> <span class=\"n\">email<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"n\">Email<\/span> <span class=\"nf\">of<\/span><span class=\"o\">(<\/span><span class=\"kd\">final<\/span> <span class=\"n\">String<\/span> <span class=\"n\">email<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">Email<\/span><span class=\"o\">(<\/span><span class=\"n\">email<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">checkDomain<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">email<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(!<\/span><span class=\"n\">email<\/span><span class=\"o\">.<\/span><span class=\"na\">endsWith<\/span><span class=\"o\">(<\/span><span class=\"n\">MAIL_DOMAIN<\/span><span class=\"o\">))<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">WrongEmailDomainException<\/span><span class=\"o\">(<\/span><span class=\"n\">email<\/span><span class=\"o\">);<\/span>\n        <span class=\"o\">}<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p>Now do the same for the <strong>Username<\/strong> field:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"><span class=\"kn\">import<\/span> <span class=\"nn\">static<\/span> <span class=\"n\">java<\/span><span class=\"o\">.<\/span><span class=\"na\">util<\/span><span class=\"o\">.<\/span><span class=\"na\">Objects<\/span><span class=\"o\">.<\/span><span class=\"na\">requireNonNull<\/span><span class=\"o\">;<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Username<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">MAX_USERNAME_LENGTH<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">100<\/span><span class=\"o\">;<\/span>\n\n\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"n\">String<\/span> <span class=\"n\">username<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Username<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">username<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">requireNonNull<\/span><span class=\"o\">(<\/span><span class=\"n\">username<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"username not provided\"<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">checkUsernameLength<\/span><span class=\"o\">(<\/span><span class=\"n\">username<\/span><span class=\"o\">);<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">username<\/span> <span class=\"o\">=<\/span> <span class=\"n\">username<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"n\">Username<\/span> <span class=\"nf\">of<\/span><span class=\"o\">(<\/span><span class=\"kd\">final<\/span> <span class=\"n\">String<\/span> <span class=\"n\">userName<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">Username<\/span><span class=\"o\">(<\/span><span class=\"n\">userName<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">checkUsernameLength<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">username<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">username<\/span><span class=\"o\">.<\/span><span class=\"na\">length<\/span><span class=\"o\">()<\/span> <span class=\"o\">&gt;<\/span> <span class=\"n\">MAX_USERNAME_LENGTH<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">UserNameTooLongException<\/span><span class=\"o\">(<\/span><span class=\"n\">username<\/span><span class=\"o\">);<\/span>\n        <span class=\"o\">}<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p>As you can see the classes are similar. They have validation and a static method to create an object (Static Factory Method). It is not possible to create an Email object with an invalid domain and a Username object with a too long name (as required).\nBelow I will show you the code of a rich <code class=\"highlighter-rouge\">User<\/code> domain:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"><span class=\"kn\">import<\/span> <span class=\"nn\">static<\/span> <span class=\"n\">com<\/span><span class=\"o\">.<\/span><span class=\"na\">google<\/span><span class=\"o\">.<\/span><span class=\"na\">common<\/span><span class=\"o\">.<\/span><span class=\"na\">base<\/span><span class=\"o\">.<\/span><span class=\"na\">Preconditions<\/span><span class=\"o\">.<\/span><span class=\"na\">checkState<\/span><span class=\"o\">;<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">User<\/span> <span class=\"o\">{<\/span>\n\n\n    <span class=\"kd\">private<\/span> <span class=\"n\">UUID<\/span> <span class=\"n\">userId<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"n\">Username<\/span> <span class=\"n\">userName<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"n\">Email<\/span> <span class=\"n\">email<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kt\">boolean<\/span> <span class=\"n\">isBlocked<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kt\">boolean<\/span> <span class=\"n\">isActive<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"nf\">User<\/span><span class=\"o\">(<\/span><span class=\"n\">UUID<\/span> <span class=\"n\">userId<\/span><span class=\"o\">,<\/span> <span class=\"n\">Username<\/span> <span class=\"n\">userName<\/span><span class=\"o\">,<\/span> <span class=\"n\">Email<\/span> <span class=\"n\">email<\/span><span class=\"o\">,<\/span> <span class=\"kt\">boolean<\/span> <span class=\"n\">isBlocked<\/span><span class=\"o\">,<\/span> <span class=\"kt\">boolean<\/span> <span class=\"n\">isActive<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">userId<\/span> <span class=\"o\">=<\/span> <span class=\"n\">userId<\/span><span class=\"o\">;<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">userName<\/span> <span class=\"o\">=<\/span> <span class=\"n\">userName<\/span><span class=\"o\">;<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">email<\/span> <span class=\"o\">=<\/span> <span class=\"n\">email<\/span><span class=\"o\">;<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">isBlocked<\/span> <span class=\"o\">=<\/span> <span class=\"n\">isBlocked<\/span><span class=\"o\">;<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">isActive<\/span> <span class=\"o\">=<\/span> <span class=\"n\">isActive<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"n\">User<\/span> <span class=\"nf\">create<\/span><span class=\"o\">(<\/span><span class=\"n\">UUID<\/span> <span class=\"n\">userId<\/span><span class=\"o\">,<\/span> <span class=\"n\">Username<\/span> <span class=\"n\">userName<\/span><span class=\"o\">,<\/span> <span class=\"n\">Email<\/span> <span class=\"n\">email<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kt\">var<\/span> <span class=\"n\">isBlocked<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"o\">;<\/span>\n        <span class=\"kt\">var<\/span> <span class=\"n\">isActive<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"o\">;<\/span>\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">User<\/span><span class=\"o\">(<\/span><span class=\"n\">userId<\/span><span class=\"o\">,<\/span> <span class=\"n\">userName<\/span><span class=\"o\">,<\/span> <span class=\"n\">email<\/span><span class=\"o\">,<\/span> <span class=\"n\">isBlocked<\/span><span class=\"o\">,<\/span> <span class=\"n\">isActive<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">block<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">checkState<\/span><span class=\"o\">(<\/span><span class=\"n\">canBeBlocked<\/span><span class=\"o\">(),<\/span> <span class=\"s\">\"User can not be blocked\"<\/span><span class=\"o\">);<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">isBlocked<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">activate<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">checkState<\/span><span class=\"o\">(<\/span><span class=\"n\">canBeActivated<\/span><span class=\"o\">(),<\/span> <span class=\"s\">\"User is already activated\"<\/span><span class=\"o\">);<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">isActive<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">isBlocked<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">isBlocked<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">isActive<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">isActive<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"n\">UUID<\/span> <span class=\"nf\">getUserId<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">userId<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"n\">Username<\/span> <span class=\"nf\">getUserName<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">userName<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">canBeActivated<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"o\">!<\/span><span class=\"n\">isActive<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">canBeBlocked<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"o\">!<\/span><span class=\"n\">isBlocked<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p>In <code class=\"highlighter-rouge\">block()<\/code> and <code class=\"highlighter-rouge\">activate()<\/code> methods I used <code class=\"highlighter-rouge\">checkState()<\/code> from Guava library. If the first parameter is false - we throw <code class=\"highlighter-rouge\">IllegalStateException<\/code> with the content from the second parameter. Thanks to this we do not have to create additional \u201cif\u201d conditions.<\/p>\n\n<p>As you can see, compared to the anemic model our <strong>rich domain model does not provide the ability to modify fields externally<\/strong>. There are no setter methods. Variables have private access, they are set in a private constructor. There is a public static factory method that creates a new User object.\nAdditionally, we have some getter methods to be able to extract some information (such as username or userID).<\/p>\n\n<p>The most important thing about the above code is that the <strong>rich domain object provides business methods, exposing the behavior of the model and not just its state<\/strong> (as for standard models with getters\/setters).<\/p>\n\n<h3 id=\"the-main-advantage-of-the-rich-domain-model\">The main advantage of the Rich Domain Model<\/h3>\n<p>A rich domain does not allow us to create invalid objects. You are not able to create a user with a wrong email address or too long username - as in the anemic domain model. The state of an object is always consistent, and consistency is guaranteed by the object itself, not by conditions checked in code that operates on objects (such as <code class=\"highlighter-rouge\">**Services<\/code> classes).<\/p>\n\n<p>If we use an anemic model - we make our object public, allow for any modification of the model variables and all the responsibility (logic) is transferred to external classes of the Service type. This creates a lot of IF conditions and a big risk that before performing some operation we forget to check some condition that would exclude the possibility of performing that operation.<\/p>\n\n<p>If the logic is distributed among many services, and the model itself allows any modification of its internal data - we are very exposed not only to making a mistake, but also to overwriting the field value, unauthorized\/uncontrolled access to the field. By moving the same logic into the domain model itself - there is less chance of error.<\/p>\n\n<h3 id=\"example-tests-of-a-rich-domain-model\">Example tests of a rich domain model<\/h3>\n<p>Testing the rich model is straightforward. Below you can see what a sample test looks like:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"><span class=\"kn\">import<\/span> <span class=\"nn\">anemic.exceptions.UserNameTooLongException<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">anemic.exceptions.WrongEmailDomainException<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.commons.text.RandomStringGenerator<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.junit.jupiter.api.DisplayName<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.junit.jupiter.api.Test<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">rich.model.Email<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">rich.model.User<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">rich.model.Username<\/span><span class=\"o\">;<\/span>\n\n\n<span class=\"kn\">import<\/span> <span class=\"nn\">static<\/span> <span class=\"n\">java<\/span><span class=\"o\">.<\/span><span class=\"na\">util<\/span><span class=\"o\">.<\/span><span class=\"na\">UUID<\/span><span class=\"o\">.<\/span><span class=\"na\">randomUUID<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">static<\/span> <span class=\"n\">org<\/span><span class=\"o\">.<\/span><span class=\"na\">assertj<\/span><span class=\"o\">.<\/span><span class=\"na\">core<\/span><span class=\"o\">.<\/span><span class=\"na\">api<\/span><span class=\"o\">.<\/span><span class=\"na\">Assertions<\/span><span class=\"o\">.*;<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">UserTest<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"nd\">@Test<\/span>\n    <span class=\"nd\">@DisplayName<\/span><span class=\"o\">(<\/span><span class=\"s\">\"The user after creation should not be active\"<\/span><span class=\"o\">)<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">shouldNotBeActiveAfterCreation<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kt\">var<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">User<\/span><span class=\"o\">.<\/span><span class=\"na\">create<\/span><span class=\"o\">(<\/span><span class=\"n\">randomUUID<\/span><span class=\"o\">(),<\/span> <span class=\"n\">Username<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"s\">\"John123\"<\/span><span class=\"o\">),<\/span> <span class=\"n\">Email<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"s\">\"john@gmail.com\"<\/span><span class=\"o\">));<\/span>\n        <span class=\"n\">assertThat<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">isActive<\/span><span class=\"o\">()).<\/span><span class=\"na\">isFalse<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"nd\">@Test<\/span>\n    <span class=\"nd\">@DisplayName<\/span><span class=\"o\">(<\/span><span class=\"s\">\"The user can be blocked\"<\/span><span class=\"o\">)<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">canBeBlocked<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kt\">var<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">User<\/span><span class=\"o\">.<\/span><span class=\"na\">create<\/span><span class=\"o\">(<\/span><span class=\"n\">randomUUID<\/span><span class=\"o\">(),<\/span> <span class=\"n\">Username<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"s\">\"John123\"<\/span><span class=\"o\">),<\/span> <span class=\"n\">Email<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"s\">\"john@gmail.com\"<\/span><span class=\"o\">));<\/span>\n        <span class=\"n\">assertThat<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">isBlocked<\/span><span class=\"o\">()).<\/span><span class=\"na\">isFalse<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">block<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">assertThat<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">isBlocked<\/span><span class=\"o\">()).<\/span><span class=\"na\">isTrue<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"nd\">@Test<\/span>\n    <span class=\"nd\">@DisplayName<\/span><span class=\"o\">(<\/span><span class=\"s\">\"A blocked user cannot be blocked again\"<\/span><span class=\"o\">)<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">canBeBlockedOnlyOnce<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kt\">var<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">User<\/span><span class=\"o\">.<\/span><span class=\"na\">create<\/span><span class=\"o\">(<\/span><span class=\"n\">randomUUID<\/span><span class=\"o\">(),<\/span> <span class=\"n\">Username<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"s\">\"John123\"<\/span><span class=\"o\">),<\/span> <span class=\"n\">Email<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"s\">\"john@gmail.com\"<\/span><span class=\"o\">));<\/span>\n        <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">block<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">assertThatCode<\/span><span class=\"o\">(<\/span><span class=\"nl\">user:<\/span><span class=\"o\">:<\/span><span class=\"n\">block<\/span><span class=\"o\">).<\/span><span class=\"na\">isInstanceOf<\/span><span class=\"o\">(<\/span><span class=\"n\">IllegalStateException<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"nd\">@Test<\/span>\n    <span class=\"nd\">@DisplayName<\/span><span class=\"o\">(<\/span><span class=\"s\">\"The user can be activated\"<\/span><span class=\"o\">)<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">canBeActivated<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kt\">var<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">User<\/span><span class=\"o\">.<\/span><span class=\"na\">create<\/span><span class=\"o\">(<\/span><span class=\"n\">randomUUID<\/span><span class=\"o\">(),<\/span> <span class=\"n\">Username<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"s\">\"John123\"<\/span><span class=\"o\">),<\/span> <span class=\"n\">Email<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"s\">\"john@gmail.com\"<\/span><span class=\"o\">));<\/span>\n        <span class=\"n\">assertThat<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">isActive<\/span><span class=\"o\">()).<\/span><span class=\"na\">isFalse<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">activate<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">assertThat<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">isActive<\/span><span class=\"o\">()).<\/span><span class=\"na\">isTrue<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"nd\">@Test<\/span>\n    <span class=\"nd\">@DisplayName<\/span><span class=\"o\">(<\/span><span class=\"s\">\"The user cannot be activated again\"<\/span><span class=\"o\">)<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">canBeActivatedOnlyOnce<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kt\">var<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">User<\/span><span class=\"o\">.<\/span><span class=\"na\">create<\/span><span class=\"o\">(<\/span><span class=\"n\">randomUUID<\/span><span class=\"o\">(),<\/span> <span class=\"n\">Username<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"s\">\"John123\"<\/span><span class=\"o\">),<\/span> <span class=\"n\">Email<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"s\">\"john@gmail.com\"<\/span><span class=\"o\">));<\/span>\n        <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">activate<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">assertThatCode<\/span><span class=\"o\">(<\/span><span class=\"nl\">user:<\/span><span class=\"o\">:<\/span><span class=\"n\">activate<\/span><span class=\"o\">).<\/span><span class=\"na\">isInstanceOf<\/span><span class=\"o\">(<\/span><span class=\"n\">IllegalStateException<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"nd\">@Test<\/span>\n    <span class=\"nd\">@DisplayName<\/span><span class=\"o\">(<\/span><span class=\"s\">\"The email address must match the domain\"<\/span><span class=\"o\">)<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">emailMustMatchTheDomain<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">assertThatCode<\/span><span class=\"o\">(()<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">User<\/span><span class=\"o\">.<\/span><span class=\"na\">create<\/span><span class=\"o\">(<\/span><span class=\"n\">randomUUID<\/span><span class=\"o\">(),<\/span> <span class=\"n\">Username<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"s\">\"John123\"<\/span><span class=\"o\">),<\/span> \n        <span class=\"n\">Email<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"s\">\"john@wrongdomain.com\"<\/span><span class=\"o\">))).<\/span><span class=\"na\">isInstanceOf<\/span><span class=\"o\">(<\/span><span class=\"n\">WrongEmailDomainException<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"nd\">@Test<\/span>\n    <span class=\"nd\">@DisplayName<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Username must have permission length\"<\/span><span class=\"o\">)<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">usernameMustHaveAllowedLength<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">String<\/span> <span class=\"n\">longUsername<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">RandomStringGenerator<\/span><span class=\"o\">.<\/span><span class=\"na\">Builder<\/span><span class=\"o\">().<\/span><span class=\"na\">build<\/span><span class=\"o\">().<\/span><span class=\"na\">generate<\/span><span class=\"o\">(<\/span><span class=\"mi\">101<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">assertThatCode<\/span><span class=\"o\">(()<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">User<\/span><span class=\"o\">.<\/span><span class=\"na\">create<\/span><span class=\"o\">(<\/span><span class=\"n\">randomUUID<\/span><span class=\"o\">(),<\/span> <span class=\"n\">Username<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"n\">longUsername<\/span><span class=\"o\">),<\/span> \n        <span class=\"n\">Email<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"s\">\"john@wrongdomain.com\"<\/span><span class=\"o\">))).<\/span><span class=\"na\">isInstanceOf<\/span><span class=\"o\">(<\/span><span class=\"n\">UserNameTooLongException<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<h2 id=\"when-to-use-getters-and-setters-in-java-objects\">When to use getters and setters in Java objects?<\/h2>\n<p>You can safely use getters\/setters in <strong>DTO (Data Transfer Object)<\/strong> objects. DTO models are used as entities when communicating with databases or as data transfer objects between REST services. Often setters are even necessary because libraries of various frameworks use them. But remember that it is best to map such objects to domain objects (which will use a rich model).<\/p>\n\n<h1 id=\"special-offer-from-codegym\">Special offer from CodeGym<\/h1>\n<p><a href=\"https:\/\/codegym.cc\/\">CodeGym<\/a> is an interactive educational platform where people can learn Java programming from scratch. I used this platform early in my career and it was great to solidify my knowledge of Java. It takes a very practical approach to learning programming. Also, it does not neglect the theory part which is also very important. I would recommend it to anyone who wants to learn java or prepare for a job interview or new job. Additionally, CodeGym creates a community where you can get help or meet interesting people.<\/p>\n\n<blockquote>\n  <p>30% Off With <a href=\"https:\/\/codegym.cc\/\">CodeGym<\/a> subscription by sending the coupon: <strong>devdiaries30<\/strong> to support@codegym.cc<\/p>\n<\/blockquote>\n\n<p>If you are interested in full access - CodeGym has provided my blog readers with a <strong>30% off discount coupon<\/strong>. All you need to do is to send the coupon: <strong>devdiaries30<\/strong> to support@codegym.cc. If you have any questions, please do not hesitate to contact me!<\/p>","author":{"name":"Michal Fabjanski"},"summary":"When we write code, we try to hide as many details as possible - using appropriate access modifiers. Most often we use getters and setters methods to set the appropriate state of an object. Is this a good practice? In this article you will learn what is Anemic Domain Model and Rich Domain Model and which way of creating models is the best. What\u2019s more, you\u2019ll find a special opportunity from CodeGym at the end of this post. I invite you to read :) Why are getters and setters unsafe? Anemic Domain Model vs Rich Domain Model"},{"title":"Kill the virus with a strategy pattern! Java Strategy Pattern with practical examples","link":{"@attributes":{"href":"https:\/\/www.devdiaries.net\/blog\/Java-Strategy-Design-Pattern-By-Examples\/","rel":"alternate","type":"text\/html","title":"Kill the virus with a strategy pattern! Java Strategy Pattern with practical examples"}},"published":"2020-03-13T00:00:00+00:00","updated":"2020-03-13T00:00:00+00:00","id":"https:\/\/www.devdiaries.net\/blog\/Java-Strategy-Design-Pattern-By-Examples","content":"<h1 id=\"strategy-design-pattern-in-java\">Strategy Design Pattern in Java<\/h1>\n<p>Todat I\u2019ll take you to my lab. I\u2019ll show you <strong>how to make your code cleaner<\/strong>. Any project can be created by multiple programmers at the same time, and each of them makes more bricks - being forced to understand other people\u2019s bricks.<br \/>\nBecause you are in my lab, we will start working on real examples - starting with eccomerce, ending with virus treatment!<\/p>\n\n<h2 id=\"strategy-pattern-introduction\">Strategy Pattern introduction<\/h2>\n<p>The strategy pattern next to the factory pattern is one of the most frequently used design patterns. It is easy to understand and to implement. It is one of the behavioral patterns, i.e. those that describe certain behavior.<br \/>\nStrategy defines a <strong>family of interchangeable algorithms<\/strong> (in the form of classes) that are used to <strong>solve the same problem in several different ways.<\/strong><\/p>\n<h2 id=\"implementation\">Implementation<\/h2>\n<p><img src=\"\/images\/strategy-pattern\/strategy-diagram.png\" alt=\"strateg-pattern-diagram\" \/><br \/>\nThe <code class=\"highlighter-rouge\">Context<\/code> class contains a reference to the <code class=\"highlighter-rouge\">StrategyInterface<\/code> strategy object. The strategy object can be injected by the constructor or setter. The <code class=\"highlighter-rouge\">Context<\/code> class method uses the strategy object to finalize the operation.  Strategy classes Strategy1, Strategy2, etc. implement <code class=\"highlighter-rouge\">StrategyInterface<\/code> interface methods. Each of these implementations of <code class=\"highlighter-rouge\">StrategyInterface<\/code> solves a similar problem in a slightly different way. \nThe above diagram can be implemented in the following way:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Context<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"n\">Strategy<\/span> <span class=\"n\">strategy<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Context<\/span><span class=\"o\">(<\/span><span class=\"n\">Strategy<\/span> <span class=\"n\">strategy<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">strategy<\/span> <span class=\"o\">=<\/span> <span class=\"n\">strategy<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setStrategy<\/span><span class=\"o\">(<\/span><span class=\"n\">Strategy<\/span> <span class=\"n\">strategy<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">strategy<\/span> <span class=\"o\">=<\/span> <span class=\"n\">strategy<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">run<\/span><span class=\"o\">(<\/span><span class=\"n\">Object<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">strategy<\/span><span class=\"o\">.<\/span><span class=\"na\">action<\/span><span class=\"o\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>  \n\n<span class=\"c1\">\/\/ -----------------------------------------------------------  <\/span>\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Strategy1<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">Strategy<\/span> <span class=\"o\">{<\/span>  \n  \n <span class=\"nd\">@Override<\/span> \n <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">action<\/span><span class=\"o\">(<\/span><span class=\"n\">Object<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span> <span class=\"c1\">\/\/do action specific for Strategy1 <\/span>\n <span class=\"o\">}}<\/span>  \n  \n<span class=\"c1\">\/\/ -----------------------------------------------------------   <\/span>\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Strategy2<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">Strategy<\/span> <span class=\"o\">{<\/span>  \n  \n <span class=\"nd\">@Override<\/span> \n <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">action<\/span><span class=\"o\">(<\/span><span class=\"n\">Object<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span> <span class=\"c1\">\/\/do action specific for Strategy2 <\/span>\n <span class=\"o\">}}<\/span>  \n<span class=\"c1\">\/\/ -----------------------------------------------------------   <\/span>\n<span class=\"kd\">interface<\/span> <span class=\"nc\">Strategy<\/span> <span class=\"o\">{<\/span>  \n  \n <span class=\"kt\">void<\/span> <span class=\"nf\">action<\/span><span class=\"o\">(<\/span><span class=\"n\">Object<\/span> <span class=\"n\">args<\/span><span class=\"o\">);}<\/span>  <\/code><\/pre><\/figure>\n\n<p>Before calling the target method, <strong>the client selects the injected strategy<\/strong> depending on the condition:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">  \n<span class=\"n\">Context<\/span> <span class=\"n\">context<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Context<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Strategy1<\/span><span class=\"o\">());<\/span>  \n<span class=\"n\">String<\/span> <span class=\"n\">arg<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"args passed to strategy 1\"<\/span><span class=\"o\">;<\/span>  \n<span class=\"n\">context<\/span><span class=\"o\">.<\/span><span class=\"na\">run<\/span><span class=\"o\">(<\/span><span class=\"n\">arg<\/span><span class=\"o\">);<\/span>  \n  \n<span class=\"c1\">\/\/new conditions <\/span>\n<span class=\"n\">context<\/span><span class=\"o\">.<\/span><span class=\"na\">setStrategy<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Strategy2<\/span><span class=\"o\">());<\/span>  \n<span class=\"n\">arg<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"args for strategy 2\"<\/span><span class=\"o\">;<\/span>  \n<span class=\"n\">context<\/span><span class=\"o\">.<\/span><span class=\"na\">run<\/span><span class=\"o\">(<\/span><span class=\"n\">arg<\/span><span class=\"o\">);<\/span>  <\/code><\/pre><\/figure>\n\n<h2 id=\"strategy-pattern-real-life-examples\">Strategy Pattern Real Life Examples<\/h2>\n\n<p>Let\u2019s get to the practical part. I will show you some examples where Strategy pattern is a perfect solution.<\/p>\n\n<h3 id=\"e-commerce---international-shipping-system-with-the-strategy-pattern\">E-commerce - international shipping system with the strategy pattern<\/h3>\n<p>Imagine that we own an online shop with many different products. At the beginning, we send products only to the USA, but we want to enter a new market - Europe. We also plan to enter the Australian and African markets. <br \/>\nBy following the <a href=\"https:\/\/www.devdiaries.net\/blog\/10-Object-oriented-design-principles-everythone-should-know\/#openclosed-principle\" title=\"Open\/Closed Principle\">Open\/Closed Principle<\/a> we do not want to add more IFs to our class. In this case, the ideal choice is the strategy pattern!<\/p>\n\n<p>Let\u2019s start from the <code class=\"highlighter-rouge\">Shopping.java<\/code> interface - responsible for price calculation and currency information.<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">Shopping<\/span> <span class=\"o\">{<\/span>  \n  \n <span class=\"kt\">double<\/span> <span class=\"nf\">calculatePrice<\/span><span class=\"o\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Product<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">products<\/span><span class=\"o\">);<\/span> \n <span class=\"n\">Currency<\/span> <span class=\"nf\">getCurrency<\/span><span class=\"o\">();<\/span>\n <span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<p>Now it\u2019s time for some boring model classes:<br \/>\n<code class=\"highlighter-rouge\">Products.java<\/code> with our products:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Product<\/span> <span class=\"o\">{<\/span>  \n  \n <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">id<\/span><span class=\"o\">;<\/span> \n <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">name<\/span><span class=\"o\">;<\/span> \n <span class=\"kd\">private<\/span> <span class=\"kt\">double<\/span> <span class=\"n\">price<\/span><span class=\"o\">;<\/span> \n <span class=\"kd\">private<\/span> <span class=\"n\">Size<\/span> <span class=\"n\">size<\/span><span class=\"o\">;<\/span>  \n \n <span class=\"kd\">public<\/span> <span class=\"nf\">Product<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">id<\/span><span class=\"o\">,<\/span> <span class=\"n\">String<\/span> <span class=\"n\">name<\/span><span class=\"o\">,<\/span> <span class=\"kt\">double<\/span> <span class=\"n\">price<\/span><span class=\"o\">,<\/span> <span class=\"n\">Size<\/span> <span class=\"n\">size<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span> \n <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">id<\/span> <span class=\"o\">=<\/span> <span class=\"n\">id<\/span><span class=\"o\">;<\/span> \n <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">name<\/span> <span class=\"o\">=<\/span> <span class=\"n\">name<\/span><span class=\"o\">;<\/span> \n <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">price<\/span> <span class=\"o\">=<\/span> <span class=\"n\">price<\/span><span class=\"o\">;<\/span> \n <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">size<\/span> <span class=\"o\">=<\/span> <span class=\"n\">size<\/span><span class=\"o\">;<\/span> \n <span class=\"o\">}<\/span> <span class=\"c1\">\/\/ getters and setters<\/span>\n <\/code><\/pre><\/figure>\n\n<p><code class=\"highlighter-rouge\">Cart.java<\/code> class:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Cart<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"n\">Shopping<\/span> <span class=\"n\">shopping<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Product<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">products<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Cart<\/span><span class=\"o\">(<\/span><span class=\"n\">Shopping<\/span> <span class=\"n\">shopping<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">shopping<\/span> <span class=\"o\">=<\/span> <span class=\"n\">shopping<\/span><span class=\"o\">;<\/span>\n        <span class=\"n\">products<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">double<\/span> <span class=\"nf\">getTotalPrice<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">shopping<\/span><span class=\"o\">.<\/span><span class=\"na\">calculatePrice<\/span><span class=\"o\">(<\/span><span class=\"n\">products<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">addProduct<\/span><span class=\"o\">(<\/span><span class=\"n\">Product<\/span> <span class=\"n\">product<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">products<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"n\">product<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p><code class=\"highlighter-rouge\">Size.java<\/code> - The price of the products will depend on the size:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">enum<\/span> <span class=\"n\">Size<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"n\">S<\/span><span class=\"o\">(<\/span><span class=\"mi\">1<\/span><span class=\"o\">),<\/span>\n    <span class=\"n\">L<\/span><span class=\"o\">(<\/span><span class=\"mi\">2<\/span><span class=\"o\">),<\/span>\n    <span class=\"n\">XL<\/span><span class=\"o\">(<\/span><span class=\"mi\">3<\/span><span class=\"o\">);<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">size<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"n\">Size<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">size<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">size<\/span> <span class=\"o\">=<\/span> <span class=\"n\">size<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"nd\">@Override<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">toString<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">switch<\/span><span class=\"o\">(<\/span><span class=\"n\">size<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">case<\/span> <span class=\"mi\">1<\/span><span class=\"o\">:<\/span>\n                <span class=\"k\">return<\/span> <span class=\"s\">\"S\"<\/span><span class=\"o\">;<\/span>\n            <span class=\"k\">case<\/span> <span class=\"mi\">2<\/span><span class=\"o\">:<\/span>\n                <span class=\"k\">return<\/span> <span class=\"s\">\"L\"<\/span><span class=\"o\">;<\/span>\n            <span class=\"k\">case<\/span> <span class=\"mi\">3<\/span><span class=\"o\">:<\/span>\n                <span class=\"k\">return<\/span> <span class=\"s\">\"XL\"<\/span><span class=\"o\">;<\/span>\n            <span class=\"k\">default<\/span><span class=\"o\">:<\/span>\n                <span class=\"k\">return<\/span> <span class=\"s\">\"CUSTOM\"<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p>Let\u2019s get back to the concrete!  It\u2019s time to implement our strategies. Depending on the country of shipping, the relevant customs duty is charged and the shipping cost of <code class=\"highlighter-rouge\">EuropeShopping<\/code>, <code class=\"highlighter-rouge\">AmericaShopping<\/code> increases. Large products (XL-size) have an additional charge.<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">AmericaShopping<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">Shopping<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"kt\">double<\/span> <span class=\"n\">USD_TAX<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">0.75<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"kt\">double<\/span> <span class=\"n\">DUTY_TAX<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">1.0<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kt\">double<\/span> <span class=\"n\">DELIVERY_COST<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">15<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"nd\">@Override<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">double<\/span> <span class=\"nf\">calculatePrice<\/span><span class=\"o\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Product<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">products<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kt\">double<\/span> <span class=\"n\">totalPrice<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"o\">;<\/span>\n        <span class=\"k\">for<\/span><span class=\"o\">(<\/span><span class=\"n\">Product<\/span> <span class=\"n\">product<\/span> <span class=\"o\">:<\/span> <span class=\"n\">products<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">if<\/span><span class=\"o\">(<\/span><span class=\"n\">product<\/span><span class=\"o\">.<\/span><span class=\"na\">getSize<\/span><span class=\"o\">()<\/span> <span class=\"o\">==<\/span> <span class=\"n\">Size<\/span><span class=\"o\">.<\/span><span class=\"na\">XL<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n                <span class=\"n\">totalPrice<\/span> <span class=\"o\">+=<\/span> <span class=\"n\">product<\/span><span class=\"o\">.<\/span><span class=\"na\">getPrice<\/span><span class=\"o\">()<\/span> <span class=\"o\">*<\/span> <span class=\"n\">DUTY_TAX<\/span><span class=\"o\">;<\/span>\n                <span class=\"n\">DELIVERY_COST<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">10<\/span><span class=\"o\">;<\/span>\n            <span class=\"o\">}<\/span>\n            <span class=\"k\">else<\/span> <span class=\"o\">{<\/span>\n                <span class=\"n\">totalPrice<\/span> <span class=\"o\">+=<\/span> <span class=\"n\">product<\/span><span class=\"o\">.<\/span><span class=\"na\">getPrice<\/span><span class=\"o\">()<\/span> <span class=\"o\">*<\/span> <span class=\"n\">DUTY_TAX<\/span><span class=\"o\">;<\/span>\n                <span class=\"n\">DELIVERY_COST<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">5<\/span><span class=\"o\">;<\/span>\n            <span class=\"o\">}<\/span>\n        <span class=\"o\">}<\/span>\n        <span class=\"k\">return<\/span> <span class=\"o\">(<\/span><span class=\"n\">totalPrice<\/span> <span class=\"o\">+<\/span> <span class=\"n\">DELIVERY_COST<\/span><span class=\"o\">)<\/span> <span class=\"o\">*<\/span> <span class=\"n\">USD_TAX<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"nd\">@Override<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"n\">Currency<\/span> <span class=\"nf\">getCurrency<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">Currency<\/span><span class=\"o\">.<\/span><span class=\"na\">USD<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n  \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">EuropeShopping<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">Shopping<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"kt\">double<\/span> <span class=\"n\">DUTY_TAX<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">1.5<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kt\">double<\/span> <span class=\"n\">DELIVERY_COST<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">11<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"nd\">@Override<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">double<\/span> <span class=\"nf\">calculatePrice<\/span><span class=\"o\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Product<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">products<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kt\">double<\/span> <span class=\"n\">totalPrice<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"o\">;<\/span>\n        <span class=\"k\">for<\/span><span class=\"o\">(<\/span><span class=\"n\">Product<\/span> <span class=\"n\">product<\/span> <span class=\"o\">:<\/span> <span class=\"n\">products<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">totalPrice<\/span> <span class=\"o\">+=<\/span> <span class=\"n\">product<\/span><span class=\"o\">.<\/span><span class=\"na\">getPrice<\/span><span class=\"o\">()<\/span> <span class=\"o\">*<\/span> <span class=\"n\">DUTY_TAX<\/span><span class=\"o\">;<\/span>\n            <span class=\"k\">if<\/span><span class=\"o\">(<\/span><span class=\"n\">product<\/span><span class=\"o\">.<\/span><span class=\"na\">getSize<\/span><span class=\"o\">()<\/span> <span class=\"o\">==<\/span> <span class=\"n\">Size<\/span><span class=\"o\">.<\/span><span class=\"na\">XL<\/span><span class=\"o\">)<\/span>\n                <span class=\"n\">DELIVERY_COST<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">10<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">totalPrice<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"nd\">@Override<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"n\">Currency<\/span> <span class=\"nf\">getCurrency<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">Currency<\/span><span class=\"o\">.<\/span><span class=\"na\">EUR<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p>The above listing shows the calculation of the final price depending on the location of the shipment and product size. <br \/>\nExample of use:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Main<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">Shopping<\/span> <span class=\"n\">shopping<\/span><span class=\"o\">;<\/span>\n<span class=\"c1\">\/\/       Define a region for the USA.<\/span>\n<span class=\"c1\">\/\/       This is for demo purposes only - it should be injected depending on user address.<\/span>\n        <span class=\"n\">Region<\/span> <span class=\"n\">region<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Region<\/span><span class=\"o\">.<\/span><span class=\"na\">EUR<\/span><span class=\"o\">;<\/span>\n\n<span class=\"c1\">\/\/      Choice of strategy according to user region<\/span>\n        <span class=\"k\">if<\/span><span class=\"o\">(<\/span><span class=\"n\">region<\/span> <span class=\"o\">==<\/span> <span class=\"n\">Region<\/span><span class=\"o\">.<\/span><span class=\"na\">USA<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">shopping<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">AmericaShopping<\/span><span class=\"o\">();<\/span>\n        <span class=\"o\">}<\/span>\n        <span class=\"k\">else<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">shopping<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">EuropeShopping<\/span><span class=\"o\">();<\/span>\n        <span class=\"o\">}<\/span>\n\n        <span class=\"n\">Cart<\/span> <span class=\"n\">cart<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Cart<\/span><span class=\"o\">(<\/span><span class=\"n\">shopping<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">cart<\/span><span class=\"o\">.<\/span><span class=\"na\">addProduct<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Product<\/span><span class=\"o\">(<\/span><span class=\"mi\">0<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"Dell\"<\/span><span class=\"o\">,<\/span> <span class=\"mi\">125<\/span><span class=\"o\">,<\/span> <span class=\"n\">Size<\/span><span class=\"o\">.<\/span><span class=\"na\">L<\/span><span class=\"o\">));<\/span>\n        <span class=\"n\">cart<\/span><span class=\"o\">.<\/span><span class=\"na\">addProduct<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Product<\/span><span class=\"o\">(<\/span><span class=\"mi\">1<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"Iphone\"<\/span><span class=\"o\">,<\/span> <span class=\"mi\">1235<\/span><span class=\"o\">,<\/span> <span class=\"n\">Size<\/span><span class=\"o\">.<\/span><span class=\"na\">S<\/span><span class=\"o\">));<\/span>\n        <span class=\"n\">cart<\/span><span class=\"o\">.<\/span><span class=\"na\">addProduct<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Product<\/span><span class=\"o\">(<\/span><span class=\"mi\">2<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"TV\"<\/span><span class=\"o\">,<\/span> <span class=\"mi\">535<\/span><span class=\"o\">,<\/span> <span class=\"n\">Size<\/span><span class=\"o\">.<\/span><span class=\"na\">XL<\/span><span class=\"o\">));<\/span>\n\n        <span class=\"kt\">double<\/span> <span class=\"n\">totalPrice<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cart<\/span><span class=\"o\">.<\/span><span class=\"na\">getTotalPrice<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Total price : \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">totalPrice<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">shopping<\/span><span class=\"o\">.<\/span><span class=\"na\">getCurrency<\/span><span class=\"o\">());<\/span>\n<span class=\"c1\">\/\/        for region = REGION.USA the result is: Total price : 1447.5 USD<\/span>\n<span class=\"c1\">\/\/        for region = REGION.EUR the result is: Total price : 2842.5 EUR<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<h3 id=\"number-converter-with-the-strategy-pattern\">Number converter with the strategy pattern<\/h3>\n\n<p>Imagine that you want to create a system to convert numbers into different <a href=\"rapidtables.com\/math\/number\/Numeral_system.html\" title=\"Numeral Systems\">Numeral Systems<\/a> .<br \/>\nAs in the previous example, we will start with the interface:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">ConvertingStrategy<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"n\">String<\/span> <span class=\"nf\">convert<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">number<\/span><span class=\"o\">);<\/span>  \n<span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<p>Time for implementation. We will add support to convert number to octal, binary and hex system:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">BinaryConverter<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">ConvertingStrategy<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">convert<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">number<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"k\">return<\/span> <span class=\"n\">Integer<\/span><span class=\"o\">.<\/span><span class=\"na\">toBinaryString<\/span><span class=\"o\">(<\/span><span class=\"n\">number<\/span><span class=\"o\">);<\/span>  \n    <span class=\"o\">}<\/span>  \n<span class=\"o\">}<\/span>  \n  \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">HexaConverter<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">ConvertingStrategy<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">convert<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">number<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"k\">return<\/span> <span class=\"n\">Integer<\/span><span class=\"o\">.<\/span><span class=\"na\">toHexString<\/span><span class=\"o\">(<\/span><span class=\"n\">number<\/span><span class=\"o\">);<\/span>  \n    <span class=\"o\">}<\/span>  \n<span class=\"o\">}<\/span>  \n  \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">OctaConverter<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">ConvertingStrategy<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">convert<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">number<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"k\">return<\/span> <span class=\"n\">Integer<\/span><span class=\"o\">.<\/span><span class=\"na\">toOctalString<\/span><span class=\"o\">(<\/span><span class=\"n\">number<\/span><span class=\"o\">);<\/span>  \n    <span class=\"o\">}<\/span>  \n<span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<p>According to the diagram at the beginning of the post - we will create a class <code class=\"highlighter-rouge\">Context<\/code> that will use our strategies:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Context<\/span> <span class=\"o\">{<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"n\">ConvertingStrategy<\/span> <span class=\"n\">strategy<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Context<\/span><span class=\"o\">(<\/span><span class=\"n\">ConvertingStrategy<\/span> <span class=\"n\">strategy<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">strategy<\/span> <span class=\"o\">=<\/span> <span class=\"n\">strategy<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">convert<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">number<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">strategy<\/span><span class=\"o\">.<\/span><span class=\"na\">convert<\/span><span class=\"o\">(<\/span><span class=\"n\">number<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p>An example of how to use a strategy to convert:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Main<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"n\">Context<\/span> <span class=\"n\">ctx<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Context<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">HexaConverter<\/span><span class=\"o\">());<\/span>  \n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">convert<\/span><span class=\"o\">(<\/span><span class=\"mi\">1000<\/span><span class=\"o\">));<\/span>  \n<span class=\"c1\">\/\/      Result: 3e8  <\/span>\n<span class=\"c1\">\/\/      If you change HexaConverter to BinaryConverter, the result will be: 1111101000  <\/span>\n    <span class=\"o\">}<\/span>  \n<span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<h3 id=\"cure-the-coronavirus-with-strategy-pattern\">Cure the Coronavirus with strategy pattern!<\/h3>\n<p>It\u2019s time for something popular :) We will create a strategy to treat viruses. It may seem to you that this is not a very practical use of Strategy Pattern, but imagine a similar situation in any game.<\/p>\n\n<p>In our case, this could be part of a game taking place in a Hospital For Infectious Diseases!<br \/>\n<strong>Very often the strategy is used in games to handle movement.<\/strong> We want a player to either walk or run when he moves, but maybe in the future, he should also be able to swim, fly, teleport, burrow underground, etc.<br \/>\nLet\u2019s return to the hospital game. Just like before, we start with the interface:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">VaccinationStrategy<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"n\">String<\/span> <span class=\"nf\">vaccineInjection<\/span><span class=\"o\">();<\/span>  \n<span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<p>And some implementations:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Covid19Treatment<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">VaccinationStrategy<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">vaccineInjection<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"k\">return<\/span> <span class=\"s\">\"The patient have been cured of infection with Coronavirus\"<\/span><span class=\"o\">;<\/span>  \n    <span class=\"o\">}<\/span>  \n<span class=\"o\">}<\/span>  \n  \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">EbovTreatment<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">VaccinationStrategy<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">vaccineInjection<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"k\">return<\/span> <span class=\"s\">\"The patient have been cured of infection with Ebov\"<\/span><span class=\"o\">;<\/span>  \n    <span class=\"o\">}<\/span>  \n<span class=\"o\">}<\/span>  \n  \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">SarsTreatment<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">VaccinationStrategy<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">vaccineInjection<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"k\">return<\/span> <span class=\"s\">\"The patient have been cured of infection with SARS\"<\/span><span class=\"o\">;<\/span>  \n    <span class=\"o\">}<\/span>  \n<span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<p>Now let\u2019s create a class that will work as the <code class=\"highlighter-rouge\">Context<\/code> from the previous point. Let\u2019s name it <code class=\"highlighter-rouge\">Treatment.java<\/code>:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Treatment<\/span> <span class=\"o\">{<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"n\">VaccinationStrategy<\/span> <span class=\"n\">vaccinationStrategy<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">patientName<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Treatment<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">patientName<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">patientName<\/span> <span class=\"o\">=<\/span> <span class=\"n\">patientName<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setVaccination<\/span><span class=\"o\">(<\/span><span class=\"n\">VaccinationStrategy<\/span> <span class=\"n\">vaccination<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">vaccinationStrategy<\/span> <span class=\"o\">=<\/span> <span class=\"n\">vaccination<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">treatment<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"The treatment of the patient: \"<\/span> <span class=\"o\">+<\/span> <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">patientName<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" has started\"<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">vaccinationStrategy<\/span><span class=\"o\">.<\/span><span class=\"na\">vaccineInjection<\/span><span class=\"o\">());<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"The patient left the hospital\"<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"--------------------------------------------------------------------\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p>In the above example, we set the strategy through the setter (instead of the constructor). <br \/>\nExample of use:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">   \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Main<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">Treatment<\/span> <span class=\"n\">patient1Treatment<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Treatment<\/span><span class=\"o\">(<\/span><span class=\"s\">\"John Duke\"<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">Treatment<\/span> <span class=\"n\">patient2Treatment<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Treatment<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Elisa Muratti\"<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">Treatment<\/span> <span class=\"n\">patient3Treatment<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Treatment<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Jeff People\"<\/span><span class=\"o\">);<\/span>\n\n        <span class=\"n\">patient1Treatment<\/span><span class=\"o\">.<\/span><span class=\"na\">setVaccination<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Covid19Treatment<\/span><span class=\"o\">());<\/span>\n        <span class=\"n\">patient2Treatment<\/span><span class=\"o\">.<\/span><span class=\"na\">setVaccination<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">EbovTreatment<\/span><span class=\"o\">());<\/span>\n        <span class=\"n\">patient3Treatment<\/span><span class=\"o\">.<\/span><span class=\"na\">setVaccination<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">SarsTreatment<\/span><span class=\"o\">());<\/span>\n\n        <span class=\"n\">patient1Treatment<\/span><span class=\"o\">.<\/span><span class=\"na\">treatment<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">patient2Treatment<\/span><span class=\"o\">.<\/span><span class=\"na\">treatment<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">patient3Treatment<\/span><span class=\"o\">.<\/span><span class=\"na\">treatment<\/span><span class=\"o\">();<\/span>\n\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"All patients cured. The world is saved!\"<\/span><span class=\"o\">);<\/span>\n\n    <span class=\"o\">}<\/span>\n\n<span class=\"c1\">\/\/    RESULT:<\/span>\n<span class=\"c1\">\/\/The treatment of the patient: John Duke has started<\/span>\n<span class=\"c1\">\/\/    The patient have been cured of infection with Coronavirus<\/span>\n<span class=\"c1\">\/\/    The patient left the hospital<\/span>\n<span class=\"c1\">\/\/--------------------------------------------------------------------<\/span>\n<span class=\"c1\">\/\/    The treatment of the patient: Elisa Muratti has started<\/span>\n<span class=\"c1\">\/\/    The patient have been cured of infection with Ebov<\/span>\n<span class=\"c1\">\/\/    The patient left the hospital<\/span>\n<span class=\"c1\">\/\/--------------------------------------------------------------------<\/span>\n<span class=\"c1\">\/\/    The treatment of the patient: Jeff People has started<\/span>\n<span class=\"c1\">\/\/    The patient have been cured of infection with SARS<\/span>\n<span class=\"c1\">\/\/    The patient left the hospital<\/span>\n<span class=\"c1\">\/\/--------------------------------------------------------------------<\/span>\n<span class=\"c1\">\/\/    All patients cured. The world is saved!<\/span>\n\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<h3 id=\"tax-calculation-system-with-the-strategy-pattern\">Tax calculation system with the Strategy Pattern<\/h3>\n<p>We have a system for creating invoices, but we have customers from different tax zones. What do you think will be the right design pattern? Exactly, the strategy!<br \/>\nThis time our interface will have one method of <code class=\"highlighter-rouge\">calculate()<\/code>:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">Tax<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"n\">BigDecimal<\/span> <span class=\"nf\">calculate<\/span><span class=\"o\">(<\/span><span class=\"n\">Invoice<\/span> <span class=\"n\">invoice<\/span><span class=\"o\">);<\/span>  \n<span class=\"o\">}<\/span>  \n  \n<span class=\"c1\">\/\/ IMPLEMENTATIONS:  <\/span>\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">DutyTax<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">Tax<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"kd\">public<\/span> <span class=\"n\">BigDecimal<\/span> <span class=\"nf\">calculate<\/span><span class=\"o\">(<\/span><span class=\"n\">Invoice<\/span> <span class=\"n\">invoice<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"k\">return<\/span> <span class=\"n\">invoice<\/span><span class=\"o\">.<\/span><span class=\"na\">getCost<\/span><span class=\"o\">()<\/span>  \n                <span class=\"o\">.<\/span><span class=\"na\">multiply<\/span><span class=\"o\">(<\/span><span class=\"n\">BigDecimal<\/span><span class=\"o\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"o\">(<\/span><span class=\"mf\">0.18<\/span><span class=\"o\">));<\/span>  \n    <span class=\"o\">}<\/span>  \n<span class=\"o\">}<\/span>  \n  \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">FederalTax<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">Tax<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"kd\">public<\/span> <span class=\"n\">BigDecimal<\/span> <span class=\"nf\">calculate<\/span><span class=\"o\">(<\/span><span class=\"n\">Invoice<\/span> <span class=\"n\">invoice<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"k\">return<\/span> <span class=\"n\">invoice<\/span><span class=\"o\">.<\/span><span class=\"na\">getCost<\/span><span class=\"o\">()<\/span>  \n                <span class=\"o\">.<\/span><span class=\"na\">multiply<\/span><span class=\"o\">(<\/span><span class=\"n\">BigDecimal<\/span><span class=\"o\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"o\">(<\/span><span class=\"mf\">0.07<\/span><span class=\"o\">));<\/span>  \n    <span class=\"o\">}<\/span>  \n<span class=\"o\">}<\/span>  \n  \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">VatTax<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">Tax<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"kd\">public<\/span> <span class=\"n\">BigDecimal<\/span> <span class=\"nf\">calculate<\/span><span class=\"o\">(<\/span><span class=\"n\">Invoice<\/span> <span class=\"n\">invoice<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"k\">return<\/span> <span class=\"n\">invoice<\/span><span class=\"o\">.<\/span><span class=\"na\">getCost<\/span><span class=\"o\">()<\/span>  \n                <span class=\"o\">.<\/span><span class=\"na\">multiply<\/span><span class=\"o\">(<\/span><span class=\"n\">BigDecimal<\/span><span class=\"o\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"o\">(<\/span><span class=\"mf\">0.10<\/span><span class=\"o\">));<\/span>  \n    <span class=\"o\">}<\/span>  \n<span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<p>We\u2019ll need the class responsible for the invoice:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Invoice<\/span> <span class=\"o\">{<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"n\">BigDecimal<\/span> <span class=\"n\">cost<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Invoice<\/span><span class=\"o\">(<\/span><span class=\"n\">BigDecimal<\/span> <span class=\"n\">cost<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">cost<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cost<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"n\">BigDecimal<\/span> <span class=\"nf\">getCost<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">cost<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setCost<\/span><span class=\"o\">(<\/span><span class=\"n\">BigDecimal<\/span> <span class=\"n\">cost<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">cost<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cost<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p>And, as before, the <code class=\"highlighter-rouge\">Context<\/code> class:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n  \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Context<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"kd\">private<\/span> <span class=\"n\">Tax<\/span> <span class=\"n\">tax<\/span><span class=\"o\">;<\/span>  \n  \n <span class=\"kd\">public<\/span> <span class=\"nf\">Context<\/span><span class=\"o\">(<\/span><span class=\"n\">Tax<\/span> <span class=\"n\">tax<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span> <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">tax<\/span> <span class=\"o\">=<\/span> <span class=\"n\">tax<\/span><span class=\"o\">;<\/span> <span class=\"o\">}<\/span>  \n <span class=\"kd\">public<\/span> <span class=\"n\">BigDecimal<\/span> <span class=\"nf\">calculateTax<\/span><span class=\"o\">(<\/span><span class=\"n\">Invoice<\/span> <span class=\"n\">invoice<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span> <span class=\"k\">return<\/span> <span class=\"n\">tax<\/span><span class=\"o\">.<\/span><span class=\"na\">calculate<\/span><span class=\"o\">(<\/span><span class=\"n\">invoice<\/span><span class=\"o\">);<\/span> <span class=\"o\">}}<\/span>  <\/code><\/pre><\/figure>\n\n<p>Example of use:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">      \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Main<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n\n        <span class=\"n\">Invoice<\/span> <span class=\"n\">invoice<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Invoice<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">BigDecimal<\/span><span class=\"o\">(<\/span><span class=\"s\">\"1500\"<\/span><span class=\"o\">));<\/span>\n\n        <span class=\"n\">Context<\/span> <span class=\"n\">federal<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Context<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">FederalTax<\/span><span class=\"o\">());<\/span>\n        <span class=\"n\">Context<\/span> <span class=\"n\">vat<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Context<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">VatTax<\/span><span class=\"o\">());<\/span>\n        <span class=\"n\">Context<\/span> <span class=\"n\">duty<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Context<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">DutyTax<\/span><span class=\"o\">());<\/span>\n\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">federal<\/span><span class=\"o\">.<\/span><span class=\"na\">calculateTax<\/span><span class=\"o\">(<\/span><span class=\"n\">invoice<\/span><span class=\"o\">));<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">vat<\/span><span class=\"o\">.<\/span><span class=\"na\">calculateTax<\/span><span class=\"o\">(<\/span><span class=\"n\">invoice<\/span><span class=\"o\">));<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">duty<\/span><span class=\"o\">.<\/span><span class=\"na\">calculateTax<\/span><span class=\"o\">(<\/span><span class=\"n\">invoice<\/span><span class=\"o\">));<\/span>\n\n<span class=\"c1\">\/\/        Result:<\/span>\n<span class=\"c1\">\/\/        105.00<\/span>\n<span class=\"c1\">\/\/        150.0<\/span>\n<span class=\"c1\">\/\/        270.00<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<h3 id=\"the-most-popular-use-of-the-strategy-pattern-in-java\">The most popular use of the Strategy Pattern in Java<\/h3>\n<p>There are a lot of examples to come up with. The most common situations in which the strategy pattern is used are:<\/p>\n<ul>\n  <li><strong>Validation<\/strong>:  You need to check items according to some rule, but it is not yet clear what that rule will be, and there are likely to be many of them.<\/li>\n  <li><strong>Storing information<\/strong>: You want the application to store information to the Database, but later it may be neet to be able to save a file.<\/li>\n  <li><strong>Games<\/strong>: as I wrote in <a href=\"http:\/\/devdiaries.net\/blog\/Java-Strategy-Design-Pattern-By-Example\/#cure-the-coronavirus-with-strategy-pattern\">previous point<\/a> - strategy is often used in games, e.g. to correctly handle the movement of objects in games.<\/li>\n  <li><strong>Sorting<\/strong>: You want to sort elements, but you do not know what sorting algorithm should you use (BrickSort, QuickSort or other).  This is a common case used in examples of Strategy implementation, so I omitted implementation in this article.<\/li>\n  <li><strong>Outputting<\/strong>: You need to output text as a plain string, but later may be a CSV, XML or PDF.<\/li>\n<\/ul>\n\n<h3 id=\"examples-of-strategy-pattern-in-spring-framework-and-java-libraries\">Examples of Strategy Pattern in Spring Framework and Java libraries<\/h3>\n<p>The strategy is a pattern that you often use using different librarians\/frameworks in Java. <br \/>\nThe best example of the strategy pattern is the <code class=\"highlighter-rouge\">Collection.sort()<\/code> method that takes <code class=\"highlighter-rouge\">Comparator<\/code> parameter.  We do not need to change the <code class=\"highlighter-rouge\">sort()<\/code> method to achieve different sorting results. We can just inject different comparators in runtime.<\/p>\n\n<p>The next example is <code class=\"highlighter-rouge\">javax.servlet.Filter#doFilter()<\/code> method. <br \/>\nIn Spring Framework an example of using strategy is class: <code class=\"highlighter-rouge\">org.springframework.web.servlet.mvc.multiaction.MethodNameResolver<\/code><\/p>\n\n<h1 id=\"summary\">Summary<\/h1>\n<p>That\u2019s all about the Strategy Design Pattern\ud83d\ude42<br \/>\nLink to Github with all examples: <a href=\"https:\/\/github.com\/MichalFab\/Strategy-design-pattern\" title=\"Github\">Github<\/a><\/p>","author":{"name":"Michal Fabjanski"},"summary":"Strategy Design Pattern in Java Todat I\u2019ll take you to my lab. I\u2019ll show you how to make your code cleaner. Any project can be created by multiple programmers at the same time, and each of them makes more bricks - being forced to understand other people\u2019s bricks. Because you are in my lab, we will start working on real examples - starting with eccomerce, ending with virus treatment! Strategy Pattern introduction The strategy pattern next to the factory pattern is one of the most frequently used design patterns. It is easy to understand and to implement. It is one of the behavioral patterns, i.e. those that describe certain behavior. Strategy defines a family of interchangeable algorithms (in the form of classes) that are used to solve the same problem in several different ways. Implementation The Context class contains a reference to the StrategyInterface strategy object. The strategy object can be injected by the constructor or setter. The Context class method uses the strategy object to finalize the operation. Strategy classes Strategy1, Strategy2, etc. implement StrategyInterface interface methods. Each of these implementations of StrategyInterface solves a similar problem in a slightly different way. The above diagram can be implemented in the following way: public class Context {"},{"title":"Multithreading in Java. Java synchronization and concurrency. The most important information for a Java Developer interview","link":{"@attributes":{"href":"https:\/\/www.devdiaries.net\/blog\/Java-Interview-Questions-Multithreading\/","rel":"alternate","type":"text\/html","title":"Multithreading in Java. Java synchronization and concurrency. The most important information for a Java Developer interview"}},"published":"2020-02-29T00:00:00+00:00","updated":"2020-02-29T00:00:00+00:00","id":"https:\/\/www.devdiaries.net\/blog\/Java-Interview-Questions-Multithreading","content":"<h1 id=\"introduction-to-java-threads\">Introduction to Java Threads<\/h1>\n<p>Being a Java programmer, most of us have had any contact with multithreading. One of the biggest challenges is to properly synchronize the code between threads. Fortunately, the language developers have prepared for us a full set of tools that help us achieve this goal. \nIf you are curious or you are preparing for an interview - read this post.<\/p>\n\n<h1 id=\"application-without-multithreading\">Application without multithreading<\/h1>\n\n<p>Single-threaded programs are simple applications that do not require concurrent execution of tasks. Each of the tasks is run after the previous one is finished. It looks like this:\n<img src=\"\/images\/concurrency\/3tasksonecpu.jpg\" alt=\"3threads-on-cpu-devdiaries\" \/><\/p>\n\n<p>These rectangles represent three tasks to be performed. The length of the rectangles represents the duration of each task. The tasks are started one by one - after the green task ends, the red task begins. You can say that the tasks are executed sequentially.<\/p>\n\n<h1 id=\"application-with-multithreading\">Application with multithreading<\/h1>\n<h2 id=\"what-is-a-java-threads\">What is a Java Threads<\/h2>\n<p>The threads are a way for the processor to do many things at once. At a given point in time, the processor can only do as many instructions as it has cores (it\u2019s more complicated, but this simplification will allow us to explain more easily). This would mean that you could only have as many programs running at once as you have processor cores - usually two or four on modern computers. To work around this limitation, the processor runs on threads - one program is one (or more) threads.<\/p>\n\n<p>From the developer\u2019s point of view, a thread is a set of instructions that he\/she is going to write in the application, and execute in a certain way. An application itself can be composed of several threads and different threads can be executed at the same time.<\/p>\n<h2 id=\"what-is-time-slicing\">What is Time Slicing<\/h2>\n<p>Going further, does that mean we can only run one thread on a single-core processor? And on a dual-core processor, two threads? Not exactly. This problem was solved by creating a <strong>time-slicing<\/strong> mechanism. A mechanism that allows one processor core to run multiple threads. However, this <strong>does not happen in parallel<\/strong>.\nThe image below shows the tasks from the previous point. This time each of them is run in a separate thread, so we have three threads.  The mechanism that supervises their work (<strong>Thread Scheduler<\/strong>) ensures that from time to time the current thread is stopped. Another thread is woken up, gets processor time and is executed by it. This is known as <strong>Context switch<\/strong>. The sum of the lengths of rectangles in a given color is the same as in the previous example.<\/p>\n\n<p><img src=\"\/images\/concurrency\/time-slicing.jpg\" alt=\"time-slicing-devdiaries\" \/><\/p>\n\n<p>It should be remembered that such an approach does not speed up the execution of tasks (it takes time to stop and wake up the threads) - but it does allow to process each \u201crectangle\u201d a bit. For what purpose? Imagine such tasks:<\/p>\n\n<p><img src=\"\/images\/concurrency\/long-short-task.jpg\" alt=\"time-slicing-devdiaries\" \/><\/p>\n\n<p>The green rectangle is a task to open the browser with the last tabs saved (one million tabs).\nIn the meantime, the user presses the night-mode button, which is a very quick task (red rectangle). Unfortunately, it has to wait until the browser is finished opening tabs. Only then will the next task be executed.\nThe same task can be split, and even though each task will take the same amount of time - the user will start the night-mode much faster. He will not have to wait for the browser to open:<\/p>\n\n<p><img src=\"\/images\/concurrency\/time-slicing-advantage.jpg\" alt=\"time-slicing-devdiaries\" \/><\/p>\n\n<p>This approach avoids starving the threads. In the above example, without time slicing, the thread with the green task would starve the threads with the blue and red tasks.<\/p>\n<h2 id=\"multi-threading-on-multicore-processors\">Multi-threading on multicore processors<\/h2>\n<p>Multi-core processors give you the <strong>real ability to run multiple tasks in parallel<\/strong>. In this case, if each of the tasks is run in a separate thread, the situation looks like in the picture below:<\/p>\n\n<p><img src=\"\/images\/concurrency\/multicore.jpg\" alt=\"time-slicing-devdiaries\" \/><\/p>\n\n<p>In your applications, you\u2019ll meet a combination of both approaches. The image below shows an example of how the task is executed on two cores.<\/p>\n\n<p><img src=\"\/images\/concurrency\/2cores3tasks.jpg\" alt=\"time-slicing-devdiaries\" \/><\/p>\n<h2 id=\"concurrency-vs-parallelism\">Concurrency vs Parallelism<\/h2>\n\n<p>As I mentioned earlier, parallel tasks are only possible on a multi-core CPU. It is important to remember that<\/p>\n\n<blockquote>\n  <p>When there is just one processor, the OS scheduler context switches\nbetween different threads to provide <strong>concurrent execution<\/strong>.<\/p>\n<\/blockquote>\n\n<p>and<\/p>\n\n<blockquote>\n  <p>When there are multiple CPUs, each CPU essentially runs an instance of\nthe OS scheduler, thereby executing threads that are waiting to be\nrun. The result is <strong>parallel execution<\/strong> of the set of threads to be\nexecuted.<\/p>\n<\/blockquote>\n\n<h2 id=\"concurrent-data-processing\">Concurrent data processing<\/h2>\n\n<p>The threads use the same data (they share the address space). This means that objects available for one thread are also visible in other threads.<\/p>\n\n<p>Variables are available for all threads. Therefore, all threads can modify these variables. This has very serious consequences. I will describe them in more detail later in this post.<\/p>\n\n<h1 id=\"java-thread-creation\">Java Thread creation<\/h1>\n<p>Every thread in Java is related to the Thread class. There are several ways to create a thread.<\/p>\n\n<h2 id=\"extending-thread-class\">Extending Thread class<\/h2>\n<p>The first way is to create your class, which inherits from Thread class:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">    \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">FirstThread<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">Thread<\/span> <span class=\"o\">{<\/span>  \n  <span class=\"nd\">@Override<\/span>  \n  <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">run<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Heellooo!\"<\/span><span class=\"o\">);<\/span>  \n  <span class=\"o\">}<\/span>  \n<span class=\"o\">}<\/span>  \n  \n<span class=\"c1\">\/\/ Creating Thread  <\/span>\n<span class=\"n\">Thread<\/span> <span class=\"n\">thread<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">FirstThread<\/span><span class=\"o\">();<\/span><\/code><\/pre><\/figure>\n\n<p>In this case, you have to override <code class=\"highlighter-rouge\">run()<\/code> method - it will be executed in a thread.\n<strong>Extending the Thread class is not good practice.<\/strong> Note that in Java each class can extend only one class. When you extend the Thread class, after that you can\u2019t extend any other class which you required.\nAdditionally, <code class=\"highlighter-rouge\">extends<\/code> in Java is used to add\/modify some functionality from a subclass.  In this case, we do not add\/modify anything to Thread class.<\/p>\n\n<h2 id=\"implementation-of-the-runnable-interface\">Implementation of the Runnable interface<\/h2>\n<p>The second way is to create a thread using the Thread\u2019s constructor, which accepts the object implementing the <code class=\"highlighter-rouge\">Runnable<\/code> interface:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">    \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">FirstThread<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">Runnable<\/span> <span class=\"o\">{<\/span>  \n  <span class=\"nd\">@Override<\/span>  \n  <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">run<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Heellooo from Runnable :)\"<\/span><span class=\"o\">);<\/span>  \n  <span class=\"o\">}<\/span>  \n<span class=\"o\">}<\/span>  \n  \n<span class=\"c1\">\/\/ Creating Thread  <\/span>\n<span class=\"n\">Thread<\/span> <span class=\"n\">thread<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Thread<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">FirstThread<\/span><span class=\"o\">());<\/span><\/code><\/pre><\/figure>\n\n<p>This time the body of the thread is the implementation of the <code class=\"highlighter-rouge\">run()<\/code> interface method (the thread will run this method and will work until it is done).\nNote that you can create a thread using anonymous classes:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">    \n<span class=\"n\">Thread<\/span> <span class=\"n\">newThread<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Thread<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Runnable<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>  \n  <span class=\"nd\">@Override<\/span>  \n  <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">run<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Hello from the thread!\"<\/span><span class=\"o\">);<\/span>  \n  <span class=\"o\">}<\/span>  \n<span class=\"o\">});<\/span><\/code><\/pre><\/figure>\n\n<p>Additionally, the Runnable interface is a function interface. Therefore, this can be simplified by using lambda expressions:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"> \n<span class=\"n\">Thread<\/span> <span class=\"n\">newThread<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Thread<\/span><span class=\"o\">(()<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Hello from the thread!\"<\/span><span class=\"o\">));<\/span><\/code><\/pre><\/figure>\n\n<h2 id=\"creating-threads-in-executorservice\">Creating threads in ExecutorService<\/h2>\n<p><code class=\"highlighter-rouge\">ExecutorService<\/code> is an interface that we do not have to implement on our own, the Java provides us with ready-made implementations. Thanks to that we can easily create a thread or a pool of threads, which will work according to our expectations. The most important methods that this interface provides are:<\/p>\n\n<p><code class=\"highlighter-rouge\">submit(Runnable task)<\/code> - allows you to send \u2018task\u2019 (implementation of the Runnable interface) to be executed (note: <strong>we have no guarantee that it will be started immediately!<\/strong> It depends on the current status of ExecutorService, task queue, available threads, etc).<\/p>\n\n<p><code class=\"highlighter-rouge\">shutdown()<\/code> - allows you to finish threads correctly, previously completing all tasks and releasing all resources. Calling this method is required before the application is finished!<\/p>\n\n<p>A detailed explanation of how ExecutorService works and examples will be presented in the next post.<\/p>\n\n<h1 id=\"the-java-threads-life-cycle\">The Java thread\u2019s life cycle<\/h1>\n<p>Creating a thread is just the beginning. <strong>Each thread has its life cycle<\/strong>. Threads can be in one of six states. Permissible states of the thread are in the Thread.State enumeration class:<\/p>\n\n<ul>\n  <li><strong>NEW<\/strong> - a new thread that has not yet been launched,<\/li>\n  <li><strong>RUNNABLE<\/strong> - a thread that can execute its code,<\/li>\n  <li><strong>TERMINATED<\/strong> - a thread that has ended,<\/li>\n  <li><strong>BLOCKED<\/strong> - thread blocked, waiting for the release of the shared\nresource,<\/li>\n  <li><strong>WAITING<\/strong> - a thread goes to wait state once it calls <code class=\"highlighter-rouge\">wait()<\/code> on an Object. Once a thread reaches waiting state, <strong>it will need to wait till some other thread calls <code class=\"highlighter-rouge\">notify()<\/code> or <code class=\"highlighter-rouge\">notifyAll()<\/code><\/strong> on the object.<\/li>\n  <li><strong>TIMED_WAITING<\/strong> - a thread is waiting for a certain time.<\/li>\n<\/ul>\n\n<p><img src=\"\/images\/concurrency\/threads-states.jpg\" alt=\"thread-states-devdiaries\" \/><\/p>\n\n<p>The change from the NEW state to the RUNNABLE state is made after calling the <code class=\"highlighter-rouge\">start()<\/code> method on the thread instance. Only then the thread can be executed. <strong>Each thread can be run exactly once<\/strong> - the start() method can be called on it only once. Otherwise, the <code class=\"highlighter-rouge\">IllegalThreadStateException<\/code> exception will be thrown.<\/p>\n\n<h1 id=\"synchronization-in-java\">Synchronization in Java<\/h1>\n<h2 id=\"race-condition\">Race Condition<\/h2>\n<p>You already know that threads share the address space. I\u2019ve described it in the subsection <a href=\"https:\/\/www.devdiaries.net\/blog\/Java-Interview-Questions-Multithreading\/#concurrent-data-processing\">#concurrent-data-processing<\/a>. It has very important consequences.  See the example below:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"><span class=\"kd\">class<\/span> <span class=\"nc\">Counter<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">value<\/span><span class=\"o\">;<\/span>  \n  \n <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">increment<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"n\">value<\/span><span class=\"o\">++;<\/span>  \n  <span class=\"o\">}<\/span>  \n  \n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">getValue<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"k\">return<\/span> <span class=\"n\">value<\/span><span class=\"o\">;<\/span>  \n  <span class=\"o\">}<\/span>  \n<span class=\"o\">}<\/span>  \n  \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">RaceCondition<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"n\">InterruptedException<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"n\">Counter<\/span> <span class=\"n\">counter<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Counter<\/span><span class=\"o\">();<\/span>  \n  <span class=\"n\">Runnable<\/span> <span class=\"n\">r<\/span> <span class=\"o\">=<\/span> <span class=\"o\">()<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"o\">{<\/span>  \n            <span class=\"k\">for<\/span> <span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"o\">;<\/span> <span class=\"n\">i<\/span> <span class=\"o\">&lt;<\/span> <span class=\"mi\">50000<\/span><span class=\"o\">;<\/span> <span class=\"n\">i<\/span><span class=\"o\">++)<\/span> <span class=\"o\">{<\/span>  \n                <span class=\"n\">counter<\/span><span class=\"o\">.<\/span><span class=\"na\">increment<\/span><span class=\"o\">();<\/span>  \n  <span class=\"o\">}<\/span>  \n        <span class=\"o\">};<\/span>  \n  \n  <span class=\"n\">Thread<\/span> <span class=\"n\">t1<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Thread<\/span><span class=\"o\">(<\/span><span class=\"n\">r<\/span><span class=\"o\">);<\/span>  \n  <span class=\"n\">Thread<\/span> <span class=\"n\">t2<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Thread<\/span><span class=\"o\">(<\/span><span class=\"n\">r<\/span><span class=\"o\">);<\/span>  \n  <span class=\"n\">Thread<\/span> <span class=\"n\">t3<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Thread<\/span><span class=\"o\">(<\/span><span class=\"n\">r<\/span><span class=\"o\">);<\/span>  \n  \n  <span class=\"n\">t1<\/span><span class=\"o\">.<\/span><span class=\"na\">start<\/span><span class=\"o\">();<\/span>  \n  <span class=\"n\">t2<\/span><span class=\"o\">.<\/span><span class=\"na\">start<\/span><span class=\"o\">();<\/span>  \n  <span class=\"n\">t3<\/span><span class=\"o\">.<\/span><span class=\"na\">start<\/span><span class=\"o\">();<\/span>  \n  \n  <span class=\"n\">t1<\/span><span class=\"o\">.<\/span><span class=\"na\">join<\/span><span class=\"o\">();<\/span>  \n  <span class=\"n\">t2<\/span><span class=\"o\">.<\/span><span class=\"na\">join<\/span><span class=\"o\">();<\/span>  \n  <span class=\"n\">t3<\/span><span class=\"o\">.<\/span><span class=\"na\">join<\/span><span class=\"o\">();<\/span>  \n  \n  <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">counter<\/span><span class=\"o\">.<\/span><span class=\"na\">getValue<\/span><span class=\"o\">());<\/span>  \n  <span class=\"o\">}<\/span>  \n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p>As you can see I used a <code class=\"highlighter-rouge\">Thread.join()<\/code> method. This method <strong>ensures that the current thread waits for the end of the thread on which the join was called<\/strong>.  the default main thread waits for the end of the t1 thread, when t1 ends - waits for t2 to end, then it waits for t3 end (the order may be different).<\/p>\n\n<p>There are three threads in the above code, each of them 50 000 times increment the value of the variable by 1, so the finish counter value should be 150 000, right? Try to run this code several times. What results do you get? In my case, the results were returned:<\/p>\n<ul>\n  <li>111772<\/li>\n  <li>102556<\/li>\n  <li>132565<\/li>\n  <li>92146<\/li>\n<\/ul>\n\n<p>What you\u2019ve seen above is <strong>race condition<\/strong>. This happens if several threads at the same time modify a variable that is not adapted to such a parallel change. But why did the value attribute have such different values? This is because the <strong>value++ operation (value = value + 1) is not an atomic operation<\/strong>.<\/p>\n\n<blockquote>\n  <p>An atomic operation is an operation that is indivisible. An atomic\noperation is performed by a single instruction in the bytecode (in a\ncompiled class).<\/p>\n<\/blockquote>\n\n<p>The execution of value++ (value = value + 1) operation consists of several steps:<\/p>\n<ol>\n  <li>Get the current value to a temporary variable (not visible in the source code),<\/li>\n  <li>Add 1 to the temporary variable,<\/li>\n  <li>Assigning an increased value to value variable.<\/li>\n<\/ol>\n\n<p>In the <a href=\"https:\/\/www.devdiaries.net\/blog\/Java-Interview-Questions-Multithreading\/#what-is-time-slicing\">previous subsection, I described time-slicing<\/a>. It plays a key role here.  Imagine a situation in which the T1 thread execute steps 1, 2 and 3 and was context-switching started. Then threads T2 and T3 took step 1. Then thread T2 took steps 2 and 3. After a while, the same happened to thread T3. As a result, threads overwrite outdated values. One of the scenarios is shown in the table below:<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>Operation<\/th>\n      <th>Thread<\/th>\n      <th>Step<\/th>\n      <th>Value variable<\/th>\n      <th>Temp variable value<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>1.<\/td>\n      <td>T1<\/td>\n      <td>1.<\/td>\n      <td>0<\/td>\n      <td>0<\/td>\n    <\/tr>\n    <tr>\n      <td>2.<\/td>\n      <td>T1<\/td>\n      <td>2.<\/td>\n      <td>0<\/td>\n      <td>1<\/td>\n    <\/tr>\n    <tr>\n      <td>3.<\/td>\n      <td>T1<\/td>\n      <td>3.<\/td>\n      <td>1<\/td>\n      <td>1<\/td>\n    <\/tr>\n    <tr>\n      <td>4.<\/td>\n      <td>T2<\/td>\n      <td>1.<\/td>\n      <td>1<\/td>\n      <td>1<\/td>\n    <\/tr>\n    <tr>\n      <td>5.<\/td>\n      <td>T3<\/td>\n      <td>1.<\/td>\n      <td>1<\/td>\n      <td>1<\/td>\n    <\/tr>\n    <tr>\n      <td>6.<\/td>\n      <td>T2<\/td>\n      <td>2.<\/td>\n      <td>1<\/td>\n      <td>2<\/td>\n    <\/tr>\n    <tr>\n      <td>7.<\/td>\n      <td>T2<\/td>\n      <td>3.<\/td>\n      <td>2<\/td>\n      <td>2<\/td>\n    <\/tr>\n    <tr>\n      <td>8.<\/td>\n      <td>T3<\/td>\n      <td>2.<\/td>\n      <td>2<\/td>\n      <td>2<\/td>\n    <\/tr>\n    <tr>\n      <td>9.<\/td>\n      <td>T3<\/td>\n      <td>3.<\/td>\n      <td>2<\/td>\n      <td>2<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<p>In the example above, operation 9. sets the value to 2 in the T3 thread ignoring the increase in value made by the T2 thread in operation 7.\nTo avoid <em>race condition<\/em>, it is necessary to <strong>synchronize the threads.<\/strong><\/p>\n\n<h2 id=\"java-threads-synchronization\">Java Threads Synchronization<\/h2>\n\n<p>In general, thread states are intuitive. The descriptions in the previous section help you understand what happens to a thread in a given state. Well, maybe apart from the <strong>BLOCKED<\/strong> state. <strong>When is the thread BLOCKED<\/strong>?<\/p>\n\n<p>A thread that is in the BLOCKED state is waiting for a blocked resource. In Java, blocking is done with <strong>monitors<\/strong>, which are used to synchronize the threads.  Each object in Java is associated with a monitor, which a thread can <em>lock<\/em> or <em>unlock<\/em>. <strong>The monitor can only be blocked by one thread at a time<\/strong>. Thanks to this, objects are used to synchronize threads. For this purpose, the <code class=\"highlighter-rouge\">synchronized<\/code> keyword is used.<\/p>\n<h2 id=\"synchronized-block\">Synchronized block<\/h2>\n<p>With a <code class=\"highlighter-rouge\">synchronized<\/code> block, you can be sure that <strong>everything inside the block is running on up to one thread at a time.<\/strong>\nTry to run the modified example from the previous subsection several times:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"><span class=\"kd\">class<\/span> <span class=\"nc\">Counter<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">value<\/span><span class=\"o\">;<\/span>  \n  \n <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">increment<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"kd\">synchronized<\/span> <span class=\"o\">(<\/span><span class=\"k\">this<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>  \n            <span class=\"n\">value<\/span><span class=\"o\">++;<\/span>  \n  <span class=\"o\">}<\/span>  \n    <span class=\"o\">}<\/span>  \n  \n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">getValue<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>  \n        <span class=\"k\">return<\/span> <span class=\"n\">value<\/span><span class=\"o\">;<\/span>  \n  <span class=\"o\">}<\/span>  \n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p>Each time the application returns the correct result - 150 000.<\/p>\n<h2 id=\"synchronized-method\">Synchronized method<\/h2>\n<p>You can also use the <code class=\"highlighter-rouge\">synchronized<\/code> keyword for the method:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"><span class=\"kd\">public<\/span> <span class=\"kd\">synchronized<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">increment<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n    <span class=\"n\">value<\/span> <span class=\"o\">++;<\/span>\n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p>In practice, both versions of the increment method are equivalent. Marking the method with the <code class=\"highlighter-rouge\">synchronized <\/code>keyword is equivalent to placing the whole body of the method in the synchronized block. Which object is used as a monitor depends on the type of method:<\/p>\n\n<ul>\n  <li>standard method - a class (this) instance is used as a monitor.<\/li>\n  <li>static method - the whole class is used as a monitor<\/li>\n<\/ul>\n\n<blockquote>\n  <p>Remember not to abuse synchronized. The code in a synchronized block\ncan only be executed by one thread (it loses the possibility of\nconcurrent execution), which makes the execution of such a program slower.\nUse synchronized only in places where it is necessary.<\/p>\n<\/blockquote>\n\n<h2 id=\"java-thread-in-waiting-state\">Java Thread in WAITING state<\/h2>\n<p>One of the ways to put the thread in WAITING state is to call the <code class=\"highlighter-rouge\">Object.wait()<\/code> method. What the <code class=\"highlighter-rouge\">wait() <\/code>method does?\nImagine a situation where you have two threads. One produces some data, the other consumes it (Producer-Consumer Pattern). \n<img src=\"\/images\/concurrency\/producer-consument-pattern.jpg\" alt=\"producer-consument-pattern-devdiaries\" \/><\/p>\n\n<p>The data-consuming thread (T2) uses a while loop, which is executed until the expected number of items is taken from the queue. The program works. However, it has a subtle problem. Consumer thread works all the time. It takes up CPU time continuously! What\u2019s more, for most of its time, it revolves inside the loop, checking if there are any new messages in the queue. \nHow can this problem be solved? One way may be to put the consumer\u2019s thread to sleep using the Thread.sleep() method. This would also be a waste of time - how do you know how long it will take to produce the next message? For this purpose, it is better to use the <strong>notification mechanism<\/strong>.<\/p>\n<h2 id=\"thread-notification\">Thread Notification<\/h2>\n<p>All Java objects, except monitors, contain a special <strong>wait set<\/strong>. The elements of this set are threads that wait for notification about this object. The only way to modify the content of waiting set is to use methods available in the Object class:<\/p>\n\n<ul>\n  <li><code class=\"highlighter-rouge\">Object.wait()<\/code> - adding the current thread to the waiting set threads,<\/li>\n  <li><code class=\"highlighter-rouge\">Object.notify()<\/code> - notification and waking up one of the pending threads,<\/li>\n  <li><code class=\"highlighter-rouge\">Object.notifyAll() <\/code>- to notify and wake up all pending threads.<\/li>\n<\/ul>\n\n<p>The producer from the previous section should use the <code class=\"highlighter-rouge\">notify<\/code> or <code class=\"highlighter-rouge\">notifyAll<\/code> method to inform consumers of the new message. Consumers should use the <code class=\"highlighter-rouge\">wait<\/code> method so that they can wait for notifications from the producer.<\/p>\n<h2 id=\"interruption-of-the-thread\">Interruption of the thread<\/h2>\n<p>Interruption of a thread is indicated by an <code class=\"highlighter-rouge\">InterruptedException<\/code> exception .  A thread can be interrupted when <code class=\"highlighter-rouge\">Thread.interrupt<\/code> method is called on its instance. When a thread is interrupted, a special flag is set on it, which informs about it (<a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/12\/docs\/api\/java.base\/java\/lang\/Thread.html#interrupted()\"><code class=\"highlighter-rouge\">Thread.interrupted<\/code><\/a>).<\/p>\n<h2 id=\"java-volatile-keyword\">Java Volatile keyword<\/h2>\n<p>Java provides another mechanism which is connected to synchronization - <strong>volatile<\/strong>. The Java specification says that every read of an attribute preceded by this keyword follows its writing. In other words, the <strong>volatile modifier ensures that every thread reading a given attribute will see the latest saved value of that attribute<\/strong>.\nHowever, you have to watch out for modifications that are not atomic - unfortunately, volatile will not protect you. In this case, you will need the synchronization described earlier.<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>Volatile --&gt; Guarantees visibility and NOT atomicity\nSynchronization (Locking) --&gt; Guarantees visibility and atomicity (if done properly)\n<\/code><\/pre><\/div><\/div>\n\n<p>You\u2019re probably wondering what this mechanism is for and what the risk is not using volatile. Imagine a multi-threaded application on a single-core processor:\n<img src=\"\/images\/concurrency\/Volatile-1core.jpg\" alt=\"Volatile-devdiaries\" \/><\/p>\n\n<p>The variables are copied from the main memory to CPU cache (due to a much faster access to the CPU cache compared to RAM access time), Now the threads access the memory from the CPU cache rather than computer memory to save time and increase the performance.\nThere\u2019s nothing dangerous here. Let\u2019s go to the 2-core processor:<\/p>\n\n<p><img src=\"\/images\/concurrency\/Volatile-2core.jpg\" alt=\"Volatile-devdiaries\" \/><\/p>\n\n<p>In Multi-CPU computer each thread may run in different CPUs, which means, that each thread may copy the variables into the CPU cache of different CPUs.\nImagine a situation in which two or more threads have access to a shared object which contains a value variable from the previous point:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"><span class=\"kd\">class<\/span> <span class=\"nc\">Counter<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">value<\/span><span class=\"o\">;<\/span>  \n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p>Now, T1 and T2 can have different CPU cores. When T1 will make changes to <em>value<\/em> variable - the changes have occurred in CPU cache and <strong>there is no guarantee that every change in CPU cache will be reflected to the Main Memory immediately<\/strong>.\nSo when T2 tries to read the updated <code class=\"highlighter-rouge\">value<\/code> variable value from the main memory, T2 may or may not find the updated value.<\/p>\n\n<p>To protect from this problem, just use the <strong>volatile<\/strong> keyword.<\/p>\n<blockquote>\n  <p>volatile is keyword used with variable to make sure the value are read\nfrom and written to main memory rather than CPU cache.<\/p>\n<\/blockquote>\n\n<p>This ensures that you get the \u201creally\u201d correct value of the variable.<\/p>\n\n<h1 id=\"summary\">Summary<\/h1>\n<p>As you can see, there are many thread synchronization mechanisms available in Java. Please take a look at them to better decide which ones to use when.\nIf you want to know more about concurrency, there will be a post about ExecutorService soon!<\/p>","author":{"name":"Michal Fabjanski"},"summary":"Introduction to Java Threads Being a Java programmer, most of us have had any contact with multithreading. One of the biggest challenges is to properly synchronize the code between threads. Fortunately, the language developers have prepared for us a full set of tools that help us achieve this goal. If you are curious or you are preparing for an interview - read this post."},{"title":"Java Recruitment Questions - hashCode() method explained in detail","link":{"@attributes":{"href":"https:\/\/www.devdiaries.net\/blog\/Java-Recruitment-Questions-HashCode\/","rel":"alternate","type":"text\/html","title":"Java Recruitment Questions - hashCode() method explained in detail"}},"published":"2020-02-11T00:00:00+00:00","updated":"2020-02-11T00:00:00+00:00","id":"https:\/\/www.devdiaries.net\/blog\/Java-Recruitment-Questions-HashCode","content":"<p>Questions about <code class=\"highlighter-rouge\">hashCode()<\/code> are asked on most interviews (from junior to senior level). In this post, you will find out what this method is, how it works for particular types, how it works for primitives, what you have to watch out for during your implementations. Enjoy reading!<\/p>\n\n<h1 id=\"what-is-hashcode-method\">What is hashCode() method<\/h1>\n\n<p><code class=\"highlighter-rouge\">hashCode()<\/code> is a method that should contain a hash algorithm that calculates a 32-bit integer (hash) from the object data, representing that object.<\/p>\n\n<p>This hash is used by some collections (e.g. HashMap and HashSet) to store references to objects, so that access to data is very fast. Access time depends on the performance of our hash algorithm, so it is worth paying attention to it!<\/p>\n\n<h1 id=\"do-java-primitive-types-have-their-hashcode\">Do java primitive types have their hashcode()?<\/h1>\n<p>Primitive types are not treated the same as ordinary objects. It is not possible to call the <code class=\"highlighter-rouge\">hashCode()<\/code> method on a primitive type. The only option is to use wrappers such as <code class=\"highlighter-rouge\">Integer.hashCode(3)<\/code>. <code class=\"highlighter-rouge\">Integer.hashCode()<\/code> returns the value of the int we passed on to the method (in our case 3). Implementation of hashCode from Integer class:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\"><span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">hashCode<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">value<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"n\">value<\/span><span class=\"o\">;<\/span>    \n<span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<p>Similar <code class=\"highlighter-rouge\">hashcode()<\/code> functionality  exists in the <strong>Short<\/strong> and <strong>Byte<\/strong> classes. First it casts short\/byte to the int and returns its value.<br \/>\nA little different hashCode() is in <strong>Long<\/strong>. Since Long is a 64-bit number we have to do some \u201ccompression\u201d so that we can return the int value:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">         \n<span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">hashCode<\/span><span class=\"o\">(<\/span><span class=\"kt\">long<\/span> <span class=\"n\">value<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>    \n    <span class=\"k\">return<\/span> <span class=\"o\">(<\/span><span class=\"kt\">int<\/span><span class=\"o\">)(<\/span><span class=\"n\">value<\/span> <span class=\"o\">^<\/span> <span class=\"o\">(<\/span><span class=\"n\">value<\/span> <span class=\"o\">&gt;&gt;&gt;<\/span> <span class=\"mi\">32<\/span><span class=\"o\">));<\/span>    \n<span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<p>The <code class=\"highlighter-rouge\">&gt;&gt;&gt;<\/code> is the right shift bit operation. <code class=\"highlighter-rouge\">value &gt;&gt;&gt; 32<\/code>means that we shift 32 bits to right. It leave only 32 bits - and the rest of the position is completed by 0 (32 rightmost bits are discarded). Then, on shifted value a XOR operation is performed <code class=\"highlighter-rouge\">^<\/code>.<\/p>\n\n<p>Float numbers are more complicated.  Java convert its floating-point values to an equicalent integer value using <code class=\"highlighter-rouge\">Float.floatToIntBits(float value)<\/code>. The method also checks whether the value is NaN (Not-a-number):<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">     \n<span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">hashCode<\/span><span class=\"o\">(<\/span><span class=\"kt\">float<\/span> <span class=\"n\">value<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>    \n    <span class=\"k\">return<\/span> <span class=\"nf\">floatToIntBits<\/span><span class=\"o\">(<\/span><span class=\"n\">value<\/span><span class=\"o\">);<\/span>    \n<span class=\"o\">}<\/span>    \n  \n<span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">floatToIntBits<\/span><span class=\"o\">(<\/span><span class=\"kt\">float<\/span> <span class=\"n\">value<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>    \n    <span class=\"k\">if<\/span> <span class=\"o\">(!<\/span><span class=\"n\">isNaN<\/span><span class=\"o\">(<\/span><span class=\"n\">value<\/span><span class=\"o\">))<\/span> <span class=\"o\">{<\/span>    \n        <span class=\"k\">return<\/span> <span class=\"nf\">floatToRawIntBits<\/span><span class=\"o\">(<\/span><span class=\"n\">value<\/span><span class=\"o\">);<\/span>    \n  <span class=\"o\">}<\/span>    \n    <span class=\"k\">return<\/span> <span class=\"mh\">0x7fc00000<\/span><span class=\"o\">;<\/span>    \n<span class=\"o\">}<\/span>    \n    \n<span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">isNaN<\/span><span class=\"o\">(<\/span><span class=\"kt\">float<\/span> <span class=\"n\">v<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>    \n    <span class=\"k\">return<\/span> <span class=\"o\">(<\/span><span class=\"n\">v<\/span> <span class=\"o\">!=<\/span> <span class=\"n\">v<\/span><span class=\"o\">);<\/span>    \n<span class=\"o\">}<\/span>    \n\n<span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">native<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">floatToRawIntBits<\/span><span class=\"o\">(<\/span><span class=\"kt\">float<\/span> <span class=\"n\">var0<\/span><span class=\"o\">);<\/span>  <\/code><\/pre><\/figure>\n\n<p>Implementation of <code class=\"highlighter-rouge\">floatToRawIntBits()<\/code> depend on the JVM\/JDK you are using. For openJDK the source is <a href=\"http:\/\/hg.openjdk.java.net\/jdk7\/jdk7\/jdk\/file\/9b8c96f96a0f\/src\/share\/native\/java\/lang\/Float.c\">here<\/a>.<\/p>\n\n<p><strong>Double<\/strong> convert its floating-point value to long using <code class=\"highlighter-rouge\">doubleToLongBits()<\/code> then does the same XOR trick as <code class=\"highlighter-rouge\">Long<\/code>.<\/p>\n\n<h1 id=\"does-the-java-enums-have-its-hashcode-\">Does the Java enums have its hashCode() ?<\/h1>\n<p>Enums uses Object\u2019s <code class=\"highlighter-rouge\">hashCode()<\/code> . This is the only way to use hashCode() in the enum.<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">     \n<span class=\"kd\">public<\/span> <span class=\"kd\">final<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">hashCode<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>    \n    <span class=\"k\">return<\/span> <span class=\"kd\">super<\/span><span class=\"o\">.<\/span><span class=\"na\">hashCode<\/span><span class=\"o\">();<\/span>    \n<span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<p>In addition, Enum\u2019s hashcode() is <code class=\"highlighter-rouge\">final<\/code> to prevent developers from creating their own implementations. It is because within one JVM there can exist <strong>only one instance of each enum object<\/strong> (enums are singletons). This is enough to ensure that such implementation makes sense and is correct.<\/p>\n\n<h1 id=\"hashcode-method-in-java-arrays\">hashCode() method in Java arrays<\/h1>\n<p>Arrays do not provide its <code class=\"highlighter-rouge\">hashCode()<\/code> implementation. Just as enums use a method from the Object class.<br \/>\nIt can cause a lot of problems because this hash depends on the magic <a href=\"https:\/\/www.devdiaries.net\/blog\/Java-Recruitment-Questions-HashCode\/#how-is-the-hashcode-calculated-hashcode-jvm-implementation\">described below<\/a>. A better practice is to use <code class=\"highlighter-rouge\">hashCode()<\/code> from the helper class - <code class=\"highlighter-rouge\">Arrays<\/code>.  <code class=\"highlighter-rouge\">Arrays.hashCode()<\/code> method returns a hash code based on the contents of the specified array. If the contents of the two arrays are equal then return the same value. You can see an example below:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">     \n<span class=\"kt\">int<\/span> <span class=\"o\">[]<\/span> <span class=\"n\">numbers1<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"kt\">int<\/span><span class=\"o\">[]{<\/span><span class=\"mi\">1<\/span><span class=\"o\">,<\/span><span class=\"mi\">2<\/span><span class=\"o\">,<\/span><span class=\"mi\">3<\/span><span class=\"o\">,<\/span><span class=\"mi\">4<\/span><span class=\"o\">,<\/span><span class=\"mi\">5<\/span><span class=\"o\">,<\/span><span class=\"mi\">6<\/span><span class=\"o\">};<\/span>    \n<span class=\"kt\">int<\/span> <span class=\"o\">[]<\/span> <span class=\"n\">numbers2<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"kt\">int<\/span><span class=\"o\">[]{<\/span><span class=\"mi\">1<\/span><span class=\"o\">,<\/span><span class=\"mi\">2<\/span><span class=\"o\">,<\/span><span class=\"mi\">3<\/span><span class=\"o\">,<\/span><span class=\"mi\">4<\/span><span class=\"o\">,<\/span><span class=\"mi\">5<\/span><span class=\"o\">,<\/span><span class=\"mi\">6<\/span><span class=\"o\">};<\/span>    \n    \n<span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">numbers1<\/span><span class=\"o\">.<\/span><span class=\"na\">hashCode<\/span><span class=\"o\">());<\/span> <span class=\"c1\">\/\/ return 1595428806    <\/span>\n<span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">numbers2<\/span><span class=\"o\">.<\/span><span class=\"na\">hashCode<\/span><span class=\"o\">());<\/span> <span class=\"c1\">\/\/ return 1072408673    <\/span>\n    \n<span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">Arrays<\/span><span class=\"o\">.<\/span><span class=\"na\">hashCode<\/span><span class=\"o\">(<\/span><span class=\"n\">numbers1<\/span><span class=\"o\">));<\/span> <span class=\"c1\">\/\/ return 918073252    <\/span>\n<span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">Arrays<\/span><span class=\"o\">.<\/span><span class=\"na\">hashCode<\/span><span class=\"o\">(<\/span><span class=\"n\">numbers2<\/span><span class=\"o\">));<\/span> <span class=\"c1\">\/\/ return 918073252  <\/span>\n    <\/code><\/pre><\/figure>\n\n<p><code class=\"highlighter-rouge\">Arrays<\/code> class has several hashCode() methods - for primitive types (e.g. hashCode(float a[]), hashCode(int a[])), which inside use type specific hashcode() from the <a href=\"https:\/\/www.devdiaries.net\/blog\/Java-Recruitment-Questions-HashCode\/#do-java-primitive-types-have-their-hashcode\">wrapper classes<\/a>. For other Objects it use:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">    \n<span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">hashCode<\/span><span class=\"o\">(<\/span><span class=\"n\">Object<\/span> <span class=\"n\">a<\/span><span class=\"o\">[])<\/span> <span class=\"o\">{<\/span>    \n    <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">a<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">null<\/span><span class=\"o\">)<\/span>    \n        <span class=\"k\">return<\/span> <span class=\"mi\">0<\/span><span class=\"o\">;<\/span>    \n    \n <span class=\"kt\">int<\/span> <span class=\"n\">result<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span><span class=\"o\">;<\/span>    \n    \n <span class=\"k\">for<\/span> <span class=\"o\">(<\/span><span class=\"n\">Object<\/span> <span class=\"n\">element<\/span> <span class=\"o\">:<\/span> <span class=\"n\">a<\/span><span class=\"o\">)<\/span>    \n        <span class=\"n\">result<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">31<\/span> <span class=\"o\">*<\/span> <span class=\"n\">result<\/span> <span class=\"o\">+<\/span> <span class=\"o\">(<\/span><span class=\"n\">element<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">null<\/span> <span class=\"o\">?<\/span> <span class=\"mi\">0<\/span> <span class=\"o\">:<\/span> <span class=\"n\">element<\/span><span class=\"o\">.<\/span><span class=\"na\">hashCode<\/span><span class=\"o\">());<\/span>    \n    \n <span class=\"k\">return<\/span> <span class=\"n\">result<\/span><span class=\"o\">;<\/span>    \n<span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<p>As you can see, this method adds all the hash from all elements by multiplying them by a multiplier - which in this case is <strong>31<\/strong>. You may be wondering why we need a multiplier of 31. Thanks to the multiplier, <strong>arrays with the same elements but different order has different hashcodes<\/strong>.  For example, having a table with the elements <code class=\"highlighter-rouge\">[10,20]<\/code> and <code class=\"highlighter-rouge\">[20,10]<\/code> - without a multiplier, hashcode for the first table would be: <code class=\"highlighter-rouge\">1 + 10 + 20 = 30<\/code>, and for the second table: <code class=\"highlighter-rouge\">1 + 20 + 10 = 30<\/code>. Both tables would have the same hashcode (30) even though the order of their elements is different. With a multiplier, their hashcode is - for the first array: <code class=\"highlighter-rouge\">(31*1 + 10) *31+20 = 1291<\/code> and for the second array: <code class=\"highlighter-rouge\">(31*1 + 20) *31+10 = 1591<\/code><\/p>\n\n<p>If you are interested in why the multiplier is 31 - this is described in detail <a href=\"https:\/\/computinglife.wordpress.com\/2008\/11\/20\/why-do-hash-functions-use-prime-numbers\/\">in the article<\/a>. I recommend reading it!<\/p>\n\n<h1 id=\"hashcode-method-in-list-map-set\">hashCode() method in List, Map, Set<\/h1>\n<p><code class=\"highlighter-rouge\">ArrayList<\/code> and <code class=\"highlighter-rouge\">LinkedList<\/code> use the same algorithm as <code class=\"highlighter-rouge\">Arrays.hashCode()<\/code> for the same reason. <code class=\"highlighter-rouge\">Set<\/code>, unlike List, uses hashcode() without multiplier:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">    \n<span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">hashCode<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>    \n    <span class=\"kt\">int<\/span> <span class=\"n\">h<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"o\">;<\/span>    \n  <span class=\"n\">Iterator<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">E<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"n\">iterator<\/span><span class=\"o\">();<\/span>    \n <span class=\"k\">while<\/span> <span class=\"o\">(<\/span><span class=\"n\">i<\/span><span class=\"o\">.<\/span><span class=\"na\">hasNext<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>    \n        <span class=\"n\">E<\/span> <span class=\"n\">obj<\/span> <span class=\"o\">=<\/span> <span class=\"n\">i<\/span><span class=\"o\">.<\/span><span class=\"na\">next<\/span><span class=\"o\">();<\/span>    \n <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">obj<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"o\">)<\/span>    \n            <span class=\"n\">h<\/span> <span class=\"o\">+=<\/span> <span class=\"n\">obj<\/span><span class=\"o\">.<\/span><span class=\"na\">hashCode<\/span><span class=\"o\">();<\/span>    \n  <span class=\"o\">}<\/span>    \n    <span class=\"k\">return<\/span> <span class=\"n\">h<\/span><span class=\"o\">;<\/span>    \n<span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<p>In Set a multiplier is not needed - as the order of the elements does not matter (it is the same). This makes the hashCode calculation a bit faster.<\/p>\n\n<p>In <code class=\"highlighter-rouge\">Maps<\/code>, hashCode adds all element hashes (element hash is xor from the key hash and hash values).<\/p>\n\n<h1 id=\"hashcode-method-in-string\">hashCode() method in String<\/h1>\n<p>This is String class hashCode() implementation:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">    \n<span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">hashCode<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>    \n <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">h<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"o\">!<\/span><span class=\"n\">hashIsZero<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>    \n        <span class=\"n\">h<\/span> <span class=\"o\">=<\/span> <span class=\"n\">isLatin1<\/span><span class=\"o\">()<\/span> <span class=\"o\">?<\/span> <span class=\"n\">StringLatin1<\/span><span class=\"o\">.<\/span><span class=\"na\">hashCode<\/span><span class=\"o\">(<\/span><span class=\"n\">value<\/span><span class=\"o\">)<\/span>    \n                       <span class=\"o\">:<\/span> <span class=\"n\">StringUTF16<\/span><span class=\"o\">.<\/span><span class=\"na\">hashCode<\/span><span class=\"o\">(<\/span><span class=\"n\">value<\/span><span class=\"o\">);<\/span>    \n <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">h<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>    \n            <span class=\"n\">hashIsZero<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"o\">;<\/span>    \n  <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"o\">{<\/span>    \n            <span class=\"n\">hash<\/span> <span class=\"o\">=<\/span> <span class=\"n\">h<\/span><span class=\"o\">;<\/span>    \n  <span class=\"o\">}<\/span>    \n    <span class=\"o\">}<\/span>    \n    <span class=\"k\">return<\/span> <span class=\"n\">h<\/span><span class=\"o\">;<\/span>    \n<span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<p>If the string has Latin encoding, the <code class=\"highlighter-rouge\">StringLatin1.hashCode<\/code> method is used, and if the string is UTF-16 encoding, the hashcode will be generated in <code class=\"highlighter-rouge\">tringUTF16.hashCode<\/code>. The difference is that in <strong>latin1<\/strong> each <strong>character<\/strong> is exactly <strong>one byte<\/strong> long. In utf8 a <strong>character<\/strong> can consist of more than <strong>one byte<\/strong>.  Inside, the hashCode calculating functionality is the same as in List or <code class=\"highlighter-rouge\">Arrays.hashCode()<\/code>.<br \/>\nThe advantage of the <code class=\"highlighter-rouge\">hashCode<\/code> from the String class is that the <strong>hashcode value is cached and calculated lazily during the first call of the method<\/strong>.<\/p>\n\n<h1 id=\"hashcode-method-in-java-objects\">hashCode() method in java Objects<\/h1>\n<p>If your class hasn\u2019t overridden the <code class=\"highlighter-rouge\">hashCode()<\/code> method, then it will use the one defined in its super class, probably in the <code class=\"highlighter-rouge\">Object<\/code> class. <a href=\"http:\/\/docs.oracle.com\/javase\/6\/docs\/api\/java\/lang\/Object.html#hashCode%28%29\">hashCode()<\/a> in Object class is a native function (<strong>is dependant on the JVM<\/strong>). Documentation says :<\/p>\n<blockquote>\n  <p>As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)<\/p>\n<\/blockquote>\n\n<p>It is hard to guess how exactly <code class=\"highlighter-rouge\">hashCode()<\/code> works, as its implementation is placed in the native code of the JVM. In many places, you can find information that <code class=\"highlighter-rouge\">hashCode()<\/code> is simply an address in memory.  Given that the JVM can relocate objects (e.g. during garbage collection cycles due to promotion or compaction) - after we calculate an object\u2019s identity hash we must be able to retain it in a way that survives object relocation.<br \/>\nOne solution is to write the hashcode calculated during the first call of the <code class=\"highlighter-rouge\">hashCode()<\/code> method into the object data (e.g object header). This way, if the object is moved to another memory area, it will still have the same, original hashcode. But despite the fact that it is often believed that - this is not the functionality of the most popular JVM implementation - OpenJDK\u2026<\/p>\n\n<h1 id=\"how-is-the-hashcode-calculated-hashcode-jvm-implementation\">How is the hashCode calculated? hashCode() JVM implementation<\/h1>\n<p>If we go deeper, to the JVM code (the implementation can be found <a href=\"http:\/\/hg.openjdk.java.net\/jdk8u\/jdk8u\/hotspot\/file\/87ee5ee27509\/src\/share\/vm\/prims\/jvm.cpp\">here<\/a> - line 511) we can deduce that the <strong>hashCode is not calculated from the address in the memory but from the thread state!<\/strong> You can find proof of that on <a href=\"https:\/\/stackoverflow.com\/questions\/1961146\/memory-address-of-variables-in-java\/20680667#20680667\">StackOverflow<\/a>.<br \/>\nThere are two important things to remember. First of all, such hashCode calculating exist from OpenJDK 8. Secondly, hashCode calculating is implementation-dependent. In this post we checked OpenJDK. For comparison - J<a href=\"https:\/\/www.azul.com\/products\/zing\/\">VM Zing implementation<\/a> calculates hashCode based on a memory address. <br \/>\nThis can be considered a tricky recruitment question!  :)<\/p>\n\n<h1 id=\"hashcode-own-implementations\">hashCode() own implementations<\/h1>\n<p>Finally, it is important to mention the good practices when creating your own hashCode().<br \/>\nI will share with you the 3 most common ways to create your own hashCode():<\/p>\n<ol>\n  <li>Using IDE (e.g. generating in IntelliJ, you can press ALT + Insert and select \u201cequals and hashCode\u201d from the context menu).<\/li>\n  <li>Using libraries. For example, Lombok library, which will generate <code class=\"highlighter-rouge\">hashCode()<\/code> during compilation.<\/li>\n  <li>Writing your own implementation of <code class=\"highlighter-rouge\">hashCode()<\/code> - you must be careful not to make a mistake. A wrong <code class=\"highlighter-rouge\">hashCode()<\/code> can spoil the effectiveness of HashMap and bring many problems!<\/li>\n<\/ol>\n\n<p>A simple example! Everyone likes simple examples! We have a well-known Person class:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">    \n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Person<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">name<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">surname<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Person<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">name<\/span><span class=\"o\">,<\/span> <span class=\"n\">String<\/span> <span class=\"n\">surname<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">name<\/span> <span class=\"o\">=<\/span> <span class=\"n\">name<\/span><span class=\"o\">;<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">surname<\/span> <span class=\"o\">=<\/span> <span class=\"n\">surname<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"nd\">@Override<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">hashCode<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">Objects<\/span><span class=\"o\">.<\/span><span class=\"na\">hash<\/span><span class=\"o\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">,<\/span> <span class=\"n\">surname<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<p>Remember that when overwriting the <code class=\"highlighter-rouge\">hashCode()<\/code> method you must also overwrite the <code class=\"highlighter-rouge\">equals()<\/code> method, so as not to break the hashCode() &amp; equals() contract. The equals and hashCode methods should meet the following conditions:<br \/>\nIf <strong>x == y then x.equals(y) == true<\/strong><br \/>\nIf <strong>x.equals(y) == true then x.hashCode() == y.hashCode()<\/strong><br \/>\nIf <strong>x.hashCode() == y.hashCode() then x.equals(y) can either return true or return false<\/strong><br \/>\nThe last point is based on int scope (hashCode() returns int value). As a result, <code class=\"highlighter-rouge\">hashCode()<\/code> can return a finite number of results: from -2 147 483 648 to +2 147 483 647 - so, around 4 billion unique values. Let\u2019s imagine, that we are building the application, that keeps more data. If we start invoking the <code class=\"highlighter-rouge\">hashCode()<\/code> method from more than 4 billion elements, it is possible, that first 4 billion ones will produce a unique result, but each next call will produce the integer value, that has been produced before. Therefore, it is important to combine <code class=\"highlighter-rouge\">hashCode()<\/code> with <code class=\"highlighter-rouge\">equals()<\/code> to make sure that objects that have the same hashcodes are not different.<\/p>\n\n<h1 id=\"additional-hashcode-doubts\">Additional hashCode() doubts<\/h1>\n<h2 id=\"do-i-have-to-implement-hashcodeequals-in-each-class\">Do I have to implement hashCode\/equals in each class?<\/h2>\n<p>Answer: No, if you don\u2019t expect to use the <code class=\"highlighter-rouge\">equals<\/code> method (e.g., aren\u2019t using <code class=\"highlighter-rouge\">assertEquals<\/code> from JUnit, or never mean to use this class as a key in a <code class=\"highlighter-rouge\">Map<\/code>, etc), the implementation will not be used -&gt;  it not necessary.<\/p>\n<h2 id=\"what-will-be-the-effect-of-badly-implemented-hashcode\">What will be the effect of badly implemented hashCode()<\/h2>\n<p>Anwer: Even if in hashCode you will return the same int for each element, e.g:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">    \n<span class=\"nd\">@Override<\/span>    \n<span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">hashCode<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>    \n    <span class=\"k\">return<\/span> <span class=\"mi\">123<\/span><span class=\"o\">;<\/span>    \n<span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<p>Your program will compile and run. The problem can be when you want to use collections using hashCode (HashMap, HashSet or other). In the above example hashCode - all elements will be placed into the same bucket in HashMap (as LinkedList elements). Effectiveness will decrease significantly.<\/p>\n<h2 id=\"does-null-have-its-hashcode\">Does null have its hashCode?<\/h2>\n<p>Of course you can\u2019t call the <code class=\"highlighter-rouge\">hashCode()<\/code> method (like any other method) on null value. But we can pass null to <code class=\"highlighter-rouge\">Objects.hashCode()<\/code>:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">    \n<span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">hashCode<\/span><span class=\"o\">(<\/span><span class=\"n\">Object<\/span> <span class=\"n\">o<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>  \n    <span class=\"k\">return<\/span> <span class=\"n\">o<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span> <span class=\"o\">?<\/span> <span class=\"n\">o<\/span><span class=\"o\">.<\/span><span class=\"na\">hashCode<\/span><span class=\"o\">()<\/span> <span class=\"o\">:<\/span> <span class=\"mi\">0<\/span><span class=\"o\">;<\/span>  \n<span class=\"o\">}<\/span>  <\/code><\/pre><\/figure>\n\n<p>As you can see, Objects.hashCode() for null will return 0. You\u2019re probably wondering how HashMap\u2019s doing in that case.  <code class=\"highlighter-rouge\">HashMap<\/code> has a <a href=\"https:\/\/stackoverflow.com\/questions\/17268212\/hashcode-for-null-key-in-hashmap\">special handling<\/a> for <code class=\"highlighter-rouge\">null<\/code> keys. <code class=\"highlighter-rouge\">null<\/code> values are fine as you don\u2019t compute hash code for them in a <code class=\"highlighter-rouge\">HashMap<\/code>. This is the reason why <code class=\"highlighter-rouge\">null<\/code> keys work fine in <code class=\"highlighter-rouge\">HashMap<\/code>.<\/p>\n\n<h1 id=\"summary\">Summary<\/h1>\n\n<p>I hope you liked the article. If you have any questions, please feel free to comment. Thank you for your comments under the <a href=\"https:\/\/www.devdiaries.net\/blog\/Java-Recruitment-Questions-Immutable-Objects\/\">last post<\/a> :)<\/p>","author":{"name":"Michal Fabjanski"},"summary":"Questions about hashCode() are asked on most interviews (from junior to senior level). In this post, you will find out what this method is, how it works for particular types, how it works for primitives, what you have to watch out for during your implementations. Enjoy reading! What is hashCode() method hashCode() is a method that should contain a hash algorithm that calculates a 32-bit integer (hash) from the object data, representing that object. This hash is used by some collections (e.g. HashMap and HashSet) to store references to objects, so that access to data is very fast. Access time depends on the performance of our hash algorithm, so it is worth paying attention to it! Do java primitive types have their hashcode()? Primitive types are not treated the same as ordinary objects. It is not possible to call the hashCode() method on a primitive type. The only option is to use wrappers such as Integer.hashCode(3). Integer.hashCode() returns the value of the int we passed on to the method (in our case 3). Implementation of hashCode from Integer class: public static int hashCode(int value) { return value; } Similar hashcode() functionality exists in the Short and Byte classes. First it casts short\/byte to the int and returns its value. A little different hashCode() is in Long. Since Long is a 64-bit number we have to do some \u201ccompression\u201d so that we can return the int value: public static int hashCode(long value) { return (int)(value ^ (value &gt;&gt;&gt; 32)); } The &gt;&gt;&gt; is the right shift bit operation. value &gt;&gt;&gt; 32means that we shift 32 bits to right. It leave only 32 bits - and the rest of the position is completed by 0 (32 rightmost bits are discarded). Then, on shifted value a XOR operation is performed ^."},{"title":"Java Recruitment Questions - Immutable Objects","link":{"@attributes":{"href":"https:\/\/www.devdiaries.net\/blog\/Java-Recruitment-Questions-Immutable-Objects\/","rel":"alternate","type":"text\/html","title":"Java Recruitment Questions - Immutable Objects"}},"published":"2020-02-04T00:00:00+00:00","updated":"2020-02-04T00:00:00+00:00","id":"https:\/\/www.devdiaries.net\/blog\/Java-Recruitment-Questions-Immutable-Objects","content":"<h1 id=\"java-recruitment-questions---immutable-objects\">Java Recruitment Questions - Immutable Objects<\/h1>\n\n<p>In Java, object variability is something very common. Until recently, it was normal for most beans to have getters and setters (In many projects this trend is still continuing).\nIncreasingly, at interviews, interviewers ask: \u201cWhat are immutable objects and what are their advantages and disadvantages?\u201d<\/p>\n\n<h1 id=\"what-is-an-immutable-object\">What is an immutable object?<\/h1>\n<p>An immutable object is one which, after being created and initialized, remains unchanged and, importantly, cannot be changed (in a conventional way, of course). This means that such an <strong>object does not provide methods that allow changing its state. And all its fields are private<\/strong> (or public final).<\/p>\n\n<p><em>This changeability is a little apparent, because, using reflection, you can change the field values in each class. However, this does not mean that for this reason, we should give up immutable objects.<\/em><\/p>\n\n<h1 id=\"how-to-ensure-the-objects-immutability\">How to ensure the object\u2019s immutability?<\/h1>\n<p>Apart from the fact that all fields should be private, they should be final. And the class itself should be marked as final so that it cannot be inherited. Such an object should not provide methods to modify its internal state, e.g. setters.<\/p>\n\n<p>But private, final fields are not everything. <strong>It is important what types of data we store in these fields<\/strong>. It should also be unchangeable! If the fields in your object are primitives, primitive wrappers or Strings then there is no problem. All these types are immutable. But if you use your own objects, you must ensure that they are unchangeable.<\/p>\n\n<p>If you use a collection, <strong>you must also ensure that it remains immutable<\/strong>. There are several possibilities:<\/p>\n<ul>\n  <li>You can use special methods from the Collections class that return an appropriate unmodified view of the collection:\n    <ul>\n      <li><code class=\"highlighter-rouge\">static &lt;T&gt; List&lt;T&gt; unmodifiableList(List&lt;? extends T&gt; list)<\/code><\/li>\n      <li><code class=\"highlighter-rouge\">static &lt;T&gt; Set&lt;T&gt; unmodifiableSet(Set&lt;? extends T&gt; s)<\/code><\/li>\n      <li><code class=\"highlighter-rouge\">static &lt;K,V&gt; Map&lt;K,V&gt; unmodifiableMap(Map&lt;? extends K,? extends V&gt; m)<\/code>\n Each of these methods takes a list, a set or a map as an argument and returns the list, set or map\n with the same content as the argument, but different from the original in that the attempt to change them, for example add or remove, causes an exception\n <code class=\"highlighter-rouge\">UnsupportedOperationException<\/code><\/li>\n    <\/ul>\n  <\/li>\n  <li>Use the immutable collections. If you are using Java 8 or above, you must use a library that will provide you with an implementation of the unchanging collections (e.g. Guava). If you are using newer versions of Java (9+), you have a collection that is immutable in the standard packages, e.g. <code class=\"highlighter-rouge\">List.of(\"a\", \"b\", \"c\");<\/code>. In Java 10, there are also <code class=\"highlighter-rouge\">copyOf(...)<\/code> methods that allow you to copy the standard collection and convert it to the fixed one.<\/li>\n<\/ul>\n\n<p>If you use a <strong>primitive array<\/strong> - you have a little problem because the arrays are inherently changeable. And using them in immutable objects is pointless. Of course, when creating an object, we can copy all arrays, but this does not change the fact that the copied arrays are also changeable. In this case, it is best to use the collection.<\/p>\n\n<h1 id=\"how-to-create-immutable-objects\">How to create immutable objects?<\/h1>\n\n<p>Such objects can be created in three ways. Through the <strong>constructor<\/strong> and that is the easiest way. But it has a fundamental disadvantage. The more fields to initiate, the more parameters in the constructor. That\u2019s why you shouldn\u2019t create objects that have more than 2-3 fields.<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">          \n<span class=\"kd\">public<\/span> <span class=\"kd\">final<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Animal<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"n\">String<\/span> <span class=\"n\">name<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"n\">String<\/span> <span class=\"n\">ownerName<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Animal<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">name<\/span><span class=\"o\">,<\/span> <span class=\"n\">String<\/span> <span class=\"n\">ownerName<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">name<\/span> <span class=\"o\">=<\/span> <span class=\"n\">name<\/span><span class=\"o\">;<\/span>\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">ownerName<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ownerName<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getName<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">name<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getOwnerName<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">ownerName<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n\n<span class=\"c1\">\/\/ Creation<\/span>\n<span class=\"n\">Animal<\/span> <span class=\"n\">animal<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Animal<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Tina\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"John\"<\/span><span class=\"o\">);<\/span><\/code><\/pre><\/figure>\n\n<p>Another way is the <strong>factory method<\/strong>. As with the constructor, the more fields, the more parameters. But this approach has such an advantage that we can create several such methods with a different names, with different set of parameters, which improves readability.<\/p>\n\n<p>A third way to create immutable objects is to use the <strong>builder pattern<\/strong>. In order to use the builder, it must be implemented inside the class so that it has access to private class fields.<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-java\" data-lang=\"java\">          \n<span class=\"kd\">public<\/span> <span class=\"kd\">final<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">User<\/span> <span class=\"o\">{<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">age<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">firstName<\/span><span class=\"o\">;<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">lastName<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"n\">Builder<\/span> <span class=\"nf\">builder<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">Builder<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Builder<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kd\">private<\/span> <span class=\"n\">User<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">User<\/span><span class=\"o\">();<\/span>\n\n        <span class=\"kd\">public<\/span> <span class=\"n\">Builder<\/span> <span class=\"nf\">firstName<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">firstName<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">firstName<\/span> <span class=\"o\">=<\/span> <span class=\"n\">firstName<\/span><span class=\"o\">;<\/span>\n            <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n\n        <span class=\"kd\">public<\/span> <span class=\"n\">Builder<\/span> <span class=\"nf\">lastName<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">lastName<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">lastName<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lastName<\/span><span class=\"o\">;<\/span>\n            <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n\n        <span class=\"kd\">public<\/span> <span class=\"n\">Builder<\/span> <span class=\"nf\">age<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">age<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">age<\/span> <span class=\"o\">=<\/span> <span class=\"n\">age<\/span><span class=\"o\">;<\/span>\n            <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n\n        <span class=\"kd\">public<\/span> <span class=\"n\">User<\/span> <span class=\"nf\">build<\/span><span class=\"o\">(){<\/span>\n            <span class=\"k\">return<\/span> <span class=\"n\">user<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n    <span class=\"o\">}<\/span>\n\n<span class=\"c1\">\/\/ Creation<\/span>\n <span class=\"n\">User<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">User<\/span><span class=\"o\">.<\/span><span class=\"na\">builder<\/span><span class=\"o\">()<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">firstName<\/span><span class=\"o\">(<\/span><span class=\"s\">\"John\"<\/span><span class=\"o\">)<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">lastName<\/span><span class=\"o\">(<\/span><span class=\"s\">\"People\"<\/span><span class=\"o\">)<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">age<\/span><span class=\"o\">(<\/span><span class=\"mi\">45<\/span><span class=\"o\">)<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">build<\/span><span class=\"o\">();<\/span><\/code><\/pre><\/figure>\n\n<p>We can write such a builder manually or use some kind of IDE plugin to generate it for us. Another option is to use Lombok and @Builder annotation.<\/p>\n\n<h1 id=\"advantages-of-immutable-objects\">Advantages of immutable objects<\/h1>\n<p>These objects make us avoid accidental changes, often in very inappropriate places. If an object is changeable, there will definitely be someone who wants to change it where it should not.<\/p>\n\n<p>A good example of such a situation is the object that we pass as a parameter of the method. Such an object can be passed between multiple application layers, between multiple method calls. It can be passed on very deep in the call hierarchy. This makes it very difficult to identify where it was changed. This can lead to many strange and difficult to solve problems.<\/p>\n\n<p>Using immutable objects we do not have such problems and the design of our application improves.<\/p>\n\n<p>Invariant objects are also safe for <strong>multithreaded<\/strong> use. If an object is not changed, it can be safely transferred between threads without synchronization.<\/p>\n\n<p>Another advantage is that such objects are ideal as <strong>key objects in maps<\/strong>. In a situation where keys are variable, after changing the key object its hashcode changes, making it impossible to find the stored value in HashMap.<\/p>\n\n<h1 id=\"disadvantages-of-immutable-objects\">Disadvantages of immutable objects<\/h1>\n\n<p>Writing this post I didn\u2019t think about the disadvantages of creating immutable classes. Fortunately, a user <em>potracheno<\/em> informed about it in the <a href=\"https:\/\/www.reddit.com\/r\/java\/comments\/ezvcx0\/java_recruitment_question_explained_what_are\/fh27dpc?utm_source=share&amp;utm_medium=web2x\">comment<\/a>. Thanks!<\/p>\n\n<p>Immutable objects have far more advantages than disadvantages. The only thing that comes to my mind is the cost of memory. With immutability, any time you need to modify data, you need to create a new object. This can be expensive. If you are sure that you will not need immutability (e.g. you are creating a simple single-threaded application) - do not create immutable code.<\/p>\n\n<h1 id=\"when-to-use-immutable-objects\">When to use immutable objects?<\/h1>\n<p>You can use the same objects anywhere and anytime. You don\u2019t have to use multithreading to use immutable objects. Applications that work in one thread also gain a lot when using immutable objects.<\/p>\n\n<h1 id=\"summary\">Summary<\/h1>\n<p>Immutable objects are a very important element of application building, which makes applications more legible and consistent, as well as more error-proof. Every developer should know how to use immutable objects and what benefits are associated with their use.<\/p>","author":{"name":"Michal Fabjanski"},"summary":"Java Recruitment Questions - Immutable Objects"},{"title":"Metrics from unstructured logs on Kubernetes. Sidecar pattern with grok exporter - Part 2","link":{"@attributes":{"href":"https:\/\/www.devdiaries.net\/blog\/Prometheus-On-Kubernetes-Part-2\/","rel":"alternate","type":"text\/html","title":"Metrics from unstructured logs on Kubernetes. Sidecar pattern with grok exporter - Part 2"}},"published":"2019-08-31T00:00:00+00:00","updated":"2019-08-31T00:00:00+00:00","id":"https:\/\/www.devdiaries.net\/blog\/Prometheus-On-Kubernetes-Part-2","content":"<p>In <a href=\"https:\/\/www.devdiaries.net\/blog\/Prometheus-On-Kubernetes-Part-1\/\">previous post<\/a>, you have looked into Prometheus basics. In this part, it is time to create Prometheus service on the Kubernetes which can scrape metrics from additional metric exporter.  It\u2019s the perfect solution when you can\u2019t export metrics from the application source code and your application logs the information you want to  expose as metrics.<\/p>\n\n<h3 id=\"example-spring-application-with-logging\">Example Spring application with logging<\/h3>\n\n<p>To understand how an grok exporter works, we must first create an application that logs some data to files.<\/p>\n\n<p>I have prepared a very simple application in Spring Boot that has two functionalities:<\/p>\n\n<ol>\n  <li>\n    <p>Welcomes users entering the home page. If the user does not provide his name in <code class=\"highlighter-rouge\">@RequestParam<\/code> - the application will answer: Hello Guest<\/p>\n\n    <p><img src=\"\/images\/prometheus-kubernetes\/hello.JPG\" alt=\"prometheus-kubernetes-devdiaries\" \/><\/p>\n\n    <p>HelloController source code: <a href=\"https:\/\/github.com\/MichalFab\/grok-exporter-spring-app\/blob\/master\/src\/main\/java\/net\/devdiaries\/controller\/HelloController.java\">Github<\/a><\/p>\n  <\/li>\n  <li>\n    <p>Every 10 seconds creates a log in the form: <strong>DATE TIME SERVICE_NAME CONNECTION_TIME<\/strong>.<\/p>\n  <\/li>\n<\/ol>\n\n<p><img src=\"\/images\/prometheus-kubernetes\/times-logs.JPG\" alt=\"prometheus-kubernetes-devdiaries\" \/><\/p>\n\n<p>Service names are randomly selected from 3 defined names. Response times are also random. The logs are supposed to resemble real logs of the application connecting to other services and measuring the time of connection. The source code is on the <a href=\"https:\/\/github.com\/MichalFab\/grok-exporter-spring-app\/blob\/master\/src\/main\/java\/net\/devdiaries\/scheduler\/SchedulerTask.java\">Github<\/a><\/p>\n\n<p>Logs are saved to the <code class=\"highlighter-rouge\">logs\/applog.log<\/code> file. Log4j configuration:\n<img src=\"\/images\/prometheus-kubernetes\/log4j.JPG\" alt=\"prometheus-kubernetes-devdiaries\" \/>\nlog4j.xml code: <a href=\"https:\/\/github.com\/MichalFab\/gork-exporter-spring-app\/blob\/master\/src\/main\/resources\/log4j2.xml\">Github<\/a><\/p>\n\n<p>Application code is also available on <a href=\"https:\/\/github.com\/MichalFab\/grok-exporter-spring-app\">Github<\/a>, docker image is on <a href=\"https:\/\/cloud.docker.com\/u\/michf\/repository\/docker\/michf\/spring-logging-app\">dockerHub<\/a>.<\/p>\n\n<h3 id=\"deploy-a-spring-boot-application-on-kubernetes\">Deploy a Spring Boot Application on Kubernetes<\/h3>\n\n<p>Firstly, we have to build docker image with application. I have already done it -  image is pushed to the DockerHub. You can just import the image in the deployment definition (<code class=\"highlighter-rouge\">image: docker.io\/michf\/spring-logging-app:latest<\/code>) for Kubernetes to deploy application.<\/p>\n\n<p>If you want to create an image of your own application you can create a Dockerfile based on <a href=\"https:\/\/github.com\/MichalFab\/grok-exporter-spring-app\/blob\/master\/Dockerfile\">mine<\/a> and push to the Dockerhub.<\/p>\n\n<p>Now, we have to prepare Kubernetes deployment configuration. Let\u2019s start from the Deployment config:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-yaml\" data-lang=\"yaml\"> \n          <span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">apps\/v1<\/span>\n          <span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deployment<\/span>\n          <span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\n            <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring-logging-app<\/span>\n            <span class=\"na\">labels<\/span><span class=\"pi\">:<\/span>\n              <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring-logging-app<\/span>\n          <span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\n            <span class=\"na\">replicas<\/span><span class=\"pi\">:<\/span> <span class=\"s\">1<\/span>\n            <span class=\"na\">selector<\/span><span class=\"pi\">:<\/span>\n              <span class=\"na\">matchLabels<\/span><span class=\"pi\">:<\/span>\n                <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring-logging-app<\/span>\n            <span class=\"na\">template<\/span><span class=\"pi\">:<\/span>\n              <span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\n                <span class=\"na\">labels<\/span><span class=\"pi\">:<\/span>\n                  <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring-logging-app<\/span>\n              <span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\n                <span class=\"na\">containers<\/span><span class=\"pi\">:<\/span>\n                  <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring-logging-app<\/span>\n                    <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docker.io\/michf\/spring-logging-app:latest<\/span>\n                    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\n                      <span class=\"pi\">-<\/span> <span class=\"na\">containerPort<\/span><span class=\"pi\">:<\/span> <span class=\"s\">8080<\/span><\/code><\/pre><\/figure>\n\n<p>Service definition:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-yaml\" data-lang=\"yaml\"> \n<span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">v1<\/span>\n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Service<\/span>\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring-logging-app<\/span>\n<span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">type<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ClusterIP<\/span>\n  <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"na\">protocol<\/span><span class=\"pi\">:<\/span> <span class=\"s\">TCP<\/span>\n      <span class=\"na\">targetPort<\/span><span class=\"pi\">:<\/span> <span class=\"s\">8080<\/span>\n      <span class=\"na\">port<\/span><span class=\"pi\">:<\/span> <span class=\"s\">8080<\/span>\n    <span class=\"na\">selector<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">sidecar<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring-logging-app<\/span><\/code><\/pre><\/figure>\n\n<p>That\u2019s all. You can deploy logging application on Kubernetes.<\/p>\n\n<h3 id=\"deploy-a-grok-exporter-as-a-sidecar-on-kubernetes\">Deploy a Grok Exporter as a sidecar on Kubernetes<\/h3>\n\n<p>We will be collecting data from our logs using a <strong>sidecar container<\/strong>. A sidecar container is a secondary container which is run within the same Pod.  In our case <code class=\"highlighter-rouge\">grok exporter<\/code> will be a sidecar container.<\/p>\n\n<p>To configure sidecar pattern, we will create a volume (with \/logs path) for our Pod to be shared by all containers in the Pod. Then we will configure grok exporter to read logs from shared location.<\/p>\n\n<p>Firstly, we have to create grok service. Service will be a target in Prometheus:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-yaml\" data-lang=\"yaml\"> \n<span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">v1<\/span>\n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Service<\/span>\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">grok-exporter<\/span>\n  <span class=\"na\">labels<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">sidecar<\/span><span class=\"pi\">:<\/span> <span class=\"s\">grok-exporter<\/span>\n<span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">type<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ClusterIP<\/span>\n  <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"na\">protocol<\/span><span class=\"pi\">:<\/span> <span class=\"s\">TCP<\/span>\n      <span class=\"na\">targetPort<\/span><span class=\"pi\">:<\/span> <span class=\"s\">9144<\/span>\n      <span class=\"na\">port<\/span><span class=\"pi\">:<\/span> <span class=\"s\">9144<\/span>\n    <span class=\"na\">selector<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">sidecar<\/span><span class=\"pi\">:<\/span> <span class=\"s\">grok-exporter<\/span><\/code><\/pre><\/figure>\n\n<p>9144 is a default grok exporter port.<\/p>\n<h4 id=\"log-capture-using-grok-exporter-in-kubernetes\">Log capture using grok exporter in Kubernetes<\/h4>\n<p>To capture logs we need to create a configuration file.  For this purpose we will use Kubernetes <code class=\"highlighter-rouge\">ConfigMap<\/code>:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-yaml\" data-lang=\"yaml\"> \n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ConfigMap<\/span>\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">grok-exporter<\/span>\n<span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">v1<\/span>\n<span class=\"na\">data<\/span><span class=\"pi\">:<\/span>\n  <span class=\"s\">config.yml<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|-<\/span>\n    <span class=\"no\">global:<\/span>\n      <span class=\"no\">config_version: 2<\/span>\n    <span class=\"no\">input:<\/span>\n      <span class=\"no\">type: file<\/span>\n      <span class=\"no\">fail_on_missing_logfile: false<\/span>\n      <span class=\"no\">path: \/logs\/applog.log<\/span>\n    <span class=\"no\">grok:<\/span>\n      <span class=\"no\">patterns_dir: .\/patterns<\/span>\n    <span class=\"no\">metrics:<\/span>\n      <span class=\"no\">- type: histogram<\/span>\n        <span class=\"no\">name: service_call<\/span>\n        <span class=\"no\">help: Services call times<\/span>\n        <span class=\"no\">match: '%{DATE} %{TIME} %{WORD:service} connection time= %{INT:val}'<\/span>\n        <span class=\"no\">value: ''<\/span>\n  <span class=\"no\">buckets: [100, 1000, 3000]<\/span>\n    <span class=\"no\">labels:<\/span>\n      <span class=\"no\">service    :'{{.service}}'<\/span>\n    <span class=\"no\">- type: counter<\/span>\n      <span class=\"no\">name: hello_requests_total<\/span>\n      <span class=\"no\">help: Hello controller requests counter<\/span>\n      <span class=\"no\">match: '%{DATE} %{TIME} HelloController request from: %{USER:user}'<\/span>\n      <span class=\"no\">labels:<\/span>\n        <span class=\"no\">user    : '{{.user}}'<\/span>\n    <span class=\"no\">server:<\/span>\n      <span class=\"no\">port: 9144<\/span><\/code><\/pre><\/figure>\n\n<p>Configmap will create and mount the <strong>config.yml<\/strong> file (configuration for grok exporter). In config.yml we set the path to the mounted volume (\/logs\/applog.log) and two types of metrics. The <a href=\"https:\/\/www.devdiaries.net\/blog\/Prometheus-On-Kubernetes-Part-1\/#histogram\"><strong>histogram<\/strong><\/a> will inform you about how many connections to external services took less than 100 ms, how many calls took more than 100, but less than 1000, and how many calls lasted more than 3000 ms. <a href=\"https:\/\/www.devdiaries.net\/blog\/Prometheus-On-Kubernetes-Part-1\/#counter\"><strong>Counter<\/strong><\/a> will inform you how many http requests has served our application for a given user.<\/p>\n\n<p>The <code class=\"highlighter-rouge\">match:<\/code> property is an expression pattern. You can find all grok patterns on the <a href=\"https:\/\/github.com\/logstash-plugins\/logstash-patterns-core\/blob\/master\/patterns\/grok-patterns\">Github<\/a>.\nThen you can adjust the pattern to catch your logs.<\/p>\n\n<p>Let\u2019s add volume and grok exporter image to the deployment definition from previous point:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-yaml\" data-lang=\"yaml\"> \n<span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">apps\/v1<\/span>\n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deployment<\/span>\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring-logging-app<\/span>\n  <span class=\"na\">labels<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring-logging-app<\/span>\n<span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">replicas<\/span><span class=\"pi\">:<\/span> <span class=\"s\">1<\/span>\n  <span class=\"na\">selector<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">matchLabels<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring-logging-app<\/span>\n      <span class=\"na\">sidecar<\/span><span class=\"pi\">:<\/span> <span class=\"s\">grok-exporter<\/span>\n  <span class=\"na\">template<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">labels<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring-logging-app<\/span>\n        <span class=\"na\">sidecar<\/span><span class=\"pi\">:<\/span> <span class=\"s\">grok-exporter<\/span>\n    <span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">containers<\/span><span class=\"pi\">:<\/span>\n        <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring-logging-app<\/span>\n          <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docker.io\/michf\/spring-logging-app:latest<\/span>\n          <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\n            <span class=\"pi\">-<\/span> <span class=\"na\">containerPort<\/span><span class=\"pi\">:<\/span> <span class=\"s\">8080<\/span>\n          <span class=\"na\">volumeMounts<\/span><span class=\"pi\">:<\/span>\n            <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">logs<\/span>\n              <span class=\"na\">mountPath<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/logs\/<\/span>\n                <span class=\"s\">- name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">grok<\/span>\n          <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">palobo\/grok_exporter<\/span>\n          <span class=\"na\">imagePullPolicy<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Always<\/span>\n          <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\n            <span class=\"pi\">-<\/span> <span class=\"na\">containerPort<\/span><span class=\"pi\">:<\/span> <span class=\"s\">9144<\/span>\n              <span class=\"na\">protocol<\/span><span class=\"pi\">:<\/span> <span class=\"s\">TCP<\/span>\n          <span class=\"na\">volumeMounts<\/span><span class=\"pi\">:<\/span>\n            <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">grok-config-volume<\/span>\n              <span class=\"na\">mountPath<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/etc\/grok_exporter<\/span>\n            <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">logs<\/span>\n              <span class=\"na\">mountPath<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/logs<\/span>\n            <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\n                <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">grok-config-volume<\/span>\n          <span class=\"na\">configMap<\/span><span class=\"pi\">:<\/span>\n                <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">grok-exporter<\/span>\n                    <span class=\"s\">- name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">logs<\/span>\n          <span class=\"na\">emptyDir<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">{}<\/span><\/code><\/pre><\/figure>\n\n<p>Now, we can deploy above Deployment.  After entering the pod via Kubernetes Dashboard, you should see information about two containers (from grok and from the logging application):<\/p>\n\n<p><img src=\"\/images\/prometheus-kubernetes\/containers.JPG\" alt=\"kubernetes-login\" \/><\/p>\n\n<p>Let\u2019s check if grok expese endpoint wiht metrics. I used <code class=\"highlighter-rouge\">kubectl port-forward pod-name port:port<\/code> to forward a grok port to localhost<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\"> \n\nkubectl port-forward spring-logging-app-79bb56876-c4h29 9144:9144     <\/code><\/pre><\/figure>\n<hr \/>\n\n<p>You can go to <code class=\"highlighter-rouge\">127.0.0.1:9144\/metrics<\/code> and check the application metrics based on the logs:.<\/p>\n\n<p>Counter metrics:<\/p>\n\n<p><img src=\"\/images\/prometheus-kubernetes\/hello-counter.JPG\" alt=\"kubernetes-login\" \/><\/p>\n\n<p>Histogram metrics:<\/p>\n\n<p><img src=\"\/images\/prometheus-kubernetes\/histogram.JPG\" alt=\"kubernetes-login\" \/><\/p>\n\n<h3 id=\"deploy-a-prometheus-on-kubernetes\">Deploy a Prometheus on Kubernetes<\/h3>\n\n<h4 id=\"prometheus-configmap\">Prometheus ConfigMap<\/h4>\n\n<p>Firstly, create a configmap with the Prometheus scrape config:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-yaml\" data-lang=\"yaml\"> \n<span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">v1<\/span>\n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ConfigMap<\/span>\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">prometheus<\/span>\n<span class=\"na\">data<\/span><span class=\"pi\">:<\/span>\n  <span class=\"s\">prometheus.yml<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|-<\/span>\n    <span class=\"no\">global:<\/span>\n      <span class=\"no\">scrape_interval: 15s<\/span>\n    <span class=\"no\">scrape_configs:<\/span>\n    <span class=\"no\">- job_name: 'grok'<\/span>\n      <span class=\"no\">static_configs:<\/span>\n      <span class=\"no\">- targets: ['grok-exporter:9144']<\/span><\/code><\/pre><\/figure>\n\n<p>Prometheus will collect information from the grok-exporter service every 15 seconds.<\/p>\n\n<h4 id=\"prometheus-deployment\">Prometheus Deployment<\/h4>\n\n<p>In Prometheus deployment config We have to mount created a moment ago config map as a file inside <code class=\"highlighter-rouge\">\/etc\/prometheus<\/code>:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-yaml\" data-lang=\"yaml\"> \n<span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">apps\/v1<\/span>\n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deployment<\/span>\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">prometheus<\/span>\n<span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">selector<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">matchLabels<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">prometheus<\/span>\n  <span class=\"na\">replicas<\/span><span class=\"pi\">:<\/span> <span class=\"s\">1<\/span>\n  <span class=\"na\">template<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">labels<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">prometheus<\/span>\n    <span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">containers<\/span><span class=\"pi\">:<\/span>\n        <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">prometheus<\/span>\n          <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">prom\/prometheus:v2.12.0<\/span>\n          <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\n            <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">web<\/span>\n              <span class=\"na\">containerPort<\/span><span class=\"pi\">:<\/span> <span class=\"s\">9090<\/span>\n          <span class=\"na\">volumeMounts<\/span><span class=\"pi\">:<\/span>\n            <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">prometheus-config<\/span>\n              <span class=\"na\">mountPath<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/etc\/prometheus<\/span>\n            <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">prometheus-data<\/span>\n              <span class=\"na\">mountPath<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/prometheus<\/span>\n            <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\n                <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">prometheus-data<\/span>\n          <span class=\"na\">emptyDir<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">{}<\/span>\n                    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">prometheus-config<\/span>\n          <span class=\"na\">configMap<\/span><span class=\"pi\">:<\/span>\n                  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">prometheus<\/span><\/code><\/pre><\/figure>\n\n<h4 id=\"prometheus-service\">Prometheus Service<\/h4>\n\n<p>To acces the Prometheus GUI over an IP\/DNS, we need to expose it as a  service:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-yaml\" data-lang=\"yaml\"> \n<span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">v1<\/span>\n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Service<\/span>\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">prometheus<\/span>\n  <span class=\"na\">labels<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">prometheus<\/span>\n<span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">selector<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">prometheus<\/span>\n  <span class=\"na\">type<\/span><span class=\"pi\">:<\/span> <span class=\"s\">NodePort<\/span>\n  <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"na\">protocol<\/span><span class=\"pi\">:<\/span> <span class=\"s\">TCP<\/span>\n      <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">web<\/span>\n      <span class=\"na\">nodePort<\/span><span class=\"pi\">:<\/span> <span class=\"s\">31199<\/span>\n      <span class=\"na\">port<\/span><span class=\"pi\">:<\/span> <span class=\"s\">9090<\/span>\n      <span class=\"na\">targetPort<\/span><span class=\"pi\">:<\/span> <span class=\"s\">9090<\/span><\/code><\/pre><\/figure>\n\n<h3 id=\"summary\">Summary<\/h3>\n\n<p>Now we can access the Prometheus dashboard using kubectl port-forward <pod name=\"\"> 9090:9090. You should see the Prometheus dashboard with scraped data:<\/pod><\/p>\n\n<p><img src=\"\/images\/prometheus-kubernetes\/scraped-data.JPG\" alt=\"kubernetes-login\" \/><\/p>\n\n<p>Thank you for reading! I hope you enjoyed the post.<\/p>","author":{"name":"Michal Fabjanski"},"summary":"In previous post, you have looked into Prometheus basics. In this part, it is time to create Prometheus service on the Kubernetes which can scrape metrics from additional metric exporter. It\u2019s the perfect solution when you can\u2019t export metrics from the application source code and your application logs the information you want to expose as metrics."},{"title":"A quick introduction to Prometheus. Metrics on Kubernetes with grok exporter - Part 1","link":{"@attributes":{"href":"https:\/\/www.devdiaries.net\/blog\/Prometheus-On-Kubernetes-Part-1\/","rel":"alternate","type":"text\/html","title":"A quick introduction to Prometheus. Metrics on Kubernetes with grok exporter - Part 1"}},"published":"2019-08-21T00:00:00+00:00","updated":"2019-08-21T00:00:00+00:00","id":"https:\/\/www.devdiaries.net\/blog\/Prometheus-On-Kubernetes-Part-1","content":"<p>Prometheus is one of the most popular open-source systems for monitoring and alerting. Very often it is used to collect data from microservices in Kubernetes. In this series you will learn the main blocks of Prometheus: <strong>metrics and labels<\/strong>, <strong>push and pull<\/strong> information exchange. You will learn how to use Prometheus <strong>without changing the application code<\/strong>. We will generate metrics based on <strong>logs<\/strong> (in our case, performance logs).<\/p>\n\n<h3 id=\"prometheus-metrics-and-labels\">Prometheus metrics and labels<\/h3>\n\n<p>Metrics are the main concept of Prometheus. Instrumented applications expose them by HTTP endpoint or JMX. Prometheus \u201cscrapes\u201d and stores them in the time-series database. This means that it works very well in a distributed, cloud-native environment. All of the services are unburdened by a load on the monitoring system. <strong>Metric<\/strong> is an identifier of data collected by Prometheus. The <strong>metric<\/strong> specifies the general feature of a system that is measured - for example <code class=\"highlighter-rouge\">http_requests_total<\/code> - the total number of HTTP requests received. <strong>Labels<\/strong> can be added to each data point to specify which service this counter applies to:<\/p>\n\n<p>Imagine a request counter that looks like this:<\/p>\n\n<p><code class=\"highlighter-rouge\">http_requests_total{service=\"spring-app\"}<\/code><\/p>\n\n<p>There are many spring-app instances in the cluster so we should add another label - instance:<\/p>\n\n<p><code class=\"highlighter-rouge\">http_requests_total{service=\"spring-app\", instance=\"spring-app-1\"}<\/code><\/p>\n\n<p>We can add many other labels that accurately describe the request (HTTP method, endpoint, response HTTP status).  <strong>Metrics with good labels are key to the best use of Prometheus.<\/strong><\/p>\n\n<h3 id=\"metrics-types\">Metrics types<\/h3>\n\n<h4 id=\"counter\">Counter<\/h4>\n\n<p>It is the most popular metric type. <strong>Counter<\/strong> is an incremental value or zero (after initialization\/restart). It is most often used to measure the number of requests, errors.<\/p>\n\n<h4 id=\"gauge\">Gauge<\/h4>\n\n<p><strong>Gauge<\/strong> is the incremental\/decremental value that changes over time. It is used for memory or CPU usage statistics.<\/p>\n\n<h4 id=\"histogram\">Histogram<\/h4>\n\n<p>Metrics such as response time are most commonly monitored using <strong>histograms<\/strong>. Before starting measurements, we must first define the possible ranges of results. In the case of measuring the response time, it can be: below one second, between 1 second and 2 seconds, between 2 and 10 and above 10. Then we assign the observed value to the matching range.<\/p>\n\n<h4 id=\"summary\">Summary<\/h4>\n\n<p>The <strong>Summary<\/strong> type works very much like a histogram, but it is slightly more extensive, e.g. it stores information about the total number of observations.,<\/p>\n\n<h3 id=\"push-and-pull-prometheus-model\">Push and Pull Prometheus model<\/h3>\n\n<p>The monitoring system based on Prometheus can collect metrics in two main ways: <strong>push or pull<\/strong> models.<\/p>\n\n<h4 id=\"push\">Push<\/h4>\n\n<p>In push model applications are active and they are responsible for <strong>sending collected records to Prometheus<\/strong> via <strong>Pushgateway<\/strong>. This model works best for gathering information, e.g. with test results, or other cyclical tasks that can be performed irregularly and for a longer period.<\/p>\n\n<h4 id=\"pull\">Pull<\/h4>\n\n<p>In this model, the application is passive and only <strong>prepares its metrics in the form of an endpoint<\/strong>. Prometheus decides when to download them. This approach is recommended by application developers and should be used in most cases.<\/p>\n\n<h3 id=\"exposing-and-scraping-metrics\">Exposing and scraping metrics<\/h3>\n\n<p>Most languages have an implementation of Prometheus client with functionalities for:<\/p>\n\n<ul>\n  <li>\n    <p>Getting metrics for the language (JVM metrics, GC metrics, Go metrics)<\/p>\n  <\/li>\n  <li>\n    <p>Possibility to registry custom metrics<\/p>\n  <\/li>\n  <li>\n    <p>HTTP handler to create and expose metrics on the \/metrics endpoint<\/p>\n\n    <p>Prometheus scrapes each target regularly (the frequency of meter reading is set by <em>scrape interval<\/em> property)<\/p>\n  <\/li>\n<\/ul>\n\n<h3 id=\"exporting-metrics-using-side-cars-containers\">Exporting metrics using side-cars containers<\/h3>\n\n<p>Sometimes it is impossible to instrument application at the code level.  In this case, the best solution is to use exporters as <strong>side-car<\/strong> containers. The most popular are <a href=\"https:\/\/github.com\/prometheus\/node_exporter\">Node exporter<\/a> and <a href=\"https:\/\/github.com\/fstab\/grok_exporter\">Grok exporter<\/a> which can read system metrics (CPU, memory\u2026) and expose them for Prometheus.<\/p>\n\n<h3 id=\"summary-1\">Summary<\/h3>\n\n<p>You\u2019ve read the basics of Prometheus. You should have a better understanding of what Prometheus is and how it works. You will need this knowledge in the <a href=\"https:\/\/www.devdiaries.net\/blog\/Prometheus-On-Kubernetes-Part-2\/\">next post<\/a>. I will show you how to use Grok exporter to instrument Java application based on application logs.<\/p>","author":{"name":"Michal Fabjanski"},"summary":"Prometheus is one of the most popular open-source systems for monitoring and alerting. Very often it is used to collect data from microservices in Kubernetes. In this series you will learn the main blocks of Prometheus: metrics and labels, push and pull information exchange. You will learn how to use Prometheus without changing the application code. We will generate metrics based on logs (in our case, performance logs)."},{"title":"Single Node Kubernetes Cluster - Installing Ubuntu Server on Windiws with Hyper-V","link":{"@attributes":{"href":"https:\/\/www.devdiaries.net\/blog\/Single-Node-Kubernetes-Cluster-Part-1\/","rel":"alternate","type":"text\/html","title":"Single Node Kubernetes Cluster - Installing Ubuntu Server on Windiws with Hyper-V"}},"published":"2019-07-14T00:00:00+00:00","updated":"2019-07-14T00:00:00+00:00","id":"https:\/\/www.devdiaries.net\/blog\/Single-Node-Kubernetes-Cluster-Part-1","content":"<p>Today we will start playing with Kubernetes. We will start by installing Ubuntu 19.04 Server on the Hyper-V virtual machine. Next, we will create a <strong>single node Kubernetes cluster<\/strong>. You can also use <code class=\"highlighter-rouge\">Minikube<\/code> (a tool for running Kubernetes locally) for Windows instead of Ubuntu Server - but I wanted it to resemble a real development environment.<br \/>\nWe will use a ssh connection from windows to manage our cluster on Ubuntu Server.<\/p>\n\n<h3 id=\"requirements\">Requirements<\/h3>\n<ul>\n  <li>Internet connection on the system that has Hyper-V installed.<\/li>\n  <li>Hyper-V enabled<\/li>\n<\/ul>\n\n<h3 id=\"configuring-hyper-v-virtual-switch-manager\">Configuring Hyper-V Virtual Switch Manager<\/h3>\n<p>Your virtual machine will need access to your host windows\u2019 internet connection. To do this we must configure <strong>Virtual Switch Manager<\/strong>. <br \/>\nOpen the Hype-V panel and click on the \u201cVirtual Switch Manager\u201d:<br \/>\n<img src=\"\/images\/single-node-kubernetes\/network-switch.JPG\" alt=\"virtual-switch-manager\" \/><\/p>\n\n<ol>\n  <li>\n    <p>Create a new <strong>External<\/strong> Virtual Switch:<br \/>\n<img src=\"\/images\/single-node-kubernetes\/external-switch.JPG\" alt=\"virtual-switch-manager\" \/><\/p>\n  <\/li>\n  <li>\n    <p>Set a name and select your network adapter in the  <strong>External Network<\/strong> <img src=\"\/images\/single-node-kubernetes\/creating-virtual-switch.JPG\" alt=\"virtual-switch-manager\" \/><\/p>\n  <\/li>\n  <li>\n    <p>Go to <code class=\"highlighter-rouge\">Control Panel\\Network and Internet\\Network Connections<\/code>. You will see your newly created connection:<br \/>\n<img src=\"\/images\/single-node-kubernetes\/ubuntu-network-switch.JPG\" alt=\"virtual-switch-manager\" \/><\/p>\n  <\/li>\n  <li>\n    <p>Right-click your Windows connection (In my case it is Ethernet). Click <code class=\"highlighter-rouge\">Properties<\/code>, select <code class=\"highlighter-rouge\">Sharing<\/code> tab and check the box <em>All other network users to connect through this computers Internet connection.<\/em>:<br \/>\n<img src=\"\/images\/single-node-kubernetes\/network-adapter-sharing.JPG\" alt=\"virtual-switch-manager\" \/><\/p>\n  <\/li>\n<\/ol>\n\n<p>That\u2019s all. Now you should have Internet access in your virtual machine.<\/p>\n\n<h3 id=\"creating-hyper-v-virtual-machine\">Creating Hyper-V virtual machine<\/h3>\n<p>Now we can create VM with Ubuntu 19.04:<\/p>\n<ol>\n  <li>Open Start<\/li>\n  <li>Search for Hyper-V Manager<\/li>\n  <li>Select <code class=\"highlighter-rouge\">New<\/code> and click on <code class=\"highlighter-rouge\">Virtual Machine<\/code>:<br \/>\n<img src=\"\/images\/single-node-kubernetes\/create-virtal-machine.JPG\" alt=\"virtual-switch-manager\" \/><\/li>\n  <li>Choose a name, leave the default Generation 1 option and click <code class=\"highlighter-rouge\">next<\/code>.<\/li>\n  <li>Select the amount of RAM. I set 8192MB<\/li>\n  <li>Select the virtual switch which you created earlier: <br \/>\n<img src=\"\/images\/single-node-kubernetes\/switch-select.JPG\" alt=\"virtual-switch-manager\" \/><\/li>\n  <li>On the <code class=\"highlighter-rouge\">Connect virtual hard disk<\/code> tab you can set disk size. I allocated 25Gb.<\/li>\n  <li>On the <code class=\"highlighter-rouge\">Installation options<\/code> tab select <strong>Install an operating system from a bootable CD\/DVD-ROM<\/strong> option and provide a path for the Ubuntu ISO file. Click next and finish.<\/li>\n<\/ol>\n\n<h3 id=\"installing-ubuntu-1904-server-using-hyper-v-virtual-machine\">Installing Ubuntu 19.04 Server using Hyper-V Virtual Machine<\/h3>\n<p>We have prepared a virtual switch and a virtual machine. Now we can install Ubuntu.<\/p>\n<ol>\n  <li>Open Hyper-V, right-click the newly created Virtual machine (in my case name is Ubuntu). Select <code class=\"highlighter-rouge\">Connect<\/code>.<br \/>\n<img src=\"\/images\/single-node-kubernetes\/conenct-to-vm.JPG\" alt=\"virtual-switch-manager\" \/><\/li>\n  <li>Click the <code class=\"highlighter-rouge\">Start<\/code>:<br \/>\n<img src=\"\/images\/single-node-kubernetes\/start-vm.JPG\" alt=\"virtual-switch-manager\" \/><\/li>\n  <li>Click the <code class=\"highlighter-rouge\">Install Ubuntu Server<\/code>:<br \/>\n<img src=\"\/images\/single-node-kubernetes\/install-ubuntu.JPG\" alt=\"virtual-switch-manager\" \/><\/li>\n  <li>Leave default values in the next steps<\/li>\n  <li>Enter the username and password to your account<\/li>\n  <li>Set  <code class=\"highlighter-rouge\">Install OpenSSH server<\/code>:<br \/>\n<img src=\"\/images\/single-node-kubernetes\/ssh.JPG\" alt=\"virtual-switch-manager\" \/><\/li>\n  <li>Restart the virtual machine to finish the setup.<\/li>\n<\/ol>\n\n<p>To connect to a ubuntu server in a virtual machine go to the Hyper-V -&gt; Virtual Machines. Right-click on the virtual machine and then click on <code class=\"highlighter-rouge\">Connect<\/code>.<br \/>\n<img src=\"\/images\/single-node-kubernetes\/ubuntu-vm.JPG\" alt=\"virtual-switch-manager\" \/><\/p>\n\n<h3 id=\"connecting-to-hyper-v-ubuntu-virtual-machine-via-ssh\">Connecting to Hyper-V Ubuntu Virtual Machine via SSH<\/h3>\n<p>In next posts, we will connect to the virtual machine via SSH. We will need two programs:<\/p>\n<ul>\n  <li><a href=\"https:\/\/www.chiark.greenend.org.uk\/~sgtatham\/putty\/latest.html\">Putty<\/a> - a free SSH client<\/li>\n  <li><a href=\"https:\/\/winscp.net\/eng\/download.php\">WinSCP<\/a> - a popular free SFTP client for Windows. We will use it to transfer files to the virtual machine.<\/li>\n<\/ul>\n\n<p>To connect to a virtual machine, run the ubuntu server in Hyper-V. After starting Ubuntu, enter the command in the terminal:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\"> \nifconfig<\/code><\/pre><\/figure>\n\n<p>Copy inet IP and use it in Putty \/ WinSCP to connect to VM:\n<img src=\"\/images\/single-node-kubernetes\/inet-ip.JPG\" alt=\"virtual-switch-manager\" \/><\/p>\n\n<p>Use the default settings and default port 22:<\/p>\n\n<p><img src=\"\/images\/single-node-kubernetes\/putty-connection.JPG\" alt=\"virtual-switch-manager\" \/><\/p>\n\n<p>Enter the user login and password you set during the Ubuntu installation to connect:\n<img src=\"\/images\/single-node-kubernetes\/putty-login.JPG\" alt=\"virtual-switch-manager\" \/><\/p>\n\n<p>After entering login details and clicking enter - you will get access to the Ubuntu Server in your Putty terminal.<\/p>\n\n<p><img src=\"\/images\/single-node-kubernetes\/ubuntu-logged.JPG\" alt=\"virtual-switch-manager\" \/><\/p>\n\n<p>Connection via WinSCP looks the same as in the case of Putty.<\/p>\n\n<p>We already have a prepared environment. <a href=\"https:\/\/www.devdiaries.net\/blog\/Single-Node-Kubernetes-Cluster-Part-2\/\">In the next post<\/a>, we will set and configure a Kubernetes cluster.<\/p>","author":{"name":"Michal Fabjanski"},"summary":"Today we will start playing with Kubernetes. We will start by installing Ubuntu 19.04 Server on the Hyper-V virtual machine. Next, we will create a single node Kubernetes cluster. You can also use Minikube (a tool for running Kubernetes locally) for Windows instead of Ubuntu Server - but I wanted it to resemble a real development environment. We will use a ssh connection from windows to manage our cluster on Ubuntu Server. Requirements Internet connection on the system that has Hyper-V installed. Hyper-V enabled Configuring Hyper-V Virtual Switch Manager Your virtual machine will need access to your host windows\u2019 internet connection. To do this we must configure Virtual Switch Manager. Open the Hype-V panel and click on the \u201cVirtual Switch Manager\u201d: Create a new External Virtual Switch: Set a name and select your network adapter in the External Network Go to Control Panel\\Network and Internet\\Network Connections. You will see your newly created connection: Right-click your Windows connection (In my case it is Ethernet). Click Properties, select Sharing tab and check the box All other network users to connect through this computers Internet connection.: That\u2019s all. Now you should have Internet access in your virtual machine. Creating Hyper-V virtual machine Now we can create VM with Ubuntu 19.04: Open Start Search for Hyper-V Manager Select New and click on Virtual Machine: Choose a name, leave the default Generation 1 option and click next. Select the amount of RAM. I set 8192MB Select the virtual switch which you created earlier: On the Connect virtual hard disk tab you can set disk size. I allocated 25Gb. On the Installation options tab select Install an operating system from a bootable CD\/DVD-ROM option and provide a path for the Ubuntu ISO file. Click next and finish. Installing Ubuntu 19.04 Server using Hyper-V Virtual Machine We have prepared a virtual switch and a virtual machine. Now we can install Ubuntu. Open Hyper-V, right-click the newly created Virtual machine (in my case name is Ubuntu). Select Connect. Click the Start: Click the Install Ubuntu Server: Leave default values in the next steps Enter the username and password to your account Set Install OpenSSH server: Restart the virtual machine to finish the setup. To connect to a ubuntu server in a virtual machine go to the Hyper-V -&gt; Virtual Machines. Right-click on the virtual machine and then click on Connect."},{"title":"Single Node Kubernetes Cluster - Installing Docker and Kubernetes on Ubuntu Server","link":{"@attributes":{"href":"https:\/\/www.devdiaries.net\/blog\/Single-Node-Kubernetes-Cluster-Part-2\/","rel":"alternate","type":"text\/html","title":"Single Node Kubernetes Cluster - Installing Docker and Kubernetes on Ubuntu Server"}},"published":"2019-07-14T00:00:00+00:00","updated":"2019-07-14T00:00:00+00:00","id":"https:\/\/www.devdiaries.net\/blog\/Single-Node-Kubernetes-Cluster-Part-2","content":"<p><a href=\"https:\/\/www.devdiaries.net\/blog\/Single-Node-Kubernetes-Cluster-Part-1\/\">In the previous post<\/a>, we have prepared an environment for work. Now we will be installing and configuring Docker and Kubernetes on our Ubuntu Server.<\/p>\n\n<h3 id=\"installing-docker-and-kubernetes-on-ubuntu-server\">Installing Docker and Kubernetes on Ubuntu Server<\/h3>\n<p>Let\u2019s start with turning on the VM with Ubuntu Server and connecting via SSH to the machine (I described this in the previous post). \nFirst, use the following commands to install Docker:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">   \ncurl <span class=\"nt\">-fsSL<\/span> https:\/\/download.docker.com\/linux\/ubuntu\/gpg | <span class=\"nb\">sudo <\/span>apt-key add -\n\n<span class=\"nb\">sudo <\/span>add-apt-repository <span class=\"s2\">\"deb [arch=amd64] https:\/\/download.docker.com\/linux\/ubuntu <\/span><span class=\"k\">$(<\/span>lsb_release <span class=\"nt\">-cs<\/span><span class=\"k\">)<\/span><span class=\"s2\"> stable\"<\/span>\n\n<span class=\"nb\">sudo <\/span>apt update <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">sudo <\/span>apt <span class=\"nb\">install <\/span>docker-ce<\/code><\/pre><\/figure>\n\n<p>Then use the following commands to install Kubernetes:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">   \n\n<span class=\"nb\">sudo <\/span>apt-get update <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">sudo <\/span>apt-get <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> apt-transport-https <span class=\"o\">&amp;&amp;<\/span> curl <span class=\"nt\">-s<\/span> https:\/\/packages.cloud.google.com\/apt\/doc\/apt-key.gpg | <span class=\"nb\">sudo <\/span>apt-key add -\n\n<span class=\"nb\">echo<\/span> <span class=\"s2\">\"deb http:\/\/apt.kubernetes.io\/ kubernetes-xenial main\"<\/span> | <span class=\"nb\">sudo tee<\/span> <span class=\"nt\">-a<\/span> \/etc\/apt\/sources.list.d\/kubernetes.list <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">sudo <\/span>apt-get update\n\n<span class=\"nb\">sudo <\/span>apt <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> kubeadm  kubelet kubernetes-cni<\/code><\/pre><\/figure>\n\n<p>In the end, turn off the swap on Ubuntu Server because it is required in the <a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/master\/CHANGELOG-1.8.md#before-upgrading\">changelog<\/a>:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">   \n\n<span class=\"nb\">sudo <\/span>swapoff <span class=\"nt\">-a<\/span>\n\n<span class=\"nb\">sudo sed<\/span> <span class=\"nt\">-i<\/span> <span class=\"s1\">'\/ swap \/ s\/^\\(.*\\)$\/#\\1\/g'<\/span> \/etc\/fstab<\/code><\/pre><\/figure>\n\n<p>That\u2019s all. Check if Docker and Kubernetes were installed using the commands:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">   \ndocker <span class=\"nt\">-v<\/span><\/code><\/pre><\/figure>\n\n<p>and:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">   \nkubectl version<\/code><\/pre><\/figure>\n\n<p>You should see a similar result:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">   \nmichal@michal:~<span class=\"nv\">$ <\/span>docker <span class=\"nt\">-v<\/span>\nDocker version 18.09.7, build 2d0083d\nmichal@michal:~<span class=\"nv\">$ <\/span>kubectl version\nClient Version: version.Info<span class=\"o\">{<\/span>Major:<span class=\"s2\">\"1\"<\/span>, Minor:<span class=\"s2\">\"15\"<\/span>, GitVersion:<span class=\"s2\">\"v1.15.0\"<\/span>, GitCommit:<span class=\"s2\">\"e8462b5b5dc2584fdcd18e6bcfe9f1e4d970a529\"<\/span>, GitTreeState:<span class=\"s2\">\"clean\"<\/span>, BuildDate:<span class=\"s2\">\"2019-06-19T16:40:16Z\"<\/span>, GoVersion:<span class=\"s2\">\"go1.12.5\"<\/span>, Compiler:<span class=\"s2\">\"gc\"<\/span>, Platform:<span class=\"s2\">\"linux\/amd64\"<\/span><span class=\"o\">}<\/span><\/code><\/pre><\/figure>\n\n<h3 id=\"creating-single-node-kubernetes-cluster-with-kubeadm\">Creating Single Node Kubernetes Cluster with Kubeadm<\/h3>\n<p>We will use <strong>kubeadm<\/strong> which helps bootstrap Kubernetes cluster. Detailed documentation is available on the  <a href=\"https:\/\/kubernetes.io\/docs\/setup\/production-environment\/tools\/kubeadm\/create-cluster-kubeadm\/\">kubernetes website<\/a>. I will present some of the most important steps that will create a working cluster in a few minutes.<\/p>\n\n<p>At the beginning, install kubectl using the following command:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">   \n<span class=\"nb\">sudo <\/span>apt-get update <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">sudo <\/span>apt-get <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> apt-transport-https <span class=\"o\">&amp;&amp;<\/span> curl <span class=\"nt\">-s<\/span> https:\/\/packages.cloud.google.com\/apt\/doc\/apt-key.gpg | <span class=\"nb\">sudo <\/span>apt-key add -\n<span class=\"nb\">echo<\/span> <span class=\"s2\">\"deb http:\/\/apt.kubernetes.io\/ kubernetes-xenial main\"<\/span> | <span class=\"nb\">sudo tee<\/span> <span class=\"nt\">-a<\/span> \/etc\/apt\/sources.list.d\/kubernetes.list <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">sudo <\/span>apt-get update\n<span class=\"nb\">sudo <\/span>apt <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> kubeadm  kubelet kubernetes-cni<\/code><\/pre><\/figure>\n\n<p>Now we can create a <strong>single node cluster<\/strong>:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">   \n<span class=\"nb\">sudo <\/span>kubeadm init <span class=\"nt\">--pod-network-cidr<\/span><span class=\"o\">=<\/span>10.244.0.0\/16 <span class=\"nt\">--apiserver-advertise-address<\/span><span class=\"o\">=<\/span>192.168.0.129 <span class=\"nt\">--ignore-preflight-errors<\/span><span class=\"o\">=<\/span>NumCPU<\/code><\/pre><\/figure>\n\n<p>Remember to change \u2013<strong>apiserver-advertise-address<\/strong>=192.168.0.129 with your VM inet address. If you do not know how to check inet IP - <a href=\"https:\/\/devdiaries.net\/\/blog\/Single-Node-Kubernetes-Cluster-Part-1\/#connecting-to-hyper-v-ubuntu-virtual-machine-via-ssh\">read the instructions from the previous post<\/a>.\nAfter a few minutes of installation, you should see the message:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\"> \n\nYour Kubernetes control-plane has initialized successfully!\n\nTo start using your cluster, you need to run the following as a regular user:\n\n  <span class=\"nb\">mkdir<\/span> <span class=\"nt\">-p<\/span> <span class=\"nv\">$HOME<\/span>\/.kube\n  <span class=\"nb\">sudo cp<\/span> <span class=\"nt\">-i<\/span> \/etc\/kubernetes\/admin.conf <span class=\"nv\">$HOME<\/span>\/.kube\/config\n  <span class=\"nb\">sudo chown<\/span> <span class=\"k\">$(<\/span><span class=\"nb\">id<\/span> <span class=\"nt\">-u<\/span><span class=\"k\">)<\/span>:<span class=\"k\">$(<\/span><span class=\"nb\">id<\/span> <span class=\"nt\">-g<\/span><span class=\"k\">)<\/span> <span class=\"nv\">$HOME<\/span>\/.kube\/config\n\nYou should now deploy a pod network to the cluster.\nRun <span class=\"s2\">\"kubectl apply -f [podnetwork].yaml\"<\/span> with one of the options listed at:\n  https:\/\/kubernetes.io\/docs\/concepts\/cluster-administration\/addons\/\n\nThen you can <span class=\"nb\">join <\/span>any number of worker nodes by running the following on each as root:\nkubeadm <span class=\"nb\">join <\/span>192.168.0.129:6443 <span class=\"nt\">--token<\/span> mc3oxw.8mkdwlr260ujpy6a <span class=\"se\">\\<\/span>\n    <span class=\"nt\">--discovery-token-ca-cert-hash<\/span> sha256:fbb8705c4826ece8596ee4eb14d0375677fed231bc2a3e78326bd46f3bb1f24e<\/code><\/pre><\/figure>\n\n<p>In order for Kubernetes to work for a non-root user, you must run the following commands:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">   \n<span class=\"nb\">mkdir<\/span> <span class=\"nv\">$HOME<\/span>\/.k8s\n\n<span class=\"nb\">sudo cp<\/span> \/etc\/kubernetes\/admin.conf <span class=\"nv\">$HOME<\/span>\/.k8s\/\n\n<span class=\"nb\">sudo chown<\/span> <span class=\"k\">$(<\/span><span class=\"nb\">id<\/span> <span class=\"nt\">-u<\/span><span class=\"k\">)<\/span>:<span class=\"k\">$(<\/span><span class=\"nb\">id<\/span> <span class=\"nt\">-g<\/span><span class=\"k\">)<\/span> <span class=\"nv\">$HOME<\/span>\/.k8s\/admin.conf\n\n<span class=\"nb\">export <\/span><span class=\"nv\">KUBECONFIG<\/span><span class=\"o\">=<\/span><span class=\"nv\">$HOME<\/span>\/.k8s\/admin.conf\n\n<span class=\"nb\">echo<\/span> <span class=\"s2\">\"export KUBECONFIG=<\/span><span class=\"nv\">$HOME<\/span><span class=\"s2\">\/.k8s\/admin.conf\"<\/span> | <span class=\"nb\">tee<\/span> <span class=\"nt\">-a<\/span> ~\/.bashrc<\/code><\/pre><\/figure>\n\n<h4 id=\"configuring-kubernetes-cluster-networking\">Configuring Kubernetes Cluster Networking<\/h4>\n<p>After kubernetes installation, we need to configure networking. This is detailed in the <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/cluster-administration\/networking\/\">documentation <\/a>.\nExecute two commands to set the networking:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">   \nkubectl apply <span class=\"nt\">-f<\/span> https:\/\/raw.githubusercontent.com\/coreos\/flannel\/master\/Documentation\/kube-flannel.yml\n\nkubectl apply <span class=\"nt\">-f<\/span> https:\/\/raw.githubusercontent.com\/coreos\/flannel\/master\/Documentation\/k8s-manifests\/kube-flannel-rbac.yml<\/code><\/pre><\/figure>\n\n<h4 id=\"master-node-as-a-worker\">Master Node as a Worker<\/h4>\n<p>Finally, we have to use the <code class=\"highlighter-rouge\">kubectl taint command<\/code>, so that our master node can create pods and be used as a worker node:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">   \nkubectl taint nodes <span class=\"nt\">--all<\/span> node-role.kubernetes.io\/master-<\/code><\/pre><\/figure>\n\n<h3 id=\"summary\">Summary<\/h3>\n<p>That\u2019s all! We have created a working single node cluster. <a href=\"https:\/\/www.devdiaries.net\/blog\/Single-Node-Kubernetes-Cluster-Part-3\/\">In the next post<\/a>, I will show you how to create an admin dashboard in Kubernetes to be able to easily manage a cluster from the browser.<\/p>","author":{"name":"Michal Fabjanski"},"summary":"In the previous post, we have prepared an environment for work. Now we will be installing and configuring Docker and Kubernetes on our Ubuntu Server. Installing Docker and Kubernetes on Ubuntu Server Let\u2019s start with turning on the VM with Ubuntu Server and connecting via SSH to the machine (I described this in the previous post). First, use the following commands to install Docker: curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo apt-key add -"},{"title":"Single Node Kubernetes Cluster - Deploying Kubernetes Dashboard","link":{"@attributes":{"href":"https:\/\/www.devdiaries.net\/blog\/Single-Node-Kubernetes-Cluster-Part-3\/","rel":"alternate","type":"text\/html","title":"Single Node Kubernetes Cluster - Deploying Kubernetes Dashboard"}},"published":"2019-07-14T00:00:00+00:00","updated":"2019-07-14T00:00:00+00:00","id":"https:\/\/www.devdiaries.net\/blog\/Single-Node-Kubernetes-Cluster-Part-3","content":"<p><a href=\"https:\/\/www.devdiaries.net\/blog\/Single-Node-Kubernetes-Cluster-Part-2\/\">In the previous post<\/a>, we have prepared an environment for work and installed Kubernetes and Docker. Now, we will deploy <strong>Kubernetes Dashboard<\/strong>.<\/p>\n\n<h3 id=\"deploy-kubernetes-dashboard\">Deploy Kubernetes Dashboard<\/h3>\n<p>Kubernetes Dashboard is web-based UI for Kbuernetes clusters. It allows to manage applications deployed in the cluster. Dashboard documentation is available at <a href=\"https:\/\/github.com\/kubernetes\/dashboard\">Kubernetes Github repo<\/a>.\nUse the following command to deploy the dashboard on the cluster:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">     \nkubectl apply <span class=\"nt\">-f<\/span> kubectl apply <span class=\"nt\">-f<\/span> https:\/\/raw.githubusercontent.com\/kubernetes\/dashboard\/v1.10.1\/src\/deploy\/recommended\/kubernetes-dashboard.yaml<\/code><\/pre><\/figure>\n\n<p>To access Dashboard from your Ubuntu you must create a secure channel to your Kubernetes cluster. Run the following command:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">kubectl proxy<\/code><\/pre><\/figure>\n\n<p>Now check in the new Putty window if dashboard is properly exposed:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">curl <span class=\"nt\">-I<\/span> 127.0.0.1:8001<\/code><\/pre><\/figure>\n\n<p>You should see 200 OK Http response:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">michal@michal:~<span class=\"nv\">$ <\/span>curl <span class=\"nt\">-I<\/span> 127.0.0.1:8001\nHTTP\/1.1 200 OK\nContent-Length: 2738\nContent-Type: application\/json\nDate: Sun, 14 Jul 2019 10:07:39 GMT<\/code><\/pre><\/figure>\n\n<h3 id=\"proxy-to-host-windows\">Proxy to host Windows<\/h3>\n<p>We will use the Windows browser to manage the cluster. To enable this run the following command in Ubuntu terminal:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">kubectl proxy <span class=\"nt\">--address<\/span> 192.168.0.129 <span class=\"nt\">--accept-hosts<\/span> <span class=\"s1\">'^.*$'<\/span> <span class=\"nt\">--port<\/span><span class=\"o\">=<\/span>8001<\/code><\/pre><\/figure>\n\n<p>And go to <a href=\"http:\/\/192.168.0.129:8001\/api\/v1\/namespaces\/kube-system\/services\/https:kubernetes-dashboard:\/proxy\/#!\/login\">http:\/\/192.168.0.129:8001\/api\/v1\/namespaces\/kube-system\/services\/https:kubernetes-dashboard:\/proxy\/#!\/login<\/a> in your browser on windows. You should have seen the dashboard login screen. Please remember to <strong>change my inet IP adrress 192.168.0.129 with your VM\u2019s inet IP address<\/strong>. \n<img src=\"\/images\/single-node-kubernetes\/kubernetes-login.JPG\" alt=\"kubernetes-login\" \/><\/p>\n\n<h3 id=\"creating-a-service-account-and-a-role-binding-in-kubernetes\">Creating a service account and a role binding in Kubernetes<\/h3>\n<p>To log in to our dashboard we need a service accout and a role binding. To create a service account, use the following command:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">kubectl create serviceaccount <span class=\"nt\">--namespace<\/span> kube-system admin-user<\/code><\/pre><\/figure>\n\n<p>And for role binding:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">kubectl create clusterrolebinding admin-user <span class=\"nt\">--clusterrole<\/span><span class=\"o\">=<\/span>cluster-admin <span class=\"nt\">--serviceaccount<\/span><span class=\"o\">=<\/span>kube-system:admin-user<\/code><\/pre><\/figure>\n\n<h3 id=\"sign-in-to-kubernetes-dashboard\">Sign in to Kubernetes Dashboard<\/h3>\n<p>There are several ways to log into the dashboard. We can genereate JWT token:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">kubectl <span class=\"nt\">-n<\/span> kube-system describe secret <span class=\"k\">$(<\/span>kubectl <span class=\"nt\">-n<\/span> kube-system get secret | <span class=\"nb\">grep <\/span>admin-user | <span class=\"nb\">awk<\/span> <span class=\"s1\">'{print $1}'<\/span><span class=\"k\">)<\/span><\/code><\/pre><\/figure>\n\n<p>Copy generated token and use it when logging in to the dashboard:\n<img src=\"\/images\/single-node-kubernetes\/kubernetes-token.JPG\" alt=\"kubernetes-login\" \/><\/p>\n\n<p>Unfortunately, dashboard is only available via localhost. We can not log into the dashboard from the host system (Windows):<\/p>\n\n<blockquote>\n  <p>Dashboard should not be exposed publicly using kubectl proxy command\nas it only allows HTTP connection. For domains other than localhost\nand 127.0.0.1 it will not be possible to sign in. Nothing will happen\nafter clicking Sign in button on login page.<\/p>\n<\/blockquote>\n\n<p>So, we can create SSH tunnel or enable skip loging. I chose the second option:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">kubectl edit deployment\/kubernetes-dashboard <span class=\"nt\">--namespace<\/span><span class=\"o\">=<\/span>kube-system<\/code><\/pre><\/figure>\n\n<p>Add <code class=\"highlighter-rouge\">--enable-skip-login<\/code> to the deployment\u2019s command line arguments:<\/p>\n\n<figure class=\"highlight\"><pre><code class=\"language-sh\" data-lang=\"sh\">      containers:\n      - args:\n        - <span class=\"nt\">--auto-generate-certificates<\/span>\n        - <span class=\"nt\">--enable-skip-login<\/span>            <span class=\"c\"># &lt;-- add this line<\/span><\/code><\/pre><\/figure>\n\n<p><img src=\"\/images\/single-node-kubernetes\/enable-skip-login.JPG\" alt=\"kubernetes-login\" \/><\/p>\n\n<p>Now refresh the dashboard and click on the \u201cskip\u201d button. You will be correctly logged into the dashboard:\n<img src=\"\/images\/single-node-kubernetes\/kubernetes-dashboard.JPG\" alt=\"kubernetes-login\" \/><\/p>\n\n<h3 id=\"summary\">Summary<\/h3>\n<p>We have already configured a single node cluster and a dashboard thanks. Now you can manage your applications in Kubernetes. If you have any problems, I invite you to comment.<\/p>","author":{"name":"Michal Fabjanski"},"summary":"In the previous post, we have prepared an environment for work and installed Kubernetes and Docker. Now, we will deploy Kubernetes Dashboard. Deploy Kubernetes Dashboard Kubernetes Dashboard is web-based UI for Kbuernetes clusters. It allows to manage applications deployed in the cluster. Dashboard documentation is available at Kubernetes Github repo. Use the following command to deploy the dashboard on the cluster: kubectl apply -f kubectl apply -f https:\/\/raw.githubusercontent.com\/kubernetes\/dashboard\/v1.10.1\/src\/deploy\/recommended\/kubernetes-dashboard.yaml"}]}