webForumDet fria alternativet

"include fil" i java?

21 svar · 478 visningar · startad av CokeLight

CokeLightMedlem sedan juni 2000504 inlägg
#1

Hejsan,

om jag skulle vilja ha nهgot som motsvarar ASP's include filer med en massa konstanter som jag vill anvنnda i olika klasser (i samma projekt), hur gِr jag dه pه bنsta sنtt?

Just nu provar jag att ha en "basklass" som de andra klasserna نrver ifrهn.. o dه kan jag ha get/set metoder fِr dela med mig av mina "konstanter".. men det blir ju en fasligt massa get/set om jag vill kِra pه det hنr sنttet..?

Hur brukar (ni) gِra...? :)

nitro2k01Medlem sedan aug. 20039 342 inlägg
#2

Är det bara jag eller ser dina å,ä och ö lite konstiga ut?

CokeLightMedlem sedan juni 2000504 inlägg
#3

Hej, hehe.. nä, det ser konstigt ut här också... (är inte hemma vid min egen dator..)

SPiNMedlem sedan mars 20007 896 inlägg
#4

getter/setter-metoder är ingen bra lösning och inte heller speciellt snygg programmering, då du kan i stort sett använda instansvariabler istället. Konstanter ska du inte heller kunna ändra värde i, för då är dom ju inte konstanter (=har ett fast värde) utan variabler.

Skapa istället en klass där du har en massa klassvariabler ( statiska ) som du inkluderar i varje projekt.

package cokelight.misc;

public class Constants {
     public static final int VAR1 = 0;
     public static final String VAR2 = "Weee!"
}

Kompilera och lägg till sökvägen till filen i din CLASSPATH, sen importerar du bara klassen och använder den som vanligt:

import cokelight.misc.Constants;

public class ProjectClass {
     public static void main( String[] argv ) {
          System.out.println( "VAR1 är: " + Constants.VAR1 );
          System.out.println( "VAR2 är: " + Constants.VAR2 );
     }
}
CokeLightMedlem sedan juni 2000504 inlägg
#5

aha, super.. tack Spin..! det var en kompis som föreslog final precis, men det här med att lägga den egna filen i classpath o anropa den på det sättet var det nog ingen av oss som kände till.. ska prova..

hehe.. ehm.. nä, det är ju sant att konstanterna ju inte ska kunna ändras såsom jag skrev.. galet..

återkommer eventuellt.. tack igen :)

spangoMedlem sedan juni 20008 205 inlägg
#6

Beroende på hur man ska använda det, är ju faktiskt konfigurationsfiler fina saker. Antingen använder man xml eller den utsökta klassen Properties.

CokeLightMedlem sedan juni 2000504 inlägg
#7

Hej, a det funkar jättebra med o använda package för konstanterna.. :)

hmm.. men det finns alltså andra sätt också som du sa Spango..? Jag förstod inte exakt hur jag skulle använda Properties för det ändamålet..

Intressant också hur man använder XML:n..?

Skulle vara kul o se nån kodsnutt om du har? :)

SPiNMedlem sedan mars 20007 896 inlägg
#8

spango talar om konfigurationsinställningar, som lagras i en utomstående fil ( XML ) eller direkt i klassen Properties ( Som är en Hashtable i stort sett ). Properties-klassen är kanon att använda vid olika tillfällen, för att lagra värden lite här och där.

Det är rätt enkelt:

Properties myProps = System.getProperties();
myProps.setProperty( "en.variabel", "Värde" );
...
String enVariabel = myProps.getProperty( "en.variabel" );
CokeLightMedlem sedan juni 2000504 inlägg
#9

aha.. så är det att jag skriver

Properties myProps = System.getProperties();
myProps.setProperty("newName", "Lisa");

(om vi tar ditt förra exempel) i Class Constants (den fil där jag vill ha mina konstanter) och sen kan läsa av testProp.getProperty("newName") i en annan klass rakt av utan package, eller...?

Du skrev förresten en.variabel. Vad för betydelse har "en"...? Är det som namespace eller nåt?

(Jag fick dessutom ett felmeddelande "<identifier> expected" i mitt test som pekade på setProperty parentesen...?)

(ang. xml gissar jag då att man kanske gör en fil som är som machine.config i asp.net då eller liknande med sina egna variabler..)

SPiNMedlem sedan mars 20007 896 inlägg
#10

Du kan skriva det var du vill, oftast sker skrivning av konfigurationsinställningar vid start av en applikation, och läggs till i Properties, t.ex.

Du skrev förresten en.variabel. Vad för betydelse har "en"...? Är det som namespace eller nåt?

Nej, det är inget namespace. Standardstrukturen på nycklarna i Properties är att man separerar ord med en punkt. Ta en titt i API:et för System.getProperties() för en titt på hur övriga inställningar lagras/vilka som lagras.

