• ベストアンサー

Cの関数内ローカルstatic変数

と同様の機能をJavaで実現したいのですが class Testclass { testmethod() { //////////////////////// //ここだけにしかコードを書けない //////////////////////// } } という条件で Testclass testclass=new Testclass(); が最初に生成された後他メソッド内で testclass.testmethod(); が実行されるたびに 1カウントアップする変数countを作成することはできるでしょうか? 上のように1つのメソッド内だけしかコーディングできません Cならば static int count=0; count++; を記述すれば片付くのですが Javaの場合はメソッド外に記述しない限りできないのでしょうか?

  • guuman
  • お礼率86% (1043/1206)
  • Java
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

14.4 Local Variable Declaration Statements によると、ローカル変数に static キーワードは使えないので、 static int count=0; のように書くことはできないと思います。 スコープがメソッドの中に納まらなくなってもいいなら、 public class StaticVar { static int count = 0; } みたいな外部クラスを作れば、代用できるような気はします。

guuman
質問者

補足

ありがとうございます クラスの定義もメソッド内にしかできません 複数のクラスが出来上がっていて そのクラス内のメソッド内にしかコーディングができないのです メソッド内では class StaticVar { static int count = 0; } と定義するとstatic部分でエラーになります よろしくお願いします

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#1>メソッド内では…と定義するとstatic部分でエラーになります ローカルクラスではstatic フィールドが使えません。 #1の回答は、同一パッケージ内でクラスを用意するのではなくて、別にクラスファイル用意するということ(外部クラス)です。 メソッド内で動的にクラスを作成するのもありかな(できるかどうかは試してないですが)とか思いますが、 本当にそのメソッドの中だけということであればできないように思います。

guuman
質問者

お礼

ありがとうございます できそうも有りませんね

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.2

回答とお礼から状況を整理すると ・実装したいメソッド内で何らかの値を保持する必要がある ・メソッド外に勝手にコードを書けない ということでしょうか? まず、前提としてCのローカルstatic変数と同等のことをJavaで行うには、やはりメソッドの外部にstatic変数として定義するしかありません。 で、解決策としては、 ・その値は本当にメソッド内(クラス内)で保持する必要があるかどうか考える →値を引数で受取り、カウントアップした後returnで返す方法は使えないか?(つまり保持は呼び出し元に任せる) →外部のクラスに保持させることはできないか?(別のクラスを作る権限が必要) →そもそも保持すべき値なのか? ・クラスの設計を変える →本当に保持が必要な値ならクラス設計を司る人に設計変更したいと掛け合うべき(本当に保持が必要なら「できません」では話がすまない) というあたりをもう少し詰めてみるといいでしょう。 本当に質問の条件の範囲で回答するなら、「値の保持は呼び出し元に任せる」となります。 でもそれは呼び出し元には必ずしも幸せな実装ではないことも考えてください。

guuman
質問者

お礼

ありがとうございます 変なツールを使っていて ユーザがコーディングできるのはメソッド内だけです ただデータベースに接続できるので わざわざメモリ変数をデータベースに格納すればできます 簡単にはできないということですね

関連するQ&A

  • C#のキャストについて(object→byte)

    いつもお世話になっております。C#初心者です。 「メソッドの引数として渡された値をリスト型の配列に格納する」という課題に取り組んでいますが、 変数のキャストで実行時にエラーが発生し、頭を悩ませています。 作成したコードは以下のようになっています。 public class TestClass {  private List<byte> hogeList = new List<byte>();  public void TestMethod( object hoge )  {   hogeList.Add( (byte)hoge ); ← (*)  } } 上記のメソッドをMain関数から TestClass test = new TestClass(); test.TestMethod(5); として実行すると、「hogeList」に「5」が格納される、といった動作にしたいと考えています。 しかしながら、ビルドは通るのですが、実行すると(*)の位置で止まり、 「指定されたキャストは有効ではありません。」 というメッセージが表示されます。 そこで質問なのですが、object型からbyte型にキャストする場合にはどのような記述の仕方がありますでしょうか? ご教授よろしくお願いいたします。

  • クラス内の関数内static変数について

    クラス内の「staticではないメンバ関数内で定義される」static変数の初期化タイミングはいつでしょうか? 自分としてはクラスのインスタンス生成時に初期化されるものだと思っていたのですが、どうもそうでは無さそうだという現象に出会ったもので。 例えば以下のようなサンプルプログラムがあるとします。 --------------------------------------- class TA { public: void func(int i); }; void TA::func(int i) { static int d=0; d += i; std::cout << d << std::endl; } int main() { for(int i=1; i < 3;i++) { TA ta; ta.func(i); ta.func(i); ta.func(i); } } --------------------------------------- これを実行した時、自分としては 1 2 3 2 4 6 という結果を期待していた訳ですが、実際には 1 2 3 5 7 9 という結果になりました。 ということは、もしかしてメンバ変数ではなくともクラス内に現れるstatic変数はstaticなメンバ変数と同等ということなのでしょうか? 実際、上記ソースのforループ内にもう一つclass TAのインスタンスtbを追加してみると、 --------------------------------------- for(int i=1; i < 3;i++) { TA ta; ta.func(i); ta.func(i); ta.func(i); TA tb; tb.func(i); tb.func(i); tb.func(i); } --------------------------------------- 1 2 3 4 5 6 8 10 12 14 16 18 となりました。 (まぁstaticではないメンバ変数に置き換えれば一応解決するのですが、個人的に何か凄く気持ち悪く感じて・・・)

  • Java main関数内でStatic変数使えない

    JavaのStatic変数について質問です。 Main関数の中でStaticな変数を定義しようとしたところ、 final修飾子しか使えませんというエラー文言が出ます。 Main関数内でわざわざStatic変数を使用する必要はないのですが、 出来ないと言われると何故だろうと思ってしまいます。 どなたかご説明いただけないでしょうか? -------------------------------------------------------------------- class Test { public static void main(String[] args) { // 宣言時Staticは使えなく、finalでしか定義できないとエラーが出る Static int test_val = 10; // 表示 System.out.println(test_val); } }

    • ベストアンサー
    • Java
  • サーブレッドでのローカル変数はスレッドセーフだと聞きましたが、

    サーブレッドでのローカル変数はスレッドセーフだと聞きましたが、 オブジェクト型のローカル変数にもそれは当てはまるのでしょうか。 例えば下記の実行クラスにユーザAとユーザBが同時にアクセスした場合、どうなるのでしょうか。 手順 (1)ユーザAが実行クラスのtestMethodを実行し、TestBean.setNameメソッドで名前をセットする (2)その直後にユーザBがtestMethodを実行し、TestBean.setNameメソッドで名前をセットする (3)ユーザAがセットした名前はユーザBに上書きされてしまうのか? ------------------------------------------------- ○実行クラス public class TestClass{   public String testMethod(){     TestBean testBean = new TestBean();     testBean.setName("テスト太郎");     return testBean;   } } ------------------------------------------------- ○呼び出されるBeanクラス public class TestBean{   private String name = null;     public void setName(String name){     this.name = name;   } } ------------------------------------------------- わかり難い説明で申し訳ないのですが、教えていただけないでしょうか。

    • ベストアンサー
    • Java
  • javaのローカル変数について

    基本的なことの質問ですがよろしくお願いいたします。 下記の様なソースコードでint y ;はローカル変数にあたると思いますが 確かローカル変数は初期化されないとコンパイルエラーになるはずなのですが どうもコンパイルも実行もできます。 どうしてでしょうか? よろしくお願いいたします。 class Test1{ static int x = 0; } public class Test extends Test1{ public static void main(String args[]){ Test i = new Test(); int y ; y = ++x; System.out.println( y ) ; } }

    • ベストアンサー
    • Java
  • 違うクラスからの変数の共有化

    一つのクラスの中にある変数の値を、二つの別なクラスから呼び出して、その二つのクラスのどちらから変数を参照しても同じ値が帰ってくるようにしたいのですが、いろいろ調べてもできなかったので質問させていただきますm(_ _)m // 共有化させたい変数を持つクラス // Var.java public class Var{  public static int i;  public Var(int i){ this.i = i; }  public Var(){}  public static void getI(){   return i;  } } //クラス1 //Class1.java public class Class1{  Var var = new Var(1); } //クラス2 //Class2.java public class Class2{  Var var = new Var();  System.out.println(var.getI()); } とした場合、Class1を実行し、次にClass2を実行すると、クラス1で定義した変数の値である 1 が戻ってくるようにしたいのですが、上記の方法では、Class2を実行すると結果は 0 になってしまいました。 まだまだ習い始めたばかりでいまいちstaticを使い切れていないと思います・・・ たとえば、PrintStreamクラスの public static final PrintStream out というのはどこから参照しても同じ結果なのでそのようなやり方で大丈夫だろうと思ったのですが・・・ このような方法では共有化させることはできないのでしょうか?またできないのでしたらほかのやり方がもしあった場合は教えていただきたいと思います。 どうかお願いします。

    • ベストアンサー
    • Java
  • SAStrutsでServiceのStatic変数

    SAStrutsでServiceのStatic変数の動作で疑問があります。 Eclipse+TomcatでサンプルWebアプリを作成し、以下のサービスをActionから呼び出しています。 これは、Staticなint型の変数に、インスタンスを生成した回数を格納する物です。 public class SampleService{ private static int instanceCnt = 0; public SampleService(){ instanceCnt++; System.out.println(instanceCnt); } } これを何度も呼び出すと、何故かある時突然、出力する数値が1にリセットされるのです。 Static変数はスレッド間で共通で使われているはずなので、これは起こらないはずではないでしょうか? 考えられるとすれば、Tomcatが複数のJavaVMを呼び出して、Webアプリケーションを実行しているのでは、と思うのですが、いまいち確信が持てないのです。 なぜこういう事が起こるのか、詳しい方、教えてもらえないでしょうか。

    • ベストアンサー
    • Java
  • クラスメソッドのみのクラスのオブジェクト生成は不可??

    あるテキストのjavaの問題です。 public class Draw{   static void pixel(int x,int y){     /*座標(x、y)に点を描画*/   }   static void line(int x1,int y1,int x2,int y2){     /*座標(x1、y1)~(x2、y2)に線を引く*/   } } で、これを実行するための以下のようなクラス public class TestDraw{ <ここに入力> } という問題なのですが2つまでは絞れたのですが、 (1) public static void main(String args[]){   Draw d = new Draw().line(10,10,20,30); } ↑× (2) public static void main(String args[]){   Draw.line(10,10,20,30); } ↑○ (2)はlineメソッドがstaticメソッドだからオブジェクト生成しなくても良い、ということなんですが (1)も正解のような気がするのですが・・・ 解説によると「lineはvoidなのでnew Draw().line(10,10,20,30);とすれば正解、とあります。 どうもいまいち理解できません。 クラスメソッドはオブジェクト生成しなくとも良い→オブジェクト生成できない ということなのでしょうか? それからちなみに、public classって2つ記述できないんではありませんでしたか?

    • ベストアンサー
    • Java
  • C# 例外が発生しないことの保障

    Javaと比較して書きます。 Javaで記述した場合: public class JavaClass {  public static SampleClass s = new SampleClass(); } C#で記述した場合: public class CSharpClass {  public static SampleClass s = new SampleClass(); } JavaでもC#でも、同じコードを記述しているように見えますが、Javaではnew SampleClass()コンストラクタで例外が発生しない事が分かっているのに対して、C#の場合では例外が発生しないとは言い切れません。 これは、Javaでは、例外をスローする可能性のあるメソッド宣言では、その全てについてthrows宣言をしなければいけないのに対して、C#にはこの制約が存在しないことが原因です。 これについて何が困るかといいますと、C#で、static宣言な変数や静的コンストラクタで安易にメソッド呼び出し等を行うと、キャッチできなくなってしまいます。 public class Exceptionner {  public Exceptionner()  {   throw new ApplicationException("Exceptionnerクラスの例外");  } } public class SampleClass {  public static Exceptionner e = new Exceptionner(); // ここで例外が発生するが、キャッチできない。 } public class MyEntryPoint {  public static void Main()  {   try   {    SampleClass s = new SampleClass();   }   catch (Exception e)   {    // System.ApplicationExceptionでなくSystem.TypeInitializationExceptionとなる。    // つまり、元の例外の情報は失われている    Console.WriteLine(e.GetType());   }  } } これを現在漠然と問題視していますが、何かよい解決策はありませんでしょうか。 望んでいる解決策: ・C#でもメソッドが例外を返さないという保障がソースレベルでメソッドやコンストラクタに宣言可能? ・C#では例外をちゃんとキャッチしなくてもスマートに記述することが可能? ・問題視する必要がない?(whyも含めて)

  • staticオブジェクト内の変数

    staticなオブジェクト内のローカル変数は、スレッドセーフだと思うのですが、あっていますでしょうか。 例えば、以下の myfoo変数内の、data変数のようなケースです。 public class foobase() { private static foo myfoo = new foo(); . . } public void foo() { String data = "Hello"; }

    • ベストアンサー
    • Java

専門家に質問してみよう