Java: невозможно получить доступ к статическому одноэлементному методу - PullRequest
0 голосов
/ 11 ноября 2009

Я столкнулся с одной проблемой. У меня есть класс с именем «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." он не показывает мне getInstance () метод класса ReportingService. Я также импортировал правильные пакеты.

ПРИМЕЧАНИЕ: оба класса находятся в разных пакетах.

Ответы [ 5 ]

3 голосов
/ 11 ноября 2009

Изменить следующим образом:

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;
    }
}

Примечание: в зависимости от того, в каких пакетах определены классы Consumer и CommunicationProtocol, может потребоваться их импорт; например добавьте эти строки перед строкой package.

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

Примечание 2: у вашего текущего выбора имен пакетов есть серьезные проблемы со стилем.

  • имена пакетов должны быть строчными

  • префиксом имен ваших пакетов должен быть (обратный) идентификатор в стиле DNS для вашей компании, организации и т. Д .; например in.com.yourcompany.... Обратите внимание, что для этого соглашения есть очень веские причины !!

  • MyApp / myapp не содержит контента и не должен использоваться

  • services.reportingservice является избыточным / многословным; например используйте services.reporting вместо

  • использование того же имени, что и у класса, а имя пакета избыточно / многословно

  • , если в пакетах reporting и webreporting нет большого количества классов, их, вероятно, следует объединить в один пакет. Многие пакеты с 1 или 2 классами в них не помогают.

1 голос
/ 11 ноября 2009

Я думаю, что ваши имена пакетов не верны. Похоже, у вас есть имя класса в конце пакета, но имя класса появляется только при импорте.

Итак, вы бы получили:

package myApp.Services;

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

но тогда вы бы включили:

import myApp.Services.ReportService;

То же самое относится и к WebReportingService. Оператор package не должен включать имя класса

Редактировать: если вы действительно хотите ReportService в пакете myApp.Services.ReportService, то вам нужно импортировать myApp.Services.ReportService.ReportService (или, альтернативно, myApp.Services.ReportService.*, но это не рекомендуется, если вам не нужно много классов из пакета)

0 голосов
/ 11 ноября 2009

Не могу быть уверен, но я видел такую ​​проблему, когда импортированные классы устарели с кодом.

Это может произойти в разных IDE, не существует простого решения: может быть, очистить все классы и собрать их снова?

0 голосов
/ 11 ноября 2009

Я бы попробовал набрать getInstance () от руки, как другие предлагали в своих комментариях. Это должно работать. Я полагаю, что причина, по которой ваша IDE не будет показывать вам метод после ввода точки (.), Может заключаться просто в следующем возвращаемом true. Это читает

ReportingService rs = ReportingService.return true;

, который он считает неработающим кодом и поэтому не обеспечит завершение кода.

0 голосов
/ 11 ноября 2009

Вам нужно будет импортировать класс ReportingService в верхней части исходного файла, например:

import MyApp.Services.ReportingService.ReportingService;

Редактировать: Во втором фрагменте кода также отсутствует объявление класса. Если это полный исходный код, он не может скомпилироваться.

Еще одно редактирование, основанное на выводе компилятора: Было бы также полезно, если бы у вас был класс xx.xx.Java.Common.DesignPattern.ObserverPattern.Observer на пути к классам, от которого, кажется, зависит класс Consumer.

...