(ang. xml gissar jag då att man kanske gör en fil som är som machine.config i asp.net då eller liknande med sina egna variabler..)

Ja, precis. Den läses sedan in vid starten av applikationen för att appen sedan ska kunna veta inställningarna.

(Jag fick dessutom ett felmeddelande "<identifier> expected" i mitt test som pekade på setProperty parentesen...?)

Hmm... Vad pekade felmeddelandet på? Fungerar inte setProperty() kan du likväl använda put().

myProps.put( "newName", "Lisa" );
CokeLightMedlem sedan juni 2000504 inlägg
#11

hmm.. får det inte att funka just nu, men lägger det på hyllan tills vidare..

tack för dina utförliga svar Spin! Är nöjd med vad jag har lärt mig idag :)

SPiNMedlem sedan mars 20007 896 inlägg
#12

Visst. Vill du få igång det och rulla vid ett senare tillfälle, bifoga gärna hela koden på hur du har gjort ( Det låter som att det har missats något kommatecken, eller liknande ) så ska vi nog lösa det. :)

CokeLightMedlem sedan juni 2000504 inlägg
#13

a schysst.. :) hehe.. jag har inte gjort nåt speciellt förutom att kopiera koden jag fick.. (tagit bort allt annat o får samma felmeddelande).

package support.include;
import java.util.Properties;

public class Constants
{
	Properties testProp = System.getProperties();
	testProp.put("en.newName", "Lisa");	
}

-----
msg:
<identifier> expected
testProp.put("en.newName", "Lisa");
            ^
SPiNMedlem sedan mars 20007 896 inlägg
#14

Du har inte någon metod att köra. :)

public class Test {
     public static void main( String[] argv ) {
          Properties myProp = System.getProperties();
          myProp.put( "a.key", "a.value" );

          System.out.println( myProp.getProperty( "a.key" ) );
     }
}
CokeLightMedlem sedan juni 2000504 inlägg
#15

hahaha.. va f... innan jag kompilerade tänkte jag att jag blir knäpp om det var därför.. aj aj.. kanske dags o lägga sig.. tack :)

spangoMedlem sedan juni 20008 205 inlägg
#16

Om du missade det kan Properties också läsa in från filer:

Properties conf = new Properties();
FileInputStream in = new FileInputStream("config.txt");
[url=http://java.sun.com/j2se/1.4.2/docs/api/java/util/Properties.html#load(java.io.InputStream)]conf.load(in);[/url]
System.out.println(conf.getProperty("person") + " i " + conf.getProperty("rubrik"));

Propertiesfiler följer det universala nyckel=värde-mönstret, så om config.txt ser ut så här:

rubrik = nakenchock
person = Kungen

... blir utskriften således "Kungen i nakenchock".

\t Felhanteringen får du fixa själv...

CokeLightMedlem sedan juni 2000504 inlägg
#17

ah, okay... a då förstår jag.. varje fil som vill använda de variabler som sattes med setProperty() får lov att läsa in dem med hjälp av fil-inläsning (FileInputStream) såsom du skrev.. o ist. för .txt kan man lika gärna ha xml fil antar jag.. okay.. nu är nog allting klart :) tackar !

LimeMedlem sedan sep. 2001961 inlägg
#18

Alltså... nu ska man inte gör det svårare än det är...

Enligt god programmeringssed så använder man en konstant, i java static final om det handlar om ett attribut som delas över hela applikationen och som inte behöver ändra på sig beroende på implementation.

Alltså sätter man konstanta strängar, integers och annat som static final.

Om de bara ska användas i en viss klass så deklarerar man dom i den klassen. Exempel på det är BorderLayout som har BorderLayout.CENTER, BorderLayout.NORTH o.s.v. som bara har en vettig mening i just BorderLayout.

Om konstanten skall gälla över flera klasser så deklarerar man den antingen i en basklass eller i en helt egen klass. Den senare ska då enligt namngivningskonventionerna heta <någonting>Constants. Om jag t.ex. har konstanter som innehåller texter till ett GUI så skulle jag kalla klassen GuiTextConstants.

Om man däremot har parametrar (alltså inte attribut i en klass) som kan ändra på sig baserat på var jag är, t.ex. databaskopplingar, användarnamn, var jag hittar vissa filer, alltså saker som är installationsberoende, då sätter jag dessa i en property-fil eller en xml-fil och läser in dom vid start av programmet.

Där är det smart att göra en överlagring av Property-klassen där man skapar get-metoder för de properties som man läser in.

Just my $.02

CokeLightMedlem sedan juni 2000504 inlägg
#19

tack för tipset.. :) Provade att följa dina tips såsom jag förstod det, så nu har jag bl.a. GUIConstants klass med massa static final och en DBCon som extends Properties...

spangoMedlem sedan juni 20008 205 inlägg
#20

Låter som en vettig lösning :)

141 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)