java - 如何使用接口(interface)的私有(private)方法?

标签 java oop interface private access-modifiers

我在使用在界面中实现的私有(private)方法时遇到问题。

我在我的 request> requestData 接口(interface)中私下实现了 print(字符串,列表)方法,以隐藏实现,因为我不希望它将其调用。 ' 其他打印方法 - 但我将其包含在接口(interface)中,因为它与每个实现类都相同。

问题是,当我尝试使用实现 RequestData 接口(interface)的 FundingRequests 中的 print 方法时,它显示错误 - RequestData 接口(interface)中的 print 方法的访问是私有(private)的,因此无法找到。

那么...如果接口(interface)的私有(private)方法无法从实现类中访问,那么您应该如何使用它们?

这是一个错误,还是我误解了接口(interface)?

界面:

package com.landbay.datamodel.data;

import java.util.List;

public interface RequestData<E> {

    void add(E newRequest);

    List<E> getRequests();

    List<E> getFulfilledRequests();

    List<E> getUnfulfilledRequests();

    void printRequests();

    void printFulfilledRequests();

    void printUnfulfilledRequests();

    private void print(String listTitle, List<E> listToPrint) {
        StringBuilder string = new StringBuilder();
        string.append(listTitle);

        for (E request : listToPrint) {
            string.append("\n").append(request);
        }

        System.out.println(string);
    }

}

有害的类(class)和方法:

public class FundingRequests implements RequestData<FundingRequest> {
        private TreeSet<FundingRequest> requests;

        FundingRequests() {
            this.requests = new TreeSet<>();
        }

        ...

        @Override
        public void printRequests() {
            print("",new ArrayList<>(requests));
        }

}

最佳答案

私有(private)方法作为 Java 接口(interface)的一项功能提供,以帮助在接口(interface)中编写默认方法,而无需重复使用代码。它们无意用于实现继承。

如果您想继承并使用已实现的方法,例如您在此处尝试的方法:

@Override
public void printRequests() {
    print("",new ArrayList<>(requests));
}

您想要在父类(super class)中实现该方法并扩展该类,或者将该方法实现为接口(interface)中的默认方法。使用父类(super class)将是更传统的方法。

使用您提供的代码,您可以执行以下操作:

class Printer {

    protected void print(String listTitle, List<E> listToPrint) {
        StringBuilder string = new StringBuilder();
        string.append(listTitle);

        for (E request : listToPrint) {
            string.append("\n").append(request);
        }
}

然后扩展该类:

public class FundingRequests extends Printer implements RequestData<FundingRequest> {
        private TreeSet<FundingRequest> requests;

        FundingRequests() {
            this.requests = new TreeSet<>();
        }

        ...

        @Override
        public void printRequests() {
            print("",new ArrayList<>(requests));
        }

}

尽管这会限制你的类只能扩展该类。更好的模式是将该方法实现为类中的公共(public)静态方法,然后使用它,如下所示:

class Printer {

    public static void print(String listTitle, List<E> listToPrint) {
        StringBuilder string = new StringBuilder();
        string.append(listTitle);

        for (E request : listToPrint) {
            string.append("\n").append(request);
        }
    }
}

然后使用方法:

public class FundingRequests implements RequestData<FundingRequest> {
    private TreeSet<FundingRequest> requests;

    FundingRequests() {
        this.requests = new TreeSet<>();
    }

    ...

    @Override
    public void printRequests() {
        Printer.print("",new ArrayList<>(requests));
    }
}

或者,如果你真的想疯狂,你可以使用抽象类来实现:

abstract class RequestData<E> {

    abstract void add(E newRequest);

    abstract List<E> getRequests();

    abstract List<E> getFulfilledRequests();

    abstract List<E> getUnfulfilledRequests();

    abstract void printRequests();

    abstract void printFulfilledRequests();

    abstract void printUnfulfilledRequests();

    protected void print(String listTitle, List<E> listToPrint) {
        StringBuilder string = new StringBuilder();
        string.append(listTitle);

        for (E request : listToPrint) {
            string.append("\n").append(request);
        }

        System.out.println(string);
    }

}

然后扩展该类:

public class FundingRequests extends RequestData<FundingRequest> {
        private TreeSet<FundingRequest> requests;

        FundingRequests() {
            this.requests = new TreeSet<>();
        }

        // implement the abstract methods

        @Override
        public void printRequests() {
            print("",new ArrayList<>(requests));
        }

}

关于java - 如何使用接口(interface)的私有(private)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53218882/

相关文章:

java - 类似 Excel 的 JTable 单元格编辑器,在版本开始时有一个空单元格

javascript - TypeScript 中 c# 类虚拟成员的等价物

java - 'natural ordering' 的含义及其与 compareTo() 方法的关系

Java 枚举 getDeclaringClass 与 getClass

java - Struts2 'Required' 字段验证拦截器不工作

java - 无法将抽象方法声明为私有(private)

java - 使用泛型实现接口(interface)时返回错误

java - 抽象与抽象类和接口(interface)

java - 如何获取一个整数以将值设置为与扫描仪相同

java - 我在哪里实现我的功能?