你如何使用接口的私有方法?
How do you use your interface's private methods?
我在使用我在界面中实现的私有方法时遇到问题。
我在我的 RequestData
接口中私下实现了一个 print(string, list)
方法,以隐藏实现,因为我不希望它被调用,除了 class' 其他打印方法 -但我将它包含在界面中,因为它与每个实现相同 class.
问题是,当我尝试使用实现 RequestData
接口的 FundingRequests
中的 print
方法时,它显示错误 - print
方法的RequestData
接口中的访问是私有的,因此无法找到。
嗯...如果无法从实现 classes 访问接口的私有方法,您应该如何使用它们?
这是一个错误,还是我误解了接口?
接口:
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));
}
}
您应该使用受保护的修饰符。私有方法只能从同一个 class 访问,不能被子 classes.
访问
私有方法作为 Java 接口的一项功能提供,以帮助在接口中编写默认方法,而无需重新使用代码。它们不打算用于实现继承。
如果您想继承和使用已实现的方法,例如您在此处尝试的方法:
@Override
public void printRequests() {
print("",new ArrayList<>(requests));
}
您想在超类 class 中实现该方法并扩展该方法 class,或者将该方法作为接口中的默认方法实现。使用 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);
}
}
然后扩展 class:
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));
}
}
虽然这会限制您的 class 只能扩展 class。更好的模式是将该方法实现为 class 中的 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));
}
}
或者,如果你真的想发疯,你可以用一个抽象来完成这个 class:
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);
}
}
然后扩展 class:
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));
}
}
您可以简单地完全取出 print()
方法,或将其设为嵌套静态 class.
public interface RequestData<E> {
void add(E newRequest);
List<E> getRequests();
List<E> getFulfilledRequests();
List<E> getUnfulfilledRequests();
void printRequests();
void printFulfilledRequests();
void printUnfulfilledRequests();
public static final class Printer {
protected static <E> 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 implements RequestData<FundingRequest> {
private TreeSet<FundingRequest> requests;
FundingRequests() {
this.requests = new TreeSet<>();
}
...
@Override
public void printRequests() {
Printer.print("",new ArrayList<>(requests));
}
}
这允许您将 print()
保持在 protected
可访问性,但它会暴露 Printer
嵌套静态 class,这对 public
没有任何作用看法。如果制作方法 public
没问题,您可以将该方法简单地定义为 public static
(即实用程序)方法。
我在使用我在界面中实现的私有方法时遇到问题。
我在我的 RequestData
接口中私下实现了一个 print(string, list)
方法,以隐藏实现,因为我不希望它被调用,除了 class' 其他打印方法 -但我将它包含在界面中,因为它与每个实现相同 class.
问题是,当我尝试使用实现 RequestData
接口的 FundingRequests
中的 print
方法时,它显示错误 - print
方法的RequestData
接口中的访问是私有的,因此无法找到。
嗯...如果无法从实现 classes 访问接口的私有方法,您应该如何使用它们?
这是一个错误,还是我误解了接口?
接口:
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));
}
}
您应该使用受保护的修饰符。私有方法只能从同一个 class 访问,不能被子 classes.
访问私有方法作为 Java 接口的一项功能提供,以帮助在接口中编写默认方法,而无需重新使用代码。它们不打算用于实现继承。
如果您想继承和使用已实现的方法,例如您在此处尝试的方法:
@Override
public void printRequests() {
print("",new ArrayList<>(requests));
}
您想在超类 class 中实现该方法并扩展该方法 class,或者将该方法作为接口中的默认方法实现。使用 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);
}
}
然后扩展 class:
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));
}
}
虽然这会限制您的 class 只能扩展 class。更好的模式是将该方法实现为 class 中的 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));
}
}
或者,如果你真的想发疯,你可以用一个抽象来完成这个 class:
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);
}
}
然后扩展 class:
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));
}
}
您可以简单地完全取出 print()
方法,或将其设为嵌套静态 class.
public interface RequestData<E> {
void add(E newRequest);
List<E> getRequests();
List<E> getFulfilledRequests();
List<E> getUnfulfilledRequests();
void printRequests();
void printFulfilledRequests();
void printUnfulfilledRequests();
public static final class Printer {
protected static <E> 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 implements RequestData<FundingRequest> {
private TreeSet<FundingRequest> requests;
FundingRequests() {
this.requests = new TreeSet<>();
}
...
@Override
public void printRequests() {
Printer.print("",new ArrayList<>(requests));
}
}
这允许您将 print()
保持在 protected
可访问性,但它会暴露 Printer
嵌套静态 class,这对 public
没有任何作用看法。如果制作方法 public
没问题,您可以将该方法简单地定义为 public static
(即实用程序)方法。