2009-11-11 3 views
0

У меня есть одна проблема. У меня есть класс с именем «ReportingService», и он должен быть одноточечным и распространяется на «CommonService».Java: не удалось получить доступ к статическому методу однопользовательского режима

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. Я также импортировал правильные пакеты.

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

+0

Вы импортировали ReportingService? – Henning

+0

Но даже в IDE не отображается метод, вы можете добавить его вручную и скомпилировать код? – Konamiman

+1

выглядит так, как у вас просто есть проблема с автозаполнением в IDE ... попробуйте ввести ReportingService.getInstance() и посмотреть, есть ли у вас ошибки компиляции –

ответ

1

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

Таким образом, вы бы:

package myApp.Services; 

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

, но тогда вы должны включить:

import myApp.Services.ReportService; 

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

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

+0

все еще не могут получить доступ. я попробовал полное имя класса в заявлении на импорт в WebReportingService – Mohsan

+0

попробуйте написать полное имя пакета в коде; что-то вроде: 'myApp.Services.ReportService.ReportService rs = myApp.Services.ReportService.ReportService.getInstance()'. Также проверьте класс 'Consumer', также есть проблема с этим (он не находит класс' Observer', возможно, еще одну ошибку импорта). – laura

0

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

import MyApp.Services.ReportingService.ReportingService; 

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

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

0

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

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

0

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

ReportingService rs = ReportingService.return true; 

который считается сломанным кодом и, следовательно, не будет обеспечивать выполнение кода.

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

Примечание: в зависимости от того, какие классы классов 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 классами в них не полезно.

+0

эти два класса находятся в разных пакетах. – Mohsan

+0

все еще не компилируется :( – Mohsan

+0

Итак, у вас действительно есть классы под названием MyApp.Services.WebReportingService.WebReportingService и MyApp.Services.ReportingService.ReportingService ??? Мне кажется, что это немного для меня. –

Смежные вопросы