2016-08-07 3 views
-4

Я создал следующую программу Java. Его основная функциональность - выполнять сложение, вычитание, умножение, деление и модульное деление на два числа.Как я могу представить инкапсуляцию в следующей программе Java?

Я реализовал концепцию объектно-ориентированного программирования, но отсутствует инкапсуляция.

Как мне ввести инкапсуляцию?

Мой код:

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 


/** 
* 
* @author piyali 
*/ 

public class Calculator { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 

     // TODO code application logic here 
     int x, y; 
     x = 13; 
     y = 5; 

     calculation add = new calculation(); 
     calculation sub = new calculation(); 
     calculation mul = new calculation(); 
     calculation div = new calculation(); 
     calculation mod = new calculation(); 

     int addResult = add.addition(x, y); 
     int subResult = sub.subtraction(x, y); 
     int mulResult = mul.multiplication(x, y); 
     int divResult = mul.division(x, y); 
     int modResult = mod.modularDivision(x, y); 

     System.out.println("The addition of the numbers is " +addResult); 
     System.out.println("The subtraction of the two numbers is " +subResult); 
     System.out.println("The multiplication of the two numbers is " + mulResult); 
     System.out.println("The division of the two numbers is " +divResult); 
     System.out.println("The modular division of the two numbers is " + modResult); 
    } 
} 

class calculation { 

    int addition(int x, int y){ 
     int z; 
     z = x + y; 
     return(z); 
    } 

    int subtraction(int x, int y){ 
     int z; 
     z = x - y; 
     return(z); 
    } 

    int multiplication(int x, int y){ 
     int z; 
     z = x * y; 
     return(z); 
    } 

    int division(int x, int y){ 
     int z; 
     z = x/y; 
     return(z); 
    } 

    int modularDivision(int x, int y){ 
     int z; 
     z = x % y; 
     return(z); 
    } 
} 
+0

Обратите внимание, что инкапсуляция включает в себя защиту элементов данных или полей. Если у вас нет полей, вы не раскрываете то, что должно быть инкапсулировано. – Rogue

+0

Здесь я могу легко сделать что-то вроде say Расчет b = new Calculation, b.z = 12, я думаю, если int z был объявлен вне функции say addition(), инкапсуляция пригодится –

ответ

2

Ну, если вы хотите истинного ООП и герметизацию, а затем создать интерфейс Calculation который имеет способ int calculate().

public interface Calculation { 

    int calculate(); 
} 

Теперь создаем классы, которые реализует этот интерфейс, такой как Addition или Subtraction т.д.

public class Addition implements Calculation { 

    private final int x; 
    private final int y; 

    public Addition(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    @Override 
    public int calculate(){ 
     return x + y; 
    } 
} 

Основной метод

public static void main(String[] args) { 

    int x, y; 
    x = 13; 
    y = 5; 

    Calculation add = new Addition(x, y); 
    System.out.println(add.calculate()); 
} 

Преимущества такой конструкции является то, что если вы хотите добавить любой дополнительные математические операции, такие как корень, процент или даже деривация, вам не потребуется изменять какую-либо реализацию класса. Просто напишите дополнительный класс, который реализует Calculation.

-3

Используйте понятие геттер и сеттер.

class Calculator{ 
private int x, y, z; 

void setValue(int a, int b){ 
    x=a; 
    y=b; 
} 

int getValue(){ 
    return z; 
} 

void addition(){ 
    z=x+y; 
} 

void subtraction(){ 
    z=x-y; 
} 

void multiplication(){ 
    z=x*y; 
} 

void division(){ 
    z=x/y; 
} 

void modDivision(){ 
    z=x%y; 
} 
} 


public class CalculatorTestDrive { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    int num1, num2, result; 

    num1=13; 
    num2=5; 

    Calculator add = new Calculator(); 
    Calculator sub = new Calculator(); 
    Calculator mul = new Calculator(); 
    Calculator div = new Calculator(); 
    Calculator mod = new Calculator(); 

    add.setValue(num1, num2); 
    add.addition(); 
    result = add.getValue(); 
    System.out.println("The addition of " + num1 + " and " + num2 + " is " +result); 

    sub.setValue(num1, num2); 
    sub.subtraction(); 
    result = sub.getValue(); 
    System.out.println("The subtraction of " + num1 + " and " + num2 + " is " +result); 

    mul.setValue(num1, num2); 
    mul.multiplication(); 
    result = mul.getValue(); 
    System.out.println("The multiplication of " + num1 + " and " + num2 + " is " +result); 

    div.setValue(num1, num2); 
    div.division(); 
    result = div.getValue(); 
    System.out.println("The division of " + num1 + " and " + num2 + " is " +result); 

    mod.setValue(num1, num2); 
    mod.modDivision(); 
    result = mod.getValue(); 
    System.out.println("The modular division of " + num1 + " and " + num2 + " is " +result); 
} 

} 
+6

Это худший дизайн, чем существующий код. Он более подробный и делает код неретеррантным, то есть теперь есть проблемы с потоками, которых раньше не было. –

+2

Затем отправьте ответ самостоятельно с правильным дизайном –

0

Не думаю, что здесь очень много инкапсуляции. Похоже, он хочет быть базовой математической библиотекой, и поскольку у нее нет элементов данных или вспомогательных функций, вы не можете сделать здесь много всего, чтобы инкапсулировать.

Поскольку создание экземпляра этого класса немного глупо (см., Например, библиотеку Java Math), сделайте методы static и сделайте конструктор закрытым.

Я предполагаю, что это не форма инкапсуляции, но некоторые советы по дизайну: вы должны сделать переменные, которые вы не изменяете окончательно. Вы также должны удалить все ненужные переменные, если вы их не используете. Они ничего не делают для удобства чтения, и они просто используют дополнительные блоки памяти (если JVM не оптимизирует их).

Улучшен код:

class calculation { 
    private calculation() { 
     throw new RuntimeException("Don't instantiate a math library!"); 
    } 

    public static int addition(final int x, final int y){ 
     return x + y; 
    } 

    public static int subtraction(final int x, final int y){ 
     return x - y; 
    } 

    public static int multiplication(final int x, final int y){ 
     return x * y; 
    } 

    public static int division(final int x, final int y){ 
     return x/y; 
    } 

    public static int modularDivision(final int x, final int y){ 
     return x % y; 
    } 
} 

Делая это, теперь вы можете назвать вашу библиотеку расчета с чем-то вроде этого:

int additionResult = calculation.addition(5, 5); 
System.out.println(additionResult); 
Смежные вопросы