Помогите затмению найти мои значения enum? - PullRequest
2 голосов
/ 07 августа 2011

У меня проблемы с тем, чтобы Eclipse заметил значения перечисления при использовании автозавершения кода.Класс XmlDataDefitions предоставляет схему данных, которые будут анализироваться из XML.Но я не могу позвонить XmlDataDefitions.xmlTagGroups.xmlLocationList.values().YYZ или XmlDataDefinitions.xmlTagGroups.xmlLocationList.XmlTags.id.Завершение кода и компилятор, кажется, не имеет видимого XmlTags.

По какой-то причине Eclipse не может перечислить XmlTags (значения перечисления) в завершении кода.В идеале я хотел бы позвонить XmlDataDefinitions.xmlTagGroups.xmlLocationList.(something).XmlTags.id ...

public class XmlDataDefinitions {

    public static enum XmlTags {
        id,device_id,screen_name,
        title,message,
        lat_coords,lng_coords,address_string,
        loc_seen,account_pic,
        from_device_id,to_device_id,
        from_screen_name,to_screen_name,
        date,
    }

    public static enum xmlTagGroups {
        xmlLocationList(XmlTags.id, XmlTags.device_id, XmlTags.title, XmlTags.message, XmlTags.lat_coords, XmlTags.lng_coords, XmlTags.loc_seen),
        xmlMemberList(XmlTags.id, XmlTags.device_id, XmlTags.screen_name, XmlTags.address_string, XmlTags.lat_coords, XmlTags.lng_coords, XmlTags.account_pic),
        xmlChatList(XmlTags.id, XmlTags.from_device_id, XmlTags.to_device_id, XmlTags.from_screen_name, XmlTags.to_screen_name, XmlTags.message),

        xmlLocationMessage(XmlTags.id, XmlTags.device_id, XmlTags.message,XmlTags.screen_name),     
        xmlChatMessage(XmlTags.id, XmlTags.from_device_id, XmlTags.to_device_id, XmlTags.from_screen_name, XmlTags.to_screen_name, XmlTags.message, XmlTags.date),

        ;

        public XmlTags[] tags;

        private xmlTagGroups (XmlTags ... tags){
            this.tags = tags;
        }

        public XmlTags[] getTags(){
            return this.tags;
        }

    }
}

Ответы [ 3 ]

2 голосов
/ 07 августа 2011

Проблема в том, что ваши перечисления являются статическими внутренними классами, и невероятно, что значения перечисления не видны внутри содержащего класса!

Для исправления необходимо статически импортировать записи класса enum в класс var, в котором они определены, например:

import static com.mycompany.mypackage.XmlDataDefinitions.XmlTags.*;

Тогда вы сможете использовать device_id (например) без XmlTags. квалификации.

Сумасшедший, я знаю, но это так. Как только вы добавите статический импорт, Eclipse выполнит кодовое завершение их, как и ожидалось.

Другое исправление состоит в том, чтобы поместить перечисления в их собственный класс, но, как и вы, я обычно предпочитаю связывать свои перечисляет в класс, который использует / владеет ими (чтобы избежать раздувания класса - там, где это имеет смысл).

1 голос
/ 07 августа 2011

Я не совсем уверен, что знаю, чего вы пытаетесь достичь. Но, может быть, вы хотите написать такие выражения, как theese?

import test.XmlTagGroup;
import test.XmlTagGroup.XmlTag;

public class TestIt {
    public static void main(String[] args) {
        System.out.println(XmlTagGroup.xmlChatList.tags.contains(XmlTag.id));
        System.out.println("");
        for (XmlTag tag : XmlTagGroup.xmlChatList.tags)
            System.out.println(tag);
    }
}

чтобы получить

true

id
message
from_device_id
to_device_id
from_screen_name
to_screen_name

Если так, попробуйте так:

import java.util.*;

public enum XmlTagGroup {

    xmlLocationList(XmlTag.id, XmlTag.device_id, XmlTag.title, XmlTag.message, XmlTag.lat_coords, XmlTag.lng_coords,
            XmlTag.loc_seen),
    xmlMemberList(XmlTag.id, XmlTag.device_id, XmlTag.screen_name, XmlTag.address_string, XmlTag.lat_coords,
            XmlTag.lng_coords, XmlTag.account_pic),
    xmlChatList(XmlTag.id, XmlTag.from_device_id, XmlTag.to_device_id, XmlTag.from_screen_name, XmlTag.to_screen_name,
            XmlTag.message),
    xmlLocationMessage(XmlTag.id, XmlTag.device_id, XmlTag.message, XmlTag.screen_name),
    xmlChatMessage(XmlTag.id, XmlTag.from_device_id, XmlTag.to_device_id, XmlTag.from_screen_name,
            XmlTag.to_screen_name, XmlTag.message, XmlTag.date),
    ;

    public static enum XmlTag {
        id, device_id, screen_name, title, message, lat_coords, lng_coords, address_string, loc_seen, account_pic,
        from_device_id, to_device_id, from_screen_name, to_screen_name, date,
    }

    public SortedSet<XmlTag> tags;

    private XmlTagGroup(XmlTag... tags) {
        this.tags = Collections.unmodifiableSortedSet(new TreeSet<XmlTag>(Arrays.asList(tags)));
    }

}

0 голосов
/ 07 августа 2011

Я видел это до , где путь к скомпилированному классу превышает 259 символов в Windows XP / 2000.В этом случае я получаю ошибки класса not found для статических внутренних классов, путь которых превышает эту глубину.Подобные проблемы довольно распространены при работе со сложными схемами XSD и сгенерированными классами.

Рассмотрите возможность использования более коротких имен / пакетов классов и перемещения своего исходного кода куда-нибудь ближе к корню структуры каталогов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...