Java:无法访问静态单例方法

时间:2009-11-11 09:08:40

标签: java static singleton

我面临一个问题。我有一个名为“ReportingService”的类,它应该是单例,并且正在扩展“CommonService”。

package MyApp.Services.ReportingService;

public class ReportingService extends CommonService {

    private static ReportingService instance = null;

    public static ReportingService getInstance() {
        if (instance == null) {
            instance = new ReportingService();
        }
        return instance;   

    }
}

并在其他类中访问此类我正在使用

package MyApp.Services.WebReportingService;
@WebMethod(operationName = "registerUDP")
    public boolean registerUDP(
            @WebParam(name = "Friendly Name") String friendlyName,
            @WebParam(name = "Username") String username,
            @WebParam(name = "Password") String password,
            @WebParam(name = "Communication Protocol") CommunicationProtocol communicationProtocol,
            @WebParam(name = "IP Address") String ipAddress,
            @WebParam(name = "Port") int port) {

        Consumer client = new Consumer(friendlyName, username, password, communicationProtocol, ipAddress, port);

ReportingService rs = ReportingService.
        return true;

    }
“ReportingService rs = ReportingService”中的

。它没有向我显示ReportingService类的 getInstance()方法。我还导入了正确的包。

注意:这两个类都在不同的包中。

5 个答案:

答案 0 :(得分:3)

更改如下:

package MyApp.Services.ReportingService;  // FIXME - Make package names lowercase!!
                                          // FIXME - Loopy package name

public class ReportingService extends CommonService {

    private static ReportingService instance = null;

    private ReportingService() { }

    public static synchronized ReportingService getInstance() {
        if (instance == null) {
            instance = new ReportingService();
        }
        return instance;   

    }
}

import MyApp.Services.ReportingService.ReportingService; 

package MyApp.Services.WebReportingService ; 
                        // FIXME - Make package names lowercase!!
                        // FIXME - Loopy package names.

public class WebReportingService {

    @WebMethod(operationName = "registerUDP")
    public boolean registerUDP(
            @WebParam(name = "Friendly Name") String friendlyName,
            @WebParam(name = "Username") String username,
            @WebParam(name = "Password") String password,
            @WebParam(name = "Communication Protocol") CommunicationProtocol communicationProtocol,
            @WebParam(name = "IP Address") String ipAddress,
            @WebParam(name = "Port") int port) {

        Consumer client = new Consumer(friendlyName, username, password,
                                       communicationProtocol, ipAddress, port);

        ReportingService rs = ReportingService.getInstance();
        return true;
    }
}

注意:根据定义ConsumerCommunicationProtocol类的包,您可能需要导入它们;例如在package行之前添加这些行。

import some.package.Consumer;
import some.other.package.CommunicationProtocol;

注意2:您当前选择的软件包名称存在一些严重的样式问题。

  • 包名称应全部小写

  • 您的包名称的前缀应该是您公司,组织的(反向)DNS样式标识符;例如in.com.yourcompany...。请注意,形成这种惯例有很好的理由!!

  • MyApp / myapp内容免费且不应使用

  • services.reportingservice多余/冗长;例如使用services.reporting代替

  • 使用与类相同的名称和包名称是冗余/详细

  • 除非reportingwebreporting包中有很多类,否则它们可能应该折叠成一个包。很多包含1或2个类的包都没有帮助。

答案 1 :(得分:1)

我认为您的包裹名称已损坏。您似乎在包的末尾具有类的名称 - 但只有在导入时才会显示该类的名称。

所以你会:

package myApp.Services;

public class ReportService extends CommonService {/* code goes here */}

然后你会包括:

import myApp.Services.ReportService;

WebReportingService也是如此。 package语句不应包含类名

修改:如果您确实需要ReportServicemyApp.Services.ReportService,那么您需要导入myApp.Services.ReportService.ReportService(或者myApp.Services.ReportService.*,但不建议这样做,除非您从包中需要很多课程)

答案 2 :(得分:0)

您必须在源文件的顶部导入ReportingService类,如下所示:

import MyApp.Services.ReportingService.ReportingService;

编辑:第二个代码段也缺少类声明。如果这是完整的源代码,则无法编译。

基于编译器输出的另一个编辑:如果xx.xx.Java.Common.DesignPattern.ObserverPattern.Observer类似乎依赖于类路径上的Consumer类,它也会有所帮助。

答案 3 :(得分:0)

无法确定,但是当导入的类过时时,我已经看到了这种问题。

这可能发生在不同的IDE上,没有直接的解决方案:也许清理所有类并再次编译它们?

答案 4 :(得分:0)

我会尝试手工输入getInstance(),正如其他人在评论中所建议的那样。这应该工作。我相信你的IDE在键入点(。)后不会显示方法的原因可能只是因为以下返回true。正在阅读

ReportingService rs = ReportingService.return true;

它认为破坏了代码,因此不会提供代码完成。