Rick

Rick
Rick

Monday, January 14, 2013

Java Guide to Go Programming article 2: Inheritance

If you are just tuning in, I thought it would be instructive if I demonstrated new Go Programming Features by comparing them to Java code features. This way if you are new to Go Programming, you can pick up the concepts quickly without tons of explanation (this links to the first article)

In the first article, we had just the Employee class with getter/setter methods. We implemented it in idiomatic Java and then again in idiomatic Go. Now let's continue our employee example in Java and Go. First Java.

Java Employee

/java-examples/src/com/example/inheritance/Employee.java
package com.example.inheritance;

public class Employee {
 protected String firstName;
 protected String lastName;
 protected int age;
 protected boolean current;

 public Employee(String firstName, String lastName, int age, boolean current) {
  this.firstName = firstName;
  this.lastName = lastName;
  this.age = age;
  this.current = current;
 }

 public String getFirstName() {
  return firstName;
 }

 public String getLastName() {
  return lastName;
 }

 public int getAge() {
  return age;
 }

 public boolean isCurrent() {
  return current;
 }

 public void setLastName(String lastName) {
  this.lastName = lastName;
 }

 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }

 public void setAge(int age) {
  this.age = age;
 }

 public void setCurrent(boolean current) {
  this.current = current;
 }

 @Override
 public String toString() {
  return "Employee [firstName=" + firstName + ", lastName=" + lastName
    + ", age=" + age + ", current=" + current + "]";
 }

}

Go Employee

/examples/src/example/inheritance/employee.go
package inheritance

import "strconv"

type Employee struct {
 firstName string
 lastName  string
 age       int
 current   bool
}

func NewEmployee(firstName string, lastName string, age int, current bool) *Employee {
 return &Employee{firstName, lastName, age, current}
}

func (this *Employee) FirstName() string {
 return this.firstName
}

func (this *Employee) LastName() string {
 return this.lastName
}

func (this *Employee) Age() int {
 return this.age
}

func (this *Employee) Current() bool {
 return this.current
}

func (this *Employee) SetFirstName(name string) {
 this.firstName = name
}

func (this *Employee) SetLastName(name string) {
 this.lastName = name
}

func (this *Employee) SetAge(newAge int) {
 this.age = newAge
}

func (this *Employee) SetCurrent(current bool) {
 this.current = current
}

func (this *Employee) String() string {
 return "Employee [firstName=" + this.firstName + ", lastName=" + this.lastName +
  ", age=" + strconv.Itoa(this.age) + ", current=" + strconv.FormatBool(this.current) + "]"
}

Java HourlyEmployee

/java-examples/src/com/example/inheritance/HourlyEmployee.java
package com.example.inheritance;

public class HourlyEmployee extends Employee {

 private double hourlyRate;

 public HourlyEmployee(String firstName, String lastName, int age,
   boolean current, double commisionRate) {
  super(firstName, lastName, age, current);
  this.hourlyRate = commisionRate;
 }

 public double getHourlyRate() {
  return hourlyRate;
 }

 public void setHourlyRate(double hourlyRate) {
  this.hourlyRate = hourlyRate;
 }

 @Override
 public String toString() {
  return "HourlyEmployee [firstName=" + firstName + ", lastName="
    + lastName + ", age=" + age + ", current=" + current
    + ", hourlyRate=" + hourlyRate + "]";
 }

}

Go HourlyEmployee

/examples/src/example/inheritance/hourly.go
package inheritance

import "strconv"

type HourlyEmployee struct {
 Employee
 hourlyRate float64
}

func NewHourlyEmployee(firstName string, lastName string, age int, current bool, hourlyRate float64) *HourlyEmployee {
 newEmp := new(HourlyEmployee)
 newEmp.hourlyRate = hourlyRate
 newEmp.firstName = firstName
 newEmp.lastName = lastName
 newEmp.age = age
 newEmp.current = current
 return newEmp
}

func (this *HourlyEmployee) HourlyRate() float64 {
 return this.hourlyRate
}

func (this *HourlyEmployee) SetHourlyRate(rate float64) {
 this.hourlyRate = rate
}

func (this *HourlyEmployee) String() string {
 return "HourlyEmployee [firstName=" + this.firstName + ", lastName=" + this.lastName +
  ", age=" + strconv.Itoa(this.age) + ", current=" + strconv.FormatBool(this.current) +
  ", hourlyRate=" + strconv.FormatFloat(float64(this.hourlyRate), 'f', 2, 32) + "]"
}

Java SalaryEmployee

/java-examples/src/com/example/inheritance/SalaryEmployee.java
package com.example.inheritance;

public class SalaryEmployee extends Employee {

 private double commisionRate;

 public SalaryEmployee(String firstName, String lastName, int age,
   boolean current, double commisionRate) {
  super(firstName, lastName, age, current);
  this.commisionRate = commisionRate;
 }

 public double getCommisionRate() {
  return commisionRate;
 }

 public void setCommisionRate(double commisionRate) {
  this.commisionRate = commisionRate;
 }

 @Override
 public String toString() {
  return "SalaryEmployee [firstName=" + firstName + ", lastName="
    + lastName + ", age=" + age + ", current=" + current
    + ", commisionRate=" + commisionRate + "]";
 }

}

Go SalaryEmployee

/examples/src/example/inheritance/salary.go
package inheritance

import "strconv"

type SalaryEmployee struct {
 Employee
 commisionRate float64
}

func NewSalaryEmployee(firstName string, lastName string, age int, current bool, commisionRate float64) *SalaryEmployee {
 newEmp := new(SalaryEmployee)
 newEmp.commisionRate = commisionRate
 newEmp.firstName = firstName
 newEmp.lastName = lastName
 newEmp.age = age
 newEmp.current = current
 return newEmp
}

func (this *SalaryEmployee) CommisionRate() float64 {
 return this.commisionRate
}

func (this *SalaryEmployee) SetCommisionRate(rate float64) {
 this.commisionRate = rate
}

func (this *SalaryEmployee) String() string {
 return "SalaryEmployee [firstName=" + this.firstName + ", lastName=" + this.lastName +
  ", age=" + strconv.Itoa(this.age) + ", current=" + strconv.FormatBool(this.current) +
  ", commisionRate=" + strconv.FormatFloat(float64(this.commisionRate), 'f', 2, 32) + "]"
}

Using Classes Java

/java-examples/src/com/example/UseInheritance.java
package com.example;

import com.example.inheritance.Employee;
import com.example.inheritance.HourlyEmployee;
import com.example.inheritance.SalaryEmployee;

public class UseInheritance {

 public static void main(String[] args) {
  Employee employee1 = new Employee("Rick", "Hightower", 32, true);
  SalaryEmployee employee2 = new SalaryEmployee("Whitney", "Hightower",
    17, true, 0.05);
  HourlyEmployee employee3 = new HourlyEmployee("Bob", "Hightower", 27,
    true, 25.0);

  System.out.println(employee1);
  System.out.println(employee2);
  System.out.println(employee3);

  employee1.setLastName("Smith");
  employee1.setAge(45);

  System.out.printf("Name = %s, %s | Age = %d \n",
    employee1.getFirstName(), employee1.getLastName(),
    employee1.getAge());
  System.out.printf("Name = %s, %s | Age = %d \n",
    employee2.getFirstName(), employee2.getLastName(),
    employee2.getAge());
  System.out.printf("Name = %s, %s | Age = %d \n",
    employee3.getFirstName(), employee3.getLastName(),
    employee3.getAge());

  Object[] employees = new Object[] { employee1, employee2, employee3 };

  for (Object employee : employees) {
   System.out.println(employee);
  }

 }
}

Using Classes Go

/examples/src/example/inheritance/useInheritance.go
package main

import (
 "example/inheritance"
 "fmt"
)

func main() {
 employee1 := inheritance.NewEmployee("Rick", "Hightower", 32, true)
 employee2 := inheritance.NewSalaryEmployee("Whitney", "Hightower", 17, true, 0.05)
 employee3 := inheritance.NewHourlyEmployee("Bob", "Hightower", 27, true, 25.0)

 fmt.Println(employee1)
 fmt.Println(employee2)
 fmt.Println(employee3)

 employee1.SetLastName("Smith")
 employee1.SetAge(45)

 fmt.Printf("Name = %s, %s | Age = %d \n", employee1.FirstName(), employee1.LastName(), employee1.Age())
 fmt.Printf("Name = %s, %s | Age = %d \n", employee2.FirstName(), employee2.LastName(), employee2.Age())
 fmt.Printf("Name = %s, %s | Age = %d \n", employee3.FirstName(), employee3.LastName(), employee3.Age())

 employees := []interface{}{employee1, employee2, employee3}

 for _, employee := range employees {
  fmt.Println(employee)
 }

}

The output is the same.

Employee [firstName=Rick, lastName=Hightower, age=32, current=true]
SalaryEmployee [firstName=Whitney, lastName=Hightower, age=17, current=true, commisionRate=0.05]
HourlyEmployee [firstName=Bob, lastName=Hightower, age=27, current=true, hourlyRate=25.00]
Name = Rick, Smith | Age = 45 
Name = Whitney, Hightower | Age = 17 
Name = Bob, Hightower | Age = 27 
Employee [firstName=Rick, lastName=Smith, age=45, current=true]
SalaryEmployee [firstName=Whitney, lastName=Hightower, age=17, current=true, commisionRate=0.05]
HourlyEmployee [firstName=Bob, lastName=Hightower, age=27, current=true, hourlyRate=25.00]
Kafka and Cassandra support, training for AWS EC2 Cassandra 3.0 Training