公开枚举是否不尊重封装?

问题描述 投票:0回答:1

这是一个大学作业的问题。对于这个作业,我们必须尊重 Java 中的封装和继承。

现在需要了解的重要课程是:

客户类别

import java.util.EnumSet;
import java.util.List;

public class Cliente {

    // Definicao de enum da localizacao
    private enum Localizacao {
        CONTINENTE,
        ACORES,
        MADEIRA;
    }

    private String nome;
    private int numContribuinte;
    private Localizacao localizacao;

    public Cliente(String nome, int numContribuinte, Localizacao localizacao){
        this.nome = nome;
        this.numContribuinte = numContribuinte;
        this.localizacao = localizacao;
    }


    public Cliente() {
    }
    public void setLocalizacao(Localizacao localizacao) {
        this.localizacao = localizacao;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public void setNumContribuinte(int numContribuinte) {
        this.numContribuinte = numContribuinte;
    }

    public String getNome() {
        return nome;
    }

    public int getNumContribuinte() {
        return numContribuinte;
    }

    public Localizacao getLocalizacao() {
        return localizacao;
    }

    public Localizacao[] getLocalizacoes(){
        return Localizacao.values();
    }


    public void printDadosCliente() {
        System.out.println("\n");
        System.out.println("Dados do Cliente:");
        System.out.println("Nome: " + nome);
        System.out.println("Número de contribuinte: " + numContribuinte);
        System.out.println("Localização do cliente: " + localizacao.name());
    }
}

产品类:

public abstract class Produtos {
    private int codigo;
    private String nome;
    private String descricao;
    private int quantidade;
    private double valorUnitario;

    //Construtor

    public Produtos(int codigo, String nome, String descricao, int quantidade, double valorUnitario){
        this.codigo = codigo;
        this.nome = nome;
        this.descricao = descricao;
        this.quantidade = quantidade;
        this.valorUnitario = valorUnitario;
    }


    // Getters
    public int getCodigo() {
        return codigo;
    }

    public String getNome() {
        return nome;
    }

    public String getDescricao() {
        return descricao;
    }

    public int getQuantidade() {
        return quantidade;
    }

    public double getValorUnitario() {
        return valorUnitario;
    }

    public double getPrecoSemIva() {
        return valorUnitario * quantidade;
    }

    // Abstract method to calculate IVA
    public abstract double calculaIva(Cliente.Localizacao localizacao);

    public abstract void printDadosProduto();
}

还有 ProdutoAlimentarNormal 类,它是 ProdutoAlimentar 的子类,ProdutoAlimentar 是 Produtos 的子类,但我省略了它,因为它只向类添加了一个变量 isBiologic 布尔值:

public class ProdutoAlimentarNormal extends ProdutosAlimentares {
    public ProdutoAlimentarNormal(int codigo, String nome, String descricao, int quantidade, double valorUnitario, boolean isBiologico)
    {
        super(codigo, nome, descricao, quantidade, valorUnitario, isBiologico);
    }

    @Override
    public double calculaIva(Cliente.Localizacao localizacao){
        double taxaIva = 0.23;

        if (localizacao.equals(Cliente.Localizacao.MADEIRA)){
            taxaIva = 0.22;
        } else if (localizacao.equals(Cliente.Localizacao.ACORES)) {
            taxaIva = 0.16;
        }
        if (getBiologico()){
            taxaIva *= 0.9;
        }

        return getQuantidade()* getValorUnitario() * taxaIva;
    }

    @Override
    public void printDadosProduto(){
        System.out.println("Dados do Produto:");
        System.out.println("Tipo: Produto Alimentar");

        if (getBiologico()){
            System.out.print("Biologico: Sim");
        } else {
            System.out.print("Biologico: Não");
        }

        System.out.println("Taxa de IVA: Normal");

        System.out.println("Nome do produto: " + getNome());
        System.out.println("Código do produto: " + getCodigo());
        System.out.println("Quantidade: " + getQuantidade());
        System.out.println("Preço por unidade: " + getValorUnitario() + "€");
        System.out.println("Preço total (s/ IVA): " + getValorUnitario() * getQuantidade() + "€");
    }
}

如你所见,我已将

Localizacao
设置为私有:

// Definicao de enum da localizacao
private enum Localizacao {
    CONTINENTE,
    ACORES,
    MADEIRA;
}

但是 produtosAlimentarNormal 上的 IVA 计算取决于这些值:

@Override
public double calculaIva(Cliente.Localizacao localizacao){
    double taxaIva = 0.23;

    if (localizacao.equals(Cliente.Localizacao.MADEIRA)){
        taxaIva = 0.22;
    } else if (localizacao.equals(Cliente.Localizacao.ACORES)) {
        taxaIva = 0.16;
    }
    if (getBiologico()){
        taxaIva *= 0.9;
    }

    return getQuantidade()* getValorUnitario() * taxaIva;
}

我尝试这样写,而是传递一个客户端,

@Override
public double calculaIva(Cliente cliente){
    double taxaIva = 0.13;

    if (cliente.getLocalizacao() == cliente.getLocalizacoes().NOVALUE){
        taxaIva = 0.12;
    } else if (localizacao.equals()) {
        taxaIva = 0.16;
    }
    if (categoria == CategoriasAlimentar.VINHO){
        taxaIva += 0.01;
    }

    if(getBiologico()){
        taxaIva *= 0.9;
    }

    return getQuantidade()* getValorUnitario() * taxaIva;
}

但永远无法让 cliente.getLocalizacoes().NOVALUENOVALUE 空间中显示 ACORES、MADEIRA 或 CONTINENTE

公开枚举是否不尊重封装? 我尝试了各种 getter 和 setter,但永远无法得到一个能够返回给我一些我可以在私有的情况下做的事情。 虽然它是公开的,但它就像一种魅力,但恐怕我不尊重封装。

    

java oop inheritance enums encapsulation
1个回答
0
投票

OOP

中的类定义了

类型。这也意味着枚举类。 如果该类型需要作为公共方法中的参数,那么该类型当然也必须是公共的。

您定义方法,例如:

Localizacao.ACORES

该公共方法采用
public double calculaIva ( Cliente.Localizacao localizacao ) { … }
对象。所以

Cliente.Localizacao

 类也必须是公共的。作为一个枚举类是无关紧要的。
方法
Cliente.Localizacao

是否真的应该是

calculaIva

是一个单独的问题。您应该始终选择适合您情况的尽可能窄的访问权限。请参阅 Oracle 的
教程
您可以通过使用 Java 平台模块系统 (JPMS)

进一步减少访问。

无论您授予用作参数的类/接口什么访问级别,都必须匹配或超过参数方法的访问级别。

© www.soinside.com 2019 - 2024. All rights reserved